Skip to content

Commit

Permalink
async_hooks: add an InactiveAsyncContextFrame class
Browse files Browse the repository at this point in the history
This gives a class prototype for AsyncContextFrame that contains the
required methods, so that when we swap the prototype,
ActiveAsyncContextFrame methods are used instead. Previously, the
methods were defined in AsyncContextFrame, so swapping the prototype
didn't swap those static methods.

Also, make the ActiveAsyncContextFrame extend from Map.

Fixes: nodejs#54503
PR-URL: nodejs#54510
Reviewed-By: Rich Trott <[email protected]>
Reviewed-By: Yagiz Nizipli <[email protected]>
Reviewed-By: Stephen Belanger <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Mohammed Keyvanzadeh <[email protected]>
Reviewed-By: Gerhard Stöbich <[email protected]>
  • Loading branch information
bengl authored and tpoisseau committed Nov 21, 2024
1 parent e525eb0 commit df4b7ba
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 8 deletions.
16 changes: 9 additions & 7 deletions lib/internal/async_context_frame.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const {

let enabled_;

class ActiveAsyncContextFrame {
class ActiveAsyncContextFrame extends Map {
static get enabled() {
return true;
}
Expand Down Expand Up @@ -50,12 +50,7 @@ function checkEnabled() {
return enabled;
}

class AsyncContextFrame extends Map {
constructor(store, data) {
super(AsyncContextFrame.current());
this.set(store, data);
}

class InactiveAsyncContextFrame extends Map {
static get enabled() {
enabled_ ??= checkEnabled();
return enabled_;
Expand All @@ -65,6 +60,13 @@ class AsyncContextFrame extends Map {
static set(frame) {}
static exchange(frame) {}
static disable(store) {}
}

class AsyncContextFrame extends InactiveAsyncContextFrame {
constructor(store, data) {
super(AsyncContextFrame.current());
this.set(store, data);
}

disable(store) {
this.delete(store);
Expand Down
4 changes: 3 additions & 1 deletion test/parallel/test-async-context-frame.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { opendir } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import { describe, it } from 'node:test';
import { sep } from 'node:path';
import { strictEqual } from 'node:assert';

const python = process.env.PYTHON || (isWindows ? 'python' : 'python3');

Expand Down Expand Up @@ -53,7 +54,8 @@ describe('AsyncContextFrame', {
stdio: ['ignore', 'ignore', 'inherit'],
});

await once(proc, 'exit');
const [code] = await once(proc, 'exit');
strictEqual(code, 0, `Test ${test} failed with exit code ${code}`);
});
}
});

0 comments on commit df4b7ba

Please sign in to comment.