Skip to content

Commit 10761eb

Browse files
committed
Store children in a state, and destroy finished reactors
1 parent c21b29b commit 10761eb

File tree

1 file changed

+52
-10
lines changed

1 file changed

+52
-10
lines changed

src/benchmark/quicksort.ts

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ class QuickSorter extends Reactor {
3838
resultArr: State<number[]>;
3939
numFragments: State<number>;
4040

41-
leftReactor: Reactor | undefined;
42-
rightReactor: Reactor | undefined;
41+
leftReactor: State<QuickSorter | undefined>;
42+
rightReactor: State<QuickSorter | undefined>;
4343

4444
constructor(parent: Reactor) {
4545
super(parent);
@@ -52,6 +52,9 @@ class QuickSorter extends Reactor {
5252
this.resultArr = new State([]);
5353
this.numFragments = new State(0);
5454

55+
this.leftReactor = new State(undefined);
56+
this.rightReactor = new State(undefined);
57+
5558
// When the parent sends a message, we send it to children.
5659
this.addMutation(
5760
[this.parentReadPort],
@@ -63,7 +66,9 @@ class QuickSorter extends Reactor {
6366
this.leftReadPort,
6467
this.rightReadPort,
6568
this.resultArr,
66-
this.numFragments
69+
this.numFragments,
70+
this.leftReactor,
71+
this.rightReactor
6772
],
6873
function (
6974
this,
@@ -74,7 +79,9 @@ class QuickSorter extends Reactor {
7479
leftread,
7580
rightread,
7681
resultArr,
77-
numFragments
82+
numFragments,
83+
stateLeftReactor, // This is really cursed, but s_ is to indicate that this is a state
84+
stateRightReactor
7885
) {
7986
const hierarchyImplementation = (
8087
useHierarchy ? this.addChild : this.addSibling
@@ -105,6 +112,9 @@ class QuickSorter extends Reactor {
105112
const leftReactor = hierarchyImplementation(QuickSorter);
106113
const rightReactor = hierarchyImplementation(QuickSorter);
107114

115+
stateLeftReactor.set(leftReactor);
116+
stateRightReactor.set(rightReactor);
117+
108118
// Connect ports accoringly
109119
this.connect(leftWritePort, leftReactor.parentReadPort);
110120
this.connect(rightWritePort, rightReactor.parentReadPort);
@@ -117,17 +127,26 @@ class QuickSorter extends Reactor {
117127
}
118128
);
119129

120-
this.addReaction(
130+
this.addMutation(
121131
[this.leftReadPort],
122132
[
123133
this.leftReadPort,
124134
this.resultArr,
125135
this.numFragments,
126-
this.writable(this.parentWritePort)
136+
this.writable(this.parentWritePort),
137+
this.leftReactor
127138
],
128-
function (this, leftreadport, resultArr, numFragments, parentWrite) {
139+
function (
140+
this,
141+
leftreadport,
142+
resultArr,
143+
numFragments,
144+
parentWrite,
145+
stateLeftReactor
146+
) {
129147
const leftResult = leftreadport.get();
130148
const myResult = resultArr.get();
149+
const leftReactor = stateLeftReactor.get();
131150
if (leftResult == null) {
132151
throw Error("Left return null");
133152
}
@@ -136,28 +155,43 @@ class QuickSorter extends Reactor {
136155
"Result length is 0, but should contain at least the pivots."
137156
);
138157
}
158+
if (leftReactor == null) {
159+
throw Error("Right reactor is null.");
160+
}
139161

140162
console.log(`I received a result from my left! ${leftResult}!`);
141163
resultArr.set([...leftResult, ...myResult]);
142164

165+
this.delete(leftReactor);
166+
stateLeftReactor.set(undefined);
167+
143168
numFragments.set(numFragments.get() + 1);
144169
if (numFragments.get() === 3) {
145170
parentWrite.set(resultArr.get());
146171
}
147172
}
148173
);
149174

150-
this.addReaction(
175+
this.addMutation(
151176
[this.rightReadPort],
152177
[
153178
this.rightReadPort,
154179
this.resultArr,
155180
this.numFragments,
156-
this.writable(this.parentWritePort)
181+
this.writable(this.parentWritePort),
182+
this.rightReactor
157183
],
158-
function (this, rightreadport, resultArr, numFragments, parentWrite) {
184+
function (
185+
this,
186+
rightreadport,
187+
resultArr,
188+
numFragments,
189+
parentWrite,
190+
stateRightReactor
191+
) {
159192
const rightResult = rightreadport.get();
160193
const myResult = resultArr.get();
194+
const rightReactor = stateRightReactor.get();
161195
if (rightResult == null) {
162196
throw Error("Right return null");
163197
}
@@ -166,10 +200,18 @@ class QuickSorter extends Reactor {
166200
"Result length is 0, but should contain at least the pivots."
167201
);
168202
}
203+
if (rightReactor == null) {
204+
throw Error("Right reactor is null.");
205+
}
169206

170207
console.log(`I received a result from my right! ${rightResult}!`);
171208
resultArr.set([...myResult, ...rightResult]);
172209

210+
// Destroy right reactor and the connection
211+
212+
this.delete(rightReactor);
213+
stateRightReactor.set(undefined);
214+
173215
numFragments.set(numFragments.get() + 1);
174216
if (numFragments.get() === 3) {
175217
parentWrite.set(resultArr.get());

0 commit comments

Comments
 (0)