summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/env-inl.h4
-rw-r--r--src/env.h6
-rw-r--r--src/node_worker.cc15
-rw-r--r--src/node_worker.h2
-rw-r--r--test/parallel/test-trace-events-worker-metadata.js33
5 files changed, 51 insertions, 9 deletions
diff --git a/src/env-inl.h b/src/env-inl.h
index c84fdf0bb8..bbb80c6f7a 100644
--- a/src/env-inl.h
+++ b/src/env-inl.h
@@ -598,11 +598,11 @@ inline bool Environment::is_main_thread() const {
return thread_id_ == 0;
}
-inline double Environment::thread_id() const {
+inline uint64_t Environment::thread_id() const {
return thread_id_;
}
-inline void Environment::set_thread_id(double id) {
+inline void Environment::set_thread_id(uint64_t id) {
thread_id_ = id;
}
diff --git a/src/env.h b/src/env.h
index 1a96abe106..786f0846f4 100644
--- a/src/env.h
+++ b/src/env.h
@@ -726,8 +726,8 @@ class Environment {
bool is_stopping_worker() const;
inline bool is_main_thread() const;
- inline double thread_id() const;
- inline void set_thread_id(double id);
+ inline uint64_t thread_id() const;
+ inline void set_thread_id(uint64_t id);
inline worker::Worker* worker_context() const;
inline void set_worker_context(worker::Worker* context);
inline void add_sub_worker_context(worker::Worker* context);
@@ -881,7 +881,7 @@ class Environment {
std::unordered_map<std::string, uint64_t> performance_marks_;
bool can_call_into_js_ = true;
- double thread_id_ = 0;
+ uint64_t thread_id_ = 0;
std::unordered_set<worker::Worker*> sub_worker_contexts_;
diff --git a/src/node_worker.cc b/src/node_worker.cc
index 320b6703d4..c628e6295c 100644
--- a/src/node_worker.cc
+++ b/src/node_worker.cc
@@ -9,6 +9,8 @@
#include "async_wrap.h"
#include "async_wrap-inl.h"
+#include <string>
+
using v8::ArrayBuffer;
using v8::Context;
using v8::Function;
@@ -30,7 +32,7 @@ namespace worker {
namespace {
-double next_thread_id = 1;
+uint64_t next_thread_id = 1;
Mutex next_thread_id_mutex;
} // anonymous namespace
@@ -44,7 +46,8 @@ Worker::Worker(Environment* env, Local<Object> wrap)
}
wrap->Set(env->context(),
env->thread_id_string(),
- Number::New(env->isolate(), thread_id_)).FromJust();
+ Number::New(env->isolate(),
+ static_cast<double>(thread_id_))).FromJust();
// Set up everything that needs to be set up in the parent environment.
parent_port_ = MessagePort::New(env, env->context());
@@ -112,6 +115,11 @@ bool Worker::is_stopped() const {
}
void Worker::Run() {
+ std::string name = "WorkerThread ";
+ name += std::to_string(thread_id_);
+ TRACE_EVENT_METADATA1(
+ "__metadata", "thread_name", "name",
+ TRACE_STR_COPY(name.c_str()));
MultiIsolatePlatform* platform = isolate_data_->platform();
CHECK_NE(platform, nullptr);
@@ -418,7 +426,8 @@ void InitWorker(Local<Object> target,
auto thread_id_string = FIXED_ONE_BYTE_STRING(env->isolate(), "threadId");
target->Set(env->context(),
thread_id_string,
- Number::New(env->isolate(), env->thread_id())).FromJust();
+ Number::New(env->isolate(),
+ static_cast<double>(env->thread_id()))).FromJust();
}
} // anonymous namespace
diff --git a/src/node_worker.h b/src/node_worker.h
index 0a98d2f11e..d802b5cfef 100644
--- a/src/node_worker.h
+++ b/src/node_worker.h
@@ -62,7 +62,7 @@ class Worker : public AsyncWrap {
bool thread_joined_ = true;
int exit_code_ = 0;
- double thread_id_ = -1;
+ uint64_t thread_id_ = -1;
std::unique_ptr<MessagePortData> child_port_data_;
diff --git a/test/parallel/test-trace-events-worker-metadata.js b/test/parallel/test-trace-events-worker-metadata.js
new file mode 100644
index 0000000000..8d21d6b7ab
--- /dev/null
+++ b/test/parallel/test-trace-events-worker-metadata.js
@@ -0,0 +1,33 @@
+// Flags: --experimental-worker
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const cp = require('child_process');
+const fs = require('fs');
+const { isMainThread } = require('worker_threads');
+
+if (isMainThread) {
+ const CODE = 'const { Worker } = require(\'worker_threads\'); ' +
+ `new Worker('${__filename.replace(/\\/g, '/')}')`;
+ const FILE_NAME = 'node_trace.1.log';
+ const tmpdir = require('../common/tmpdir');
+ tmpdir.refresh();
+ process.chdir(tmpdir.path);
+
+ const proc = cp.spawn(process.execPath,
+ [ '--experimental-worker',
+ '--trace-event-categories', 'node',
+ '-e', CODE ]);
+ proc.once('exit', common.mustCall(() => {
+ assert(common.fileExists(FILE_NAME));
+ fs.readFile(FILE_NAME, common.mustCall((err, data) => {
+ const traces = JSON.parse(data.toString()).traceEvents;
+ assert(traces.length > 0);
+ assert(traces.some((trace) =>
+ trace.cat === '__metadata' && trace.name === 'thread_name' &&
+ trace.args.name === 'WorkerThread 1'));
+ }));
+ }));
+} else {
+ // Do nothing here.
+}