Skip to content

Commit c11785e

Browse files
committed
lib: handle composed signals finalization
1 parent 9d3074e commit c11785e

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

lib/internal/abort_controller.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ const dependantSignalsCleanupRegistry = new SafeFinalizationRegistry((signalWeak
9898

9999
const gcPersistentSignals = new SafeSet();
100100

101-
const finalizer = new SafeFinalizationRegistry(({ sourceSignalRef, composedSignalRef }) => {
101+
const sourceSignalsCleanupRegistry = new SafeFinalizationRegistry(({ sourceSignalRef, composedSignalRef }) => {
102102
const composedSignal = composedSignalRef.deref();
103103
if (composedSignal !== undefined) {
104104
composedSignal[kSourceSignals].delete(sourceSignalRef);
@@ -271,7 +271,10 @@ class AbortSignal extends EventTarget {
271271
resultSignal[kSourceSignals].add(signalWeakRef);
272272
signal[kDependantSignals].add(resultSignalWeakRef);
273273
dependantSignalsCleanupRegistry.register(resultSignal, signalWeakRef);
274-
finalizer.register(signal, { sourceSignalRef: signalWeakRef, composedSignalRef: resultSignalWeakRef });
274+
sourceSignalsCleanupRegistry.register(signal, {
275+
sourceSignalRef: signalWeakRef,
276+
composedSignalRef: resultSignalWeakRef,
277+
});
275278
} else if (!signal[kSourceSignals]) {
276279
continue;
277280
} else {
@@ -289,6 +292,10 @@ class AbortSignal extends EventTarget {
289292
resultSignal[kSourceSignals].add(sourceSignalWeakRef);
290293
sourceSignal[kDependantSignals].add(resultSignalWeakRef);
291294
dependantSignalsCleanupRegistry.register(resultSignal, sourceSignalWeakRef);
295+
sourceSignalsCleanupRegistry.register(signal, {
296+
sourceSignalRef: sourceSignalWeakRef,
297+
composedSignalRef: resultSignalWeakRef,
298+
});
292299
}
293300
}
294301
}

test/parallel/test-abortsignal-drop-settled-signals.mjs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ function runWithOrphanListeners(limit, done) {
8686
composedSignalRef = new WeakRef(AbortSignal.any([ac.signal]));
8787
composedSignalRef.deref().addEventListener('abort', handler);
8888

89-
composedSignalRefs.push(composedSignalRef);
89+
const otherComposedSignalRef = new WeakRef(AbortSignal.any([composedSignalRef.deref()]));
90+
otherComposedSignalRef.deref().addEventListener('abort', handler);
91+
92+
composedSignalRefs.push(composedSignalRef, otherComposedSignalRef);
9093

9194
setImmediate(() => {
9295
run(iteration + 1);
@@ -157,12 +160,18 @@ it('drops settled signals even when there are listeners', (t, done) => {
157160
runWithOrphanListeners(limit, (signalRefs) => {
158161
setImmediate(() => {
159162
global.gc();
163+
setImmediate(() => {
164+
global.gc(); // One more call needed to clean up the deeper composed signals
165+
setImmediate(() => {
166+
global.gc(); // One more call needed to clean up the deeper composed signals
160167

161-
const unGCedSignals = [...signalRefs].filter((ref) => ref.deref());
168+
const unGCedSignals = [...signalRefs].filter((ref) => ref.deref());
162169

163-
t.assert.strictEqual(unGCedSignals.length, 0);
170+
t.assert.strictEqual(unGCedSignals.length, 0);
164171

165-
done();
172+
done();
173+
});
174+
});
166175
});
167176
});
168177
});

0 commit comments

Comments
 (0)