Skip to content

Commit 5a66e1a

Browse files
committed
Replaced OnNodeShift with OnDynamicNodeAttach/Detach.
1 parent 584ab20 commit 5a66e1a

13 files changed

Lines changed: 182 additions & 107 deletions

include/react/graph/ConversionNodes.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,10 @@ class EventFlattenNode : public EventStreamNode<D, TInner>
450450
// Topology has been changed
451451
auto oldInner = inner_;
452452
inner_ = newInner;
453-
Engine::OnNodeShift(*this, *oldInner, *newInner, turn);
453+
454+
Engine::OnDynamicNodeDetach(*this, *oldInner, turn);
455+
Engine::OnDynamicNodeAttach(*this, *newInner, turn);
456+
454457
return ETickResult::invalidated;
455458
}
456459

include/react/graph/SignalNodes.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,10 @@ class FlattenNode : public SignalNode<D,TInner>
313313
// Topology has been changed
314314
auto oldInner = inner_;
315315
inner_ = newInner;
316-
Engine::OnNodeShift(*this, *oldInner, *newInner, turn);
316+
317+
Engine::OnDynamicNodeDetach(*this, *oldInner, turn);
318+
Engine::OnDynamicNodeAttach(*this, *newInner, turn);
319+
317320
return ETickResult::invalidated;
318321
}
319322

include/react/interface/IReactiveEngine.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ struct IReactiveEngine
3939
void OnNodePulse(NodeInterface& node, TurnInterface& turn) {}
4040
void OnNodeIdlePulse(NodeInterface& node, TurnInterface& turn) {}
4141

42-
void OnNodeShift(NodeInterface& node, NodeInterface& oldParent, NodeInterface& newParent, TurnInterface& turn) {}
42+
//void OnNodeShift(NodeInterface& node, NodeInterface& oldParent, NodeInterface& newParent, TurnInterface& turn) {}
43+
44+
void OnDynamicNodeAttach(NodeInterface& node, NodeInterface& parent, TurnInterface& turn) {}
45+
void OnDynamicNodeDetach(NodeInterface& node, NodeInterface& parent, TurnInterface& turn) {}
4346

4447
template <typename F>
4548
bool TryMerge(F&& f) { return false; }
@@ -100,10 +103,14 @@ struct EngineInterface
100103
Engine().OnNodeIdlePulse(node, turn);
101104
}
102105

103-
static void OnNodeShift(NodeInterface& node, NodeInterface& oldParent, NodeInterface& newParent, TurnInterface& turn)
106+
static void OnDynamicNodeAttach(NodeInterface& node, NodeInterface& parent, TurnInterface& turn)
107+
{
108+
Engine().OnDynamicNodeAttach(node, parent, turn);
109+
}
110+
111+
static void OnDynamicNodeDetach(NodeInterface& node, NodeInterface& parent, TurnInterface& turn)
104112
{
105-
D::Log().template Append<NodeInvalidateEvent>(GetObjectId(node), GetObjectId(oldParent), GetObjectId(newParent), turn.Id());
106-
Engine().OnNodeShift(node, oldParent, newParent, turn);
113+
Engine().OnDynamicNodeDetach(node, parent, turn);
107114
}
108115

109116
static void OnTurnAdmissionStart(TurnInterface& turn)

include/react/propagation/ELMEngine.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ class EngineBase : public IReactiveEngine<Node,TTurn>
7777
void OnNodePulse(Node& node, TTurn& turn);
7878
void OnNodeIdlePulse(Node& node, TTurn& turn);
7979

80-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
80+
void OnDynamicNodeAttach(Node& node, Node& parent, TTurn& turn);
81+
void OnDynamicNodeDetach(Node& node, Node& parent, TTurn& turn);
8182

8283
private:
8384
void processChild(Node& node, bool update, TTurn& turn);

include/react/propagation/FloodingEngine.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ class EngineBase : public IReactiveEngine<Node,TTurn>
7878
void OnTurnPropagate(TTurn& turn);
7979

