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 <rtrott@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Stephen Belanger <admin@stephenbelanger.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
Reviewed-By: Gerhard Stöbich <deb2001-github@yahoo.de>
  • Loading branch information
bengl committed Aug 30, 2024
1 parent 9bdf2ee commit ef6b9ff
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 ef6b9ff

Please sign in to comment.