From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Marco Ippolito <marcoippolito54@gmail.com>
Date: Wed, 1 May 2024 14:24:48 +0200
Subject: cli: move --trace-atomics-wait to eol
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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>

diff --git a/doc/api/cli.md b/doc/api/cli.md
index 8cabb58e621a9951acd5551afb85c192f2b1c690..b69bacebef3e5e5e5b191c61aa5fe0f71c1edfb3 100644
--- a/doc/api/cli.md
+++ b/doc/api/cli.md
@@ -2712,39 +2712,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(&lt;address> + 0, 1, inf) started
-(node:15701) [Thread 0] Atomics.wait(&lt;address> + 0, 1, inf) did not wait because the values mismatched
-(node:15701) [Thread 0] Atomics.wait(&lt;address> + 0, 0, 10) started
-(node:15701) [Thread 0] Atomics.wait(&lt;address> + 0, 0, 10) timed out
-(node:15701) [Thread 0] Atomics.wait(&lt;address> + 4, 0, inf) started
-(node:15701) [Thread 1] Atomics.wait(&lt;address> + 4, -1, inf) started
-(node:15701) [Thread 0] Atomics.wait(&lt;address> + 4, 0, inf) was woken up by another thread
-(node:15701) [Thread 1] Atomics.wait(&lt;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
@@ -3429,7 +3396,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-env-js-stack`
 * `--trace-env-native-stack`
diff --git a/doc/node.1 b/doc/node.1
index 6913992a5476d2317a34fb69d3c6af63b686f9a6..1faef5ba1d4206a5cc4c71cb71f7a08f613fbf17 100644
--- a/doc/node.1
+++ b/doc/node.1
@@ -539,11 +539,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.
 .
diff --git a/src/node.cc b/src/node.cc
index 0d383dcdb80fe30e3c2d6880b44f626f065bb1f3..9d9992dacbc595c987827f55eb12ea8af0480df6 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -232,44 +232,6 @@ void Environment::WaitForInspectorFrontendByOptions() {
 }
 #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);
@@ -278,17 +240,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);
   }
diff --git a/src/node_options.cc b/src/node_options.cc
index cfb95f65ccb0c6d150be8a4039caf26faf7cd06d..cb0ecd81b33abd7743e66e225a6cb96b4094f935 100644
--- a/src/node_options.cc
+++ b/src/node_options.cc
@@ -773,10 +773,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,
diff --git a/src/node_options.h b/src/node_options.h
index 3ff1f4b4baa64b8ee2a4587e150ea14cb2fdfdf4..26ac54c4b18dd00b2c1f915dc1ba0e90ca70b48f 100644
--- a/src/node_options.h
+++ b/src/node_options.h
@@ -204,7 +204,6 @@ class EnvironmentOptions : public Options {
   std::vector<std::string> coverage_include_pattern;
   std::vector<std::string> coverage_exclude_pattern;
   bool throw_deprecation = false;
-  bool trace_atomics_wait = false;
   bool trace_deprecation = false;
   bool trace_exit = false;
   bool trace_sync_io = false;
diff --git a/test/parallel/test-trace-atomic-deprecation.js b/test/parallel/test-trace-atomic-deprecation.js
deleted file mode 100644
index 8aeddb28e938d23e646d882cfe24b2e2311f9ab2..0000000000000000000000000000000000000000
--- a/test/parallel/test-trace-atomic-deprecation.js
+++ /dev/null
@@ -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);
-});
diff --git a/test/parallel/test-trace-atomics-wait.js b/test/parallel/test-trace-atomics-wait.js
deleted file mode 100644
index 6449a2be2b47e0758090dc13d136877b1874c635..0000000000000000000000000000000000000000
--- a/test/parallel/test-trace-atomics-wait.js
+++ /dev/null
@@ -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));