8080
void OnNodePulse(Node& node, TTurn& turn);
81-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
81+
82+
void OnDynamicNodeAttach(Node& node, Node& parent, TTurn& turn);
83+
void OnDynamicNodeDetach(Node& node, Node& parent, TTurn& turn);
8284

8385
private:
8486
using OutputMutexT = queuing_mutex;

include/react/propagation/PulseCountEngine.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ class EngineBase : public IReactiveEngine<Node,TTurn>
7373
void OnNodePulse(Node& node, TTurn& turn);
7474
void OnNodeIdlePulse(Node& node, TTurn& turn);
7575

76-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
76+
void OnDynamicNodeAttach(Node& node, Node& parent, TTurn& turn);
77+
void OnDynamicNodeDetach(Node& node, Node& parent, TTurn& turn);
7778

7879
private:
7980
void runInitReachableNodesTask(NodeVectorT leftNodes);

include/react/propagation/SourceSetEngine.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,12 @@ class Node : public IReactiveNode
6868
void AttachSuccessor(Node& node);
6969
void DetachSuccessor(Node& node);
7070

71+
void DynamicAttachTo(Node& parent, Turn& turn);
72+
void DynamicDetachFrom(Node& parent, Turn& turn);
73+
7174
void Destroy();
7275

7376
void Pulse(Turn& turn, bool updated);
74-
void Shift(Node& oldParent, Node& newParent, Turn& turn);
7577

7678
bool IsDependency(Turn& turn);
7779
bool CheckCurrentTurn(Turn& turn);
@@ -123,7 +125,9 @@ class EngineBase : public IReactiveEngine<Node,TTurn>
123125

124126
void OnNodePulse(Node& node, TTurn& turn);
125127
void OnNodeIdlePulse(Node& node, TTurn& turn);
126-
void OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn);
128+
129+
void OnDynamicNodeAttach(Node& node, Node& parent, TTurn& turn);
130+
void OnDynamicNodeDetach(Node& node, Node& parent, TTurn& turn);
127131

128132
private:
129133
vector<Node*> changedInputs_;

include/react/propagation/TopoSortEngine.h

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ class ParNode : public IReactiveNode
7373
////////////////////////////////////////////////////////////////////////////////////////
7474
/// ShiftRequestData
7575
////////////////////////////////////////////////////////////////////////////////////////
76-
struct ShiftRequestData
76+
struct DynRequestData
7777
{
78-
ParNode* ShiftingNode;
79-
ParNode* OldParent;
80-
ParNode* NewParent;
78+
bool ShouldAttach;
79+
ParNode* Node;
80+
ParNode* Parent;
8181
};
8282

