Skip to content

Instantly share code, notes, and snippets.

@mhofman
Last active April 15, 2019 18:41
Show Gist options
  • Save mhofman/c35078324ad088ac3dfeeefa70751b34 to your computer and use it in GitHub Desktop.
Save mhofman/c35078324ad088ac3dfeeefa70751b34 to your computer and use it in GitHub Desktop.
V8 while await loop scope optimization issue. See https://bugs.chromium.org/p/v8/issues/detail?id=9101
function makeObserver(): [Promise<boolean>, FinalizationGroup<any>] {
let resolve: (collected: boolean) => void;
const collected = new Promise<boolean>(r => (resolve = r));
const finalizationGroup = new FinalizationGroup<any>(items => {
// Let's be nice and cleanup
[...items];
resolve(true);
});
return [collected, finalizationGroup];
}
async function gcOf_fail(target?: object): Promise<boolean> {
const [collected, finalizationGroup] = makeObserver();
finalizationGroup.register(target || {}, 0);
target = undefined;
let result: boolean | undefined;
while (true) {
result = await Promise.race([
collected,
new Promise<undefined>(resolve => setTimeout(resolve, 0))
]);
if (result !== undefined) break;
gc();
}
return result;
}
async function gcOf_success(target?: object): Promise<boolean> {
const [collected, finalizationGroup] = makeObserver();
finalizationGroup.register(target || {}, 0);
target = undefined;
let result: boolean | undefined;
while (
(result = await Promise.race([
collected,
new Promise<undefined>(resolve => setTimeout(resolve, 0))
])) === undefined
) {
gc();
}
return result;
}
function makeObserver(): [{ collected: boolean }, FinalizationGroup<any>] {
let token = { collected: false };
const finalizationGroup = new FinalizationGroup<any>(items => {
// Let's be nice and cleanup
[...items];
token.collected = true;
});
return [token, finalizationGroup];
}
async function gcOf_fail(target?: object): Promise<boolean> {
const [token, finalizationGroup] = makeObserver();
finalizationGroup.register(target || {}, 0);
target = undefined;
while (!token.collected) {
await new Promise<undefined>(resolve => setTimeout(resolve, 0));
gc();
}
return token.collected;
}
async function gcOf_success(target?: object): Promise<boolean> {
const [token, finalizationGroup] = makeObserver();
finalizationGroup.register(target || {}, 0);
target = undefined;
while ((await new Promise(resolve => setTimeout(resolve, 0)), !token.collected)) {
gc();
}
return token.collected;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment