Skip to content

Commit 62ca456

Browse files
committed
fourth attempt
1 parent 271c0bb commit 62ca456

3 files changed

Lines changed: 34 additions & 71 deletions

File tree

driver-core/src/main/com/mongodb/internal/async/function/AsyncCallbackLoop.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import com.mongodb.annotations.NotThreadSafe;
1919
import com.mongodb.internal.async.SingleResultCallback;
20-
import com.mongodb.internal.async.function.CallbackChain.Element;
2120
import com.mongodb.lang.Nullable;
2221

2322
import java.util.function.Supplier;
@@ -63,21 +62,35 @@ public void run(final SingleResultCallback<Void> callback) {
6362

6463
private static final class Body {
6564
private final AsyncCallbackRunnable wrapped;
66-
@Nullable
67-
private final CallbackChain chain;
65+
private final boolean optimized;
66+
private boolean executingChain;
6867

6968
private Body(final boolean optimized, final AsyncCallbackRunnable body) {
7069
this.wrapped = body;
71-
this.chain = optimized ? new CallbackChain() : null;
70+
this.optimized = optimized;
71+
executingChain = false;
7272
}
7373

7474
@Nullable
7575
Element run(final LoopingCallback loopingCallback) {
7676
Element[] mutableElement = new Element[1];
7777
wrapped.run((r, t) -> {
78-
Element nextCallbackToComplete = loopingCallback.onResult(r, t);
79-
if (!CallbackChain.execute(chain, nextCallbackToComplete)) {
80-
mutableElement[0] = nextCallbackToComplete;
78+
Element element = loopingCallback.onResult(r, t);
79+
if (!optimized && element != null) {
80+
element.execute();
81+
return;
82+
}
83+
if (element == null || executingChain) {
84+
mutableElement[0] = element;
85+
} else {
86+
executingChain = true;
87+
try {
88+
do {
89+
element = element.execute();
90+
} while (element != null);
91+
} finally {
92+
executingChain = false;
93+
}
8194
}
8295
});
8396
return mutableElement[0];
@@ -117,4 +130,9 @@ public Element onResult(@Nullable final Void result, @Nullable final Throwable t
117130
}
118131
}
119132
}
133+
134+
interface Element {
135+
@Nullable
136+
Element execute();
137+
}
120138
}

driver-core/src/main/com/mongodb/internal/async/function/CallbackChain.java

Lines changed: 0 additions & 61 deletions
This file was deleted.

driver-core/src/test/unit/com/mongodb/internal/async/VakoTest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@
3434

3535
class VakoTest {
3636
@ParameterizedTest
37-
@CsvSource({"false, 30", "true, 30"})
37+
@CsvSource({
38+
"false, 30",
39+
"true, 30"
40+
})
3841
void asyncCallbackLoop(final boolean optimized, final int iterations) throws Exception {
3942
System.err.printf("baselineStackDepth=%d%n", Thread.currentThread().getStackTrace().length);
4043
CompletableFuture<Void> join = new CompletableFuture<>();
@@ -59,8 +62,11 @@ void asyncCallbackLoop(final boolean optimized, final int iterations) throws Exc
5962

6063
@ParameterizedTest
6164
@CsvSource({
62-
"false, false, 30", "false, true, 30",
63-
"true, false, 30", "true, true, 30"})
65+
"false, false, 30",
66+
"false, true, 30",
67+
"true, false, 30",
68+
"true, true, 30"
69+
})
6470
void testThenRunDoWhileLoop(final boolean optimized, final boolean separateThread, final int counterInitialValue) throws Exception {
6571
StartTime start = StartTime.now();
6672
System.err.printf("baselineStackDepth=%d%n", Thread.currentThread().getStackTrace().length);

0 commit comments

Comments
 (0)