worker: add option to track unmanaged file descriptors · nodejs/node@b4819db · GitHub
Skip to content

Commit b4819db

Browse files
committed
worker: add option to track unmanaged file descriptors
Add a public option for Workers which adds tracking for raw file descriptors, as currently, those resources are not cleaned up, unlike e.g. `FileHandle`s. PR-URL: #34303 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent 3e21dd9 commit b4819db

5 files changed

Lines changed: 89 additions & 3 deletions

File tree

doc/api/worker_threads.md

Lines changed: 12 additions & 0 deletions

lib/internal/worker.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ class Worker extends EventEmitter {
149149
this[kHandle] = new WorkerImpl(url,
150150
env === process.env ? null : env,
151151
options.execArgv,
152-
parseResourceLimits(options.resourceLimits));
152+
parseResourceLimits(options.resourceLimits),
153+
!!options.trackUnmanagedFds);
153154
if (this[kHandle].invalidExecArgv) {
154155
throw new ERR_WORKER_INVALID_EXEC_ARGV(this[kHandle].invalidExecArgv);
155156
}

src/node_worker.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ void Worker::Run() {
313313
context,
314314
std::move(argv_),
315315
std::move(exec_argv_),
316-
EnvironmentFlags::kNoFlags,
316+
static_cast<EnvironmentFlags::Flags>(environment_flags_),
317317
thread_id_,
318318
std::move(inspector_parent_handle_)));
319319
if (is_stopped()) return;
@@ -460,7 +460,6 @@ void Worker::New(const FunctionCallbackInfo<Value>& args) {
460460

461461
std::vector<std::string> exec_argv_out;
462462

463-
CHECK_EQ(args.Length(), 4);
464463
// Argument might be a string or URL
465464
if (!args[0]->IsNullOrUndefined()) {
466465
Utf8Value value(
@@ -586,6 +585,10 @@ void Worker::New(const FunctionCallbackInfo<Value>& args) {
586585
CHECK_EQ(limit_info->Length(), kTotalResourceLimitCount);
587586
limit_info->CopyContents(worker->resource_limits_,
588587
sizeof(worker->resource_limits_));
588+
589+
CHECK(args[4]->IsBoolean());
590+
if (args[4]->IsTrue() || env->tracks_unmanaged_fds())
591+
worker->environment_flags_ |= EnvironmentFlags::kTrackUnmanagedFds;
589592
}
590593

591594
void Worker::StartThread(const FunctionCallbackInfo<Value>& args) {

src/node_worker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ class Worker : public AsyncWrap {
116116
bool stopped_ = true;
117117

118118
bool has_ref_ = true;
119+
uint64_t environment_flags_ = EnvironmentFlags::kNoFlags;
119120

120121
// The real Environment of the worker object. It has a lesser
121122
// lifespan than the worker object itself - comes to life
Lines changed: 69 additions & 0 deletions

0 commit comments

Comments
 (0)