8383
////////////////////////////////////////////////////////////////////////////////////////
@@ -122,7 +122,9 @@ class SeqEngineBase : public EngineBase<SeqNode,TTurn>
122122
{
123123
public:
124124
void OnTurnPropagate(TTurn& turn);
125-
void OnNodeShift(SeqNode& node, SeqNode& oldParent, SeqNode& newParent, TTurn& turn);
125+
126+
void OnDynamicNodeAttach(SeqNode& node, SeqNode& parent, TTurn& turn);
127+
void OnDynamicNodeDetach(SeqNode& node, SeqNode& parent, TTurn& turn);
126128

127129
private:
128130
virtual void processChildren(SeqNode& node, TTurn& turn) override;
@@ -135,19 +137,22 @@ template <typename TTurn>
135137
class ParEngineBase : public EngineBase<ParNode,TTurn>
136138
{
137139
public:
138-
using ConcNodeVectorT = concurrent_vector<ParNode*>;
139-
using ShiftRequestVectorT = concurrent_vector<ShiftRequestData>;
140+
using ConcNodeVectT = concurrent_vector<ParNode*>;
141+
using DynRequestVectT = concurrent_vector<DynRequestData>;
140142

141143
void OnTurnPropagate(TTurn& turn);
142-
void OnNodeShift(ParNode& node, ParNode& oldParent, ParNode& newParent, TTurn& turn);
144+
145+
void OnDynamicNodeAttach(ParNode& node, ParNode& parent, TTurn& turn);
146+
void OnDynamicNodeDetach(ParNode& node, ParNode& parent, TTurn& turn);
143147

144148
private:
145-
void applyShift(ParNode& node, ParNode& oldParent, ParNode& newParent, TTurn& turn);
149+
void applyDynamicAttach(ParNode& node, ParNode& parent, TTurn& turn);
150+
void applyDynamicDetach(ParNode& node, ParNode& parent, TTurn& turn);
146151

147152
virtual void processChildren(ParNode& node, TTurn& turn) override;
148153

149-
ConcNodeVectorT collectBuffer_;
150-
ShiftRequestVectorT shiftRequests_;
154+
ConcNodeVectT collectBuffer_;
155+
DynRequestVectT dynRequests_;
151156
};
152157

153158
////////////////////////////////////////////////////////////////////////////////////////
@@ -165,10 +170,10 @@ class QueuingParEngine : public DefaultQueuingEngine<ParEngineBase,ExclusiveTurn
165170
class PipeliningTurn : public TurnBase
166171
{
167172
public:
168-
using ConcNodeVectorT = concurrent_vector<ParNode*>;
173+
using ConcNodeVectT = concurrent_vector<ParNode*>;
169174
using NodeVectT = vector<ParNode*>;
170175
using IntervalSetT = set<pair<int,int>>;
171-
using ShiftRequestVectorT = concurrent_vector<ShiftRequestData>;
176+
using DynRequestVectT = concurrent_vector<DynRequestData>;
172177
using TopoQueueT = TopoQueue<ParNode>;
173178

174179
PipeliningTurn(TurnIdT id, TurnFlagsT flags);
@@ -213,8 +218,8 @@ class PipeliningTurn : public TurnBase
213218
void RunMergedInputs() const;
214219

215220
TopoQueueT ScheduledNodes;
216-
ConcNodeVectorT CollectBuffer;
217-
ShiftRequestVectorT ShiftRequests;
221+
ConcNodeVectT CollectBuffer;
222+
DynRequestVectT DynRequests;
218223
task_group Tasks;
219224

220225
private:
@@ -259,7 +264,8 @@ class PipeliningEngine : public IReactiveEngine<ParNode,PipeliningTurn>
259264

260265
void OnTurnPropagate(PipeliningTurn& turn);
261266

262-
void OnNodeShift(ParNode& node, ParNode& oldParent, ParNode& newParent, PipeliningTurn& turn);
267+
void OnDynamicNodeAttach(ParNode& node, ParNode& parent, PipeliningTurn& turn);
268+
void OnDynamicNodeDetach(ParNode& node, ParNode& parent, PipeliningTurn& turn);
263269

264270
template <typename F>
265271
inline bool TryMerge(F&& inputFunc)
@@ -282,7 +288,9 @@ class PipeliningEngine : public IReactiveEngine<ParNode,PipeliningTurn>
282288
}
283289

284290
private:
285-
void applyShift(ParNode& node, ParNode& oldParent, ParNode& newParent, PipeliningTurn& turn);
291+
void applyDynamicAttach(ParNode& node, ParNode& parent, PipeliningTurn& turn);
292+
void applyDynamicDetach(ParNode& node, ParNode& parent, PipeliningTurn& turn);
293+
286294
void processChildren(ParNode& node, PipeliningTurn& turn);
287295
void invalidateSuccessors(ParNode& node);
288296

src/react/propagation/ELMEngine.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,16 @@ void EngineBase<TTurn>::OnNodeIdlePulse(Node& node, TTurn& turn)
9292
}
9393

