lib: clean up persisted signals when they are settled · nodejs/node@fd55d3c

@@ -96,8 +96,21 @@ const dependantSignalsCleanupRegistry = new SafeFinalizationRegistry((signalWeak

9696

}

9797

});

9898

});

99+99100

const gcPersistentSignals = new SafeSet();

100101102+

const sourceSignalsCleanupRegistry = new SafeFinalizationRegistry(({ sourceSignalRef, composedSignalRef }) => {

103+

const composedSignal = composedSignalRef.deref();

104+

if (composedSignal !== undefined) {

105+

composedSignal[kSourceSignals].delete(sourceSignalRef);

106+107+

if (composedSignal[kSourceSignals].size === 0) {

108+

// This signal will no longer abort. There's no need to keep it in the gcPersistentSignals set.

109+

gcPersistentSignals.delete(composedSignal);

110+

}

111+

}

112+

});

113+101114

const kAborted = Symbol('kAborted');

102115

const kReason = Symbol('kReason');

103116

const kCloneData = Symbol('kCloneData');

@@ -260,6 +273,10 @@ class AbortSignal extends EventTarget {

260273

resultSignal[kSourceSignals].add(signalWeakRef);

261274

signal[kDependantSignals].add(resultSignalWeakRef);

262275

dependantSignalsCleanupRegistry.register(resultSignal, signalWeakRef);

276+

sourceSignalsCleanupRegistry.register(signal, {

277+

sourceSignalRef: signalWeakRef,

278+

composedSignalRef: resultSignalWeakRef,

279+

});

263280

} else if (!signal[kSourceSignals]) {

264281

continue;

265282

} else {

@@ -277,6 +294,10 @@ class AbortSignal extends EventTarget {

277294

resultSignal[kSourceSignals].add(sourceSignalWeakRef);

278295

sourceSignal[kDependantSignals].add(resultSignalWeakRef);

279296

dependantSignalsCleanupRegistry.register(resultSignal, sourceSignalWeakRef);

297+

sourceSignalsCleanupRegistry.register(signal, {

298+

sourceSignalRef: sourceSignalWeakRef,

299+

composedSignalRef: resultSignalWeakRef,

300+

});

280301

}

281302

}

282303

}

@@ -436,6 +457,7 @@ class AbortController {

436457

*/

437458

get signal() {

438459

this.#signal ??= new AbortSignal(kDontThrowSymbol);

460+439461

return this.#signal;

440462

}

441463