mirror of
https://github.com/nodejs/node.git
synced 2025-12-28 07:50:41 +00:00
cli: move --trace-atomics-wait to eol
PR-URL: https://github.com/nodejs/node/pull/52747 Fixes: https://github.com/nodejs/node/issues/42982 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz.nizipli@sentry.io>
This commit is contained in:
parent
c923ce7414
commit
8f37492b65
@ -2156,39 +2156,6 @@ added: v12.0.0
|
||||
Set default [`tls.DEFAULT_MIN_VERSION`][] to 'TLSv1.3'. Use to disable support
|
||||
for TLSv1.2, which is not as secure as TLSv1.3.
|
||||
|
||||
### `--trace-atomics-wait`
|
||||
|
||||
<!-- YAML
|
||||
added: v14.3.0
|
||||
deprecated:
|
||||
- v18.8.0
|
||||
- v16.18.0
|
||||
-->
|
||||
|
||||
> Stability: 0 - Deprecated
|
||||
|
||||
Print short summaries of calls to [`Atomics.wait()`][] to stderr.
|
||||
The output could look like this:
|
||||
|
||||
```text
|
||||
(node:15701) [Thread 0] Atomics.wait(<address> + 0, 1, inf) started
|
||||
(node:15701) [Thread 0] Atomics.wait(<address> + 0, 1, inf) did not wait because the values mismatched
|
||||
(node:15701) [Thread 0] Atomics.wait(<address> + 0, 0, 10) started
|
||||
(node:15701) [Thread 0] Atomics.wait(<address> + 0, 0, 10) timed out
|
||||
(node:15701) [Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
(node:15701) [Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
(node:15701) [Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
(node:15701) [Thread 1] Atomics.wait(<address> + 4, -1, inf) was woken up by another thread
|
||||
```
|
||||
|
||||
The fields here correspond to:
|
||||
|
||||
* The thread id as given by [`worker_threads.threadId`][]
|
||||
* The base address of the `SharedArrayBuffer` in question, as well as the
|
||||
byte offset corresponding to the index passed to `Atomics.wait()`
|
||||
* The expected value that was passed to `Atomics.wait()`
|
||||
* The timeout passed to `Atomics.wait`
|
||||
|
||||
### `--trace-deprecation`
|
||||
|
||||
<!-- YAML
|
||||
@ -2718,7 +2685,6 @@ one is included in the list below.
|
||||
* `--tls-min-v1.1`
|
||||
* `--tls-min-v1.2`
|
||||
* `--tls-min-v1.3`
|
||||
* `--trace-atomics-wait`
|
||||
* `--trace-deprecation`
|
||||
* `--trace-event-categories`
|
||||
* `--trace-event-file-pattern`
|
||||
@ -3181,7 +3147,6 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12
|
||||
[`--print`]: #-p---print-script
|
||||
[`--redirect-warnings`]: #--redirect-warningsfile
|
||||
[`--require`]: #-r---require-module
|
||||
[`Atomics.wait()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait
|
||||
[`Buffer`]: buffer.md#class-buffer
|
||||
[`CRYPTO_secure_malloc_init`]: https://www.openssl.org/docs/man3.0/man3/CRYPTO_secure_malloc_init.html
|
||||
[`NODE_OPTIONS`]: #node_optionsoptions
|
||||
@ -3201,7 +3166,6 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12
|
||||
[`tls.DEFAULT_MIN_VERSION`]: tls.md#tlsdefault_min_version
|
||||
[`unhandledRejection`]: process.md#event-unhandledrejection
|
||||
[`v8.startupSnapshot` API]: v8.md#startup-snapshot-api
|
||||
[`worker_threads.threadId`]: worker_threads.md#workerthreadid
|
||||
[collecting code coverage from tests]: test.md#collecting-code-coverage
|
||||
[conditional exports]: packages.md#conditional-exports
|
||||
[context-aware]: addons.md#context-aware-addons
|
||||
|
||||
@ -3313,6 +3313,9 @@ Values other than `undefined`, `null`, integer numbers, and integer strings
|
||||
|
||||
<!-- YAML
|
||||
changes:
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/52747
|
||||
description: End-of-Life.
|
||||
- version: v22.0.0
|
||||
pr-url: https://github.com/nodejs/node/pull/51179
|
||||
description: Runtime deprecation.
|
||||
@ -3323,9 +3326,9 @@ changes:
|
||||
description: Documentation-only deprecation.
|
||||
-->
|
||||
|
||||
Type: Runtime
|
||||
Type: End-of-Life
|
||||
|
||||
The [`--trace-atomics-wait`][] flag is deprecated because
|
||||
The `--trace-atomics-wait` flag has been removed because
|
||||
it uses the V8 hook `SetAtomicsWaitCallback`,
|
||||
that will be removed in a future V8 release.
|
||||
|
||||
@ -3650,7 +3653,6 @@ is deprecated to better align with recommendations per [NIST SP 800-38D][].
|
||||
[`--force-node-api-uncaught-exceptions-policy`]: cli.md#--force-node-api-uncaught-exceptions-policy
|
||||
[`--pending-deprecation`]: cli.md#--pending-deprecation
|
||||
[`--throw-deprecation`]: cli.md#--throw-deprecation
|
||||
[`--trace-atomics-wait`]: cli.md#--trace-atomics-wait
|
||||
[`--unhandled-rejections`]: cli.md#--unhandled-rejectionsmode
|
||||
[`Buffer.allocUnsafeSlow(size)`]: buffer.md#static-method-bufferallocunsafeslowsize
|
||||
[`Buffer.from(array)`]: buffer.md#static-method-bufferfromarray
|
||||
|
||||
@ -478,11 +478,6 @@ but the option is supported for compatibility with older Node.js versions.
|
||||
Set default minVersion to 'TLSv1.3'. Use to disable support for TLSv1.2 in
|
||||
favour of TLSv1.3, which is more secure.
|
||||
.
|
||||
.It Fl -trace-atomics-wait
|
||||
Print short summaries of calls to
|
||||
.Sy Atomics.wait() .
|
||||
.
|
||||
This flag is deprecated.
|
||||
.It Fl -trace-deprecation
|
||||
Print stack traces for deprecations.
|
||||
.
|
||||
|
||||
49
src/node.cc
49
src/node.cc
@ -214,44 +214,6 @@ void Environment::InitializeInspector(
|
||||
}
|
||||
#endif // HAVE_INSPECTOR
|
||||
|
||||
#define ATOMIC_WAIT_EVENTS(V) \
|
||||
V(kStartWait, "started") \
|
||||
V(kWokenUp, "was woken up by another thread") \
|
||||
V(kTimedOut, "timed out") \
|
||||
V(kTerminatedExecution, "was stopped by terminated execution") \
|
||||
V(kAPIStopped, "was stopped through the embedder API") \
|
||||
V(kNotEqual, "did not wait because the values mismatched") \
|
||||
|
||||
static void AtomicsWaitCallback(Isolate::AtomicsWaitEvent event,
|
||||
Local<v8::SharedArrayBuffer> array_buffer,
|
||||
size_t offset_in_bytes, int64_t value,
|
||||
double timeout_in_ms,
|
||||
Isolate::AtomicsWaitWakeHandle* stop_handle,
|
||||
void* data) {
|
||||
Environment* env = static_cast<Environment*>(data);
|
||||
|
||||
const char* message = "(unknown event)";
|
||||
switch (event) {
|
||||
#define V(key, msg) \
|
||||
case Isolate::AtomicsWaitEvent::key: \
|
||||
message = msg; \
|
||||
break;
|
||||
ATOMIC_WAIT_EVENTS(V)
|
||||
#undef V
|
||||
}
|
||||
|
||||
fprintf(stderr,
|
||||
"(node:%d) [Thread %" PRIu64 "] Atomics.wait(%p + %zx, %" PRId64
|
||||
", %.f) %s\n",
|
||||
static_cast<int>(uv_os_getpid()),
|
||||
env->thread_id(),
|
||||
array_buffer->Data(),
|
||||
offset_in_bytes,
|
||||
value,
|
||||
timeout_in_ms,
|
||||
message);
|
||||
}
|
||||
|
||||
void Environment::InitializeDiagnostics() {
|
||||
isolate_->GetHeapProfiler()->AddBuildEmbedderGraphCallback(
|
||||
Environment::BuildEmbedderGraph, this);
|
||||
@ -260,17 +222,6 @@ void Environment::InitializeDiagnostics() {
|
||||
}
|
||||
if (options_->trace_uncaught)
|
||||
isolate_->SetCaptureStackTraceForUncaughtExceptions(true);
|
||||
if (options_->trace_atomics_wait) {
|
||||
ProcessEmitDeprecationWarning(
|
||||
Environment::GetCurrent(isolate_),
|
||||
"The flag --trace-atomics-wait is deprecated.",
|
||||
"DEP0165");
|
||||
isolate_->SetAtomicsWaitCallback(AtomicsWaitCallback, this);
|
||||
AddCleanupHook([](void* data) {
|
||||
Environment* env = static_cast<Environment*>(data);
|
||||
env->isolate()->SetAtomicsWaitCallback(nullptr, nullptr);
|
||||
}, this);
|
||||
}
|
||||
if (options_->trace_promises) {
|
||||
isolate_->SetPromiseHook(TracePromises);
|
||||
}
|
||||
|
||||
@ -664,10 +664,6 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() {
|
||||
"throw an exception on deprecations",
|
||||
&EnvironmentOptions::throw_deprecation,
|
||||
kAllowedInEnvvar);
|
||||
AddOption("--trace-atomics-wait",
|
||||
"(deprecated) trace Atomics.wait() operations",
|
||||
&EnvironmentOptions::trace_atomics_wait,
|
||||
kAllowedInEnvvar);
|
||||
AddOption("--trace-deprecation",
|
||||
"show stack traces on deprecations",
|
||||
&EnvironmentOptions::trace_deprecation,
|
||||
|
||||
@ -178,7 +178,6 @@ class EnvironmentOptions : public Options {
|
||||
std::string test_shard;
|
||||
std::vector<std::string> test_skip_pattern;
|
||||
bool throw_deprecation = false;
|
||||
bool trace_atomics_wait = false;
|
||||
bool trace_deprecation = false;
|
||||
bool trace_exit = false;
|
||||
bool trace_sync_io = false;
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const common = require('../common');
|
||||
const assert = require('node:assert');
|
||||
const { test } = require('node:test');
|
||||
|
||||
test('should emit deprecation warning DEP0165', async () => {
|
||||
const { code, stdout, stderr } = await common.spawnPromisified(
|
||||
process.execPath, ['--trace-atomics-wait', '-e', '{}']
|
||||
);
|
||||
assert.match(stderr, /\[DEP0165\] DeprecationWarning:/);
|
||||
assert.strictEqual(stdout, '');
|
||||
assert.strictEqual(code, 0);
|
||||
});
|
||||
@ -1,101 +0,0 @@
|
||||
'use strict';
|
||||
require('../common');
|
||||
const assert = require('assert');
|
||||
const child_process = require('child_process');
|
||||
const { Worker } = require('worker_threads');
|
||||
|
||||
if (process.argv[2] === 'child') {
|
||||
const i32arr = new Int32Array(new SharedArrayBuffer(8));
|
||||
assert.strictEqual(Atomics.wait(i32arr, 0, 1), 'not-equal');
|
||||
assert.strictEqual(Atomics.wait(i32arr, 0, 0, 10), 'timed-out');
|
||||
|
||||
new Worker(`
|
||||
const i32arr = require('worker_threads').workerData;
|
||||
Atomics.store(i32arr, 1, -1);
|
||||
Atomics.notify(i32arr, 1);
|
||||
Atomics.wait(i32arr, 1, -1);
|
||||
`, { eval: true, workerData: i32arr });
|
||||
|
||||
Atomics.wait(i32arr, 1, 0);
|
||||
assert.strictEqual(Atomics.load(i32arr, 1), -1);
|
||||
Atomics.store(i32arr, 1, 0);
|
||||
Atomics.notify(i32arr, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
const proc = child_process.spawnSync(
|
||||
process.execPath,
|
||||
[ '--disable-warning=DEP0165', '--trace-atomics-wait', __filename, 'child' ],
|
||||
{ encoding: 'utf8', stdio: [ 'inherit', 'inherit', 'pipe' ] });
|
||||
|
||||
if (proc.status !== 0) console.log(proc);
|
||||
assert.strictEqual(proc.status, 0);
|
||||
|
||||
const SABAddress = proc.stderr.match(/Atomics\.wait\((?<SAB>.+) \+/).groups.SAB;
|
||||
const actualTimeline = proc.stderr
|
||||
.replace(new RegExp(SABAddress, 'g'), '<address>')
|
||||
.replace(new RegExp(`\\(node:${proc.pid}\\) `, 'g'), '')
|
||||
.replace(/\binf(inity)?\b/gi, 'inf')
|
||||
.replace(/\r/g, '')
|
||||
.trim();
|
||||
console.log('+++ normalized stdout +++');
|
||||
console.log(actualTimeline);
|
||||
console.log('--- normalized stdout ---');
|
||||
|
||||
const begin =
|
||||
`[Thread 0] Atomics.wait(<address> + 0, 1, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 0, 1, inf) did not wait because the \
|
||||
values mismatched
|
||||
[Thread 0] Atomics.wait(<address> + 0, 0, 10) started
|
||||
[Thread 0] Atomics.wait(<address> + 0, 0, 10) timed out`;
|
||||
|
||||
const expectedTimelines = [
|
||||
`${begin}
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) was woken up by another thread`,
|
||||
`${begin}
|
||||
[Thread 1] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) was woken up by another thread`,
|
||||
`${begin}
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) was woken up by another thread`,
|
||||
`${begin}
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) did not wait because the \
|
||||
values mismatched`,
|
||||
`${begin}
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) did not wait because the \
|
||||
values mismatched`,
|
||||
`${begin}
|
||||
[Thread 1] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) was woken up by another thread
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) did not wait because the \
|
||||
values mismatched`,
|
||||
`${begin}
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) did not wait because the \
|
||||
values mismatched
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) did not wait because the \
|
||||
values mismatched`,
|
||||
`${begin}
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) started
|
||||
[Thread 0] Atomics.wait(<address> + 4, 0, inf) did not wait because the \
|
||||
values mismatched
|
||||
[Thread 1] Atomics.wait(<address> + 4, -1, inf) was woken up by another thread`,
|
||||
];
|
||||
|
||||
assert(expectedTimelines.includes(actualTimeline));
|
||||
Loading…
Reference in New Issue
Block a user