9494
template <typename TTurn>
95-
void EngineBase<TTurn>::OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn)
95+
void EngineBase<TTurn>::OnDynamicNodeAttach(Node& node, Node& parent, TTurn& turn)
9696
{
9797
bool shouldTick = false;
9898

99-
{// oldParent.ShiftMutex
100-
NodeShiftMutexT::scoped_lock lock(oldParent.ShiftMutex);
101-
102-
oldParent.Successors.Remove(node);
103-
}// ~oldParent.ShiftMutex
104-
105-
{// newParent.ShiftMutex
106-
NodeShiftMutexT::scoped_lock lock(newParent.ShiftMutex);
99+
{// parent.ShiftMutex
100+
NodeShiftMutexT::scoped_lock lock(parent.ShiftMutex);
107101

108-
newParent.Successors.Add(node);
102+
parent.Successors.Add(node);
109103

110-
if (newParent.LastTurnId == turn.Id())
104+
if (parent.LastTurnId == turn.Id())
111105
{
112106
shouldTick = true;
113107
}
@@ -116,12 +110,20 @@ void EngineBase<TTurn>::OnNodeShift(Node& node, Node& oldParent, Node& newParent
116110
node.ShouldUpdate = true;
117111
node.Counter = node.DependencyCount() - 1;
118112
}
119-
}// ~newParent.ShiftMutex
113+
}// ~parent.ShiftMutex
120114

121115
if (shouldTick)
122116
node.Tick(&turn);
123117
}
124118

119+
template <typename TTurn>
120+
void EngineBase<TTurn>::OnDynamicNodeDetach(Node& node, Node& parent, TTurn& turn)
121+
{// parent.ShiftMutex
122+
NodeShiftMutexT::scoped_lock lock(parent.ShiftMutex);
123+
124+
parent.Successors.Remove(node);
125+
}// ~parent.ShiftMutex
126+
125127
template <typename TTurn>
126128
void EngineBase<TTurn>::processChild(Node& node, bool update, TTurn& turn)
127129
{

src/react/propagation/FloodingEngine.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,25 +117,27 @@ void EngineBase<TTurn>::OnNodePulse(Node& node, TTurn& turn)
117117
}
118118

119119
template <typename TTurn>
120-
void EngineBase<TTurn>::OnNodeShift(Node& node, Node& oldParent, Node& newParent, TTurn& turn)
120+
void EngineBase<TTurn>::OnDynamicNodeAttach(Node& node, Node& parent, TTurn& turn)
121121
{
122-
{// oldParent.ShiftMutex
123-
NodeShiftMutexT::scoped_lock lock(oldParent.ShiftMutex);
124-
125-
oldParent.Successors.Remove(node);
126-
}// ~oldParent.ShiftMutex
127-
128-
{// newParent.ShiftMutex
129-
NodeShiftMutexT::scoped_lock lock(newParent.ShiftMutex);
122+
{// parent.ShiftMutex
123+
NodeShiftMutexT::scoped_lock lock(parent.ShiftMutex);
130124

131-
newParent.Successors.Add(node);
132-
}// ~newParent.ShiftMutex
125+
parent.Successors.Add(node);
126+
}// ~parent.ShiftMutex
133127

134128
// Called from Tick, so we already have exclusive access to the node.
135129
// Just tick again to recalc the value.
136130
node.Tick(&turn);
137131
}
138132

133+
template <typename TTurn>
134+
void EngineBase<TTurn>::OnDynamicNodeDetach(Node& node, Node& parent, TTurn& turn)
135+
{// parent.ShiftMutex
136+
NodeShiftMutexT::scoped_lock lock(parent.ShiftMutex);
137+
138+
parent.Successors.Remove(node);
139+
}// ~parent.ShiftMutex
140+
139141
template <typename TTurn>
140142
void EngineBase<TTurn>::pulse(Node& node, TTurn& turn)
141143
{// node.ShiftMutex

0 commit comments

Comments
 (0)