process: allow reading umask in workers
Refs: https://github.com/nodejs/node/issues/25448 PR-URL: https://github.com/nodejs/node/pull/25526 Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This commit is contained in:
parent
1375af204a
commit
f6cd4e3e59
@ -1926,6 +1926,11 @@ All attempts at serializing an uncaught exception from a worker thread failed.
|
|||||||
The pathname used for the main script of a worker has an
|
The pathname used for the main script of a worker has an
|
||||||
unknown file extension.
|
unknown file extension.
|
||||||
|
|
||||||
|
<a id="ERR_WORKER_UNSUPPORTED_OPERATION"></a>
|
||||||
|
### ERR_WORKER_UNSUPPORTED_OPERATION
|
||||||
|
|
||||||
|
The requested functionality is not supported in worker threads.
|
||||||
|
|
||||||
<a id="ERR_ZLIB_INITIALIZATION_FAILED"></a>
|
<a id="ERR_ZLIB_INITIALIZATION_FAILED"></a>
|
||||||
### ERR_ZLIB_INITIALIZATION_FAILED
|
### ERR_ZLIB_INITIALIZATION_FAILED
|
||||||
|
|
||||||
|
@ -2007,7 +2007,8 @@ console.log(
|
|||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
This feature is not available in [`Worker`][] threads.
|
[`Worker`][] threads are able to read the umask, however attempting to set the
|
||||||
|
umask will result in a thrown exception.
|
||||||
|
|
||||||
## process.uptime()
|
## process.uptime()
|
||||||
<!-- YAML
|
<!-- YAML
|
||||||
|
@ -82,6 +82,10 @@ function startup() {
|
|||||||
process._startProfilerIdleNotifier =
|
process._startProfilerIdleNotifier =
|
||||||
rawMethods._startProfilerIdleNotifier;
|
rawMethods._startProfilerIdleNotifier;
|
||||||
process._stopProfilerIdleNotifier = rawMethods._stopProfilerIdleNotifier;
|
process._stopProfilerIdleNotifier = rawMethods._stopProfilerIdleNotifier;
|
||||||
|
} else {
|
||||||
|
const wrapped = workerThreadSetup.wrapProcessMethods(rawMethods);
|
||||||
|
|
||||||
|
process.umask = wrapped.umask;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up methods on the process object for all threads
|
// Set up methods on the process object for all threads
|
||||||
|
@ -1001,4 +1001,6 @@ E('ERR_WORKER_UNSERIALIZABLE_ERROR',
|
|||||||
E('ERR_WORKER_UNSUPPORTED_EXTENSION',
|
E('ERR_WORKER_UNSUPPORTED_EXTENSION',
|
||||||
'The worker script extension must be ".js" or ".mjs". Received "%s"',
|
'The worker script extension must be ".js" or ".mjs". Received "%s"',
|
||||||
TypeError);
|
TypeError);
|
||||||
|
E('ERR_WORKER_UNSUPPORTED_OPERATION',
|
||||||
|
'%s is not supported in workers', TypeError);
|
||||||
E('ERR_ZLIB_INITIALIZATION_FAILED', 'Initialization failed', Error);
|
E('ERR_ZLIB_INITIALIZATION_FAILED', 'Initialization failed', Error);
|
||||||
|
@ -15,6 +15,10 @@ const {
|
|||||||
WritableWorkerStdio
|
WritableWorkerStdio
|
||||||
} = require('internal/worker/io');
|
} = require('internal/worker/io');
|
||||||
|
|
||||||
|
const {
|
||||||
|
codes: { ERR_WORKER_UNSUPPORTED_OPERATION }
|
||||||
|
} = require('internal/errors');
|
||||||
|
|
||||||
let debuglog;
|
let debuglog;
|
||||||
function debug(...args) {
|
function debug(...args) {
|
||||||
if (!debuglog) {
|
if (!debuglog) {
|
||||||
@ -118,8 +122,23 @@ function createWorkerFatalExeception(port) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The execution of this function itself should not cause any side effects.
|
||||||
|
function wrapProcessMethods(binding) {
|
||||||
|
function umask(mask) {
|
||||||
|
// process.umask() is a read-only operation in workers.
|
||||||
|
if (mask !== undefined) {
|
||||||
|
throw new ERR_WORKER_UNSUPPORTED_OPERATION('Setting process.umask()');
|
||||||
|
}
|
||||||
|
|
||||||
|
return binding.umask(mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { umask };
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
initializeWorkerStdio,
|
initializeWorkerStdio,
|
||||||
createMessageHandler,
|
createMessageHandler,
|
||||||
createWorkerFatalExeception
|
createWorkerFatalExeception,
|
||||||
|
wrapProcessMethods
|
||||||
};
|
};
|
||||||
|
@ -50,6 +50,10 @@ using v8::Uint32;
|
|||||||
using v8::Uint32Array;
|
using v8::Uint32Array;
|
||||||
using v8::Value;
|
using v8::Value;
|
||||||
|
|
||||||
|
namespace per_process {
|
||||||
|
Mutex umask_mutex;
|
||||||
|
} // namespace per_process
|
||||||
|
|
||||||
// Microseconds in a second, as a float, used in CPUUsage() below
|
// Microseconds in a second, as a float, used in CPUUsage() below
|
||||||
#define MICROS_PER_SEC 1e6
|
#define MICROS_PER_SEC 1e6
|
||||||
// used in Hrtime() below
|
// used in Hrtime() below
|
||||||
@ -220,6 +224,7 @@ static void Umask(const FunctionCallbackInfo<Value>& args) {
|
|||||||
|
|
||||||
CHECK_EQ(args.Length(), 1);
|
CHECK_EQ(args.Length(), 1);
|
||||||
CHECK(args[0]->IsUndefined() || args[0]->IsUint32());
|
CHECK(args[0]->IsUndefined() || args[0]->IsUint32());
|
||||||
|
Mutex::ScopedLock scoped_lock(per_process::umask_mutex);
|
||||||
|
|
||||||
if (args[0]->IsUndefined()) {
|
if (args[0]->IsUndefined()) {
|
||||||
old = umask(0);
|
old = umask(0);
|
||||||
@ -396,9 +401,9 @@ static void InitializeProcessMethods(Local<Object> target,
|
|||||||
target, "_stopProfilerIdleNotifier", StopProfilerIdleNotifier);
|
target, "_stopProfilerIdleNotifier", StopProfilerIdleNotifier);
|
||||||
env->SetMethod(target, "abort", Abort);
|
env->SetMethod(target, "abort", Abort);
|
||||||
env->SetMethod(target, "chdir", Chdir);
|
env->SetMethod(target, "chdir", Chdir);
|
||||||
env->SetMethod(target, "umask", Umask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
env->SetMethod(target, "umask", Umask);
|
||||||
env->SetMethod(target, "_rawDebug", RawDebug);
|
env->SetMethod(target, "_rawDebug", RawDebug);
|
||||||
env->SetMethod(target, "memoryUsage", MemoryUsage);
|
env->SetMethod(target, "memoryUsage", MemoryUsage);
|
||||||
env->SetMethod(target, "cpuUsage", CPUUsage);
|
env->SetMethod(target, "cpuUsage", CPUUsage);
|
||||||
|
@ -33,21 +33,20 @@ const {
|
|||||||
bits,
|
bits,
|
||||||
hasIntl
|
hasIntl
|
||||||
} = process.binding('config');
|
} = process.binding('config');
|
||||||
|
const { isMainThread } = require('worker_threads');
|
||||||
|
|
||||||
// Some tests assume a umask of 0o022 so set that up front. Tests that need a
|
// Some tests assume a umask of 0o022 so set that up front. Tests that need a
|
||||||
// different umask will set it themselves.
|
// different umask will set it themselves.
|
||||||
//
|
//
|
||||||
// process.umask() is not available in workers so we need to check for its
|
// Workers can read, but not set the umask, so check that this is the main
|
||||||
// existence.
|
// thread.
|
||||||
if (process.umask)
|
if (isMainThread)
|
||||||
process.umask(0o022);
|
process.umask(0o022);
|
||||||
|
|
||||||
const noop = () => {};
|
const noop = () => {};
|
||||||
|
|
||||||
const hasCrypto = Boolean(process.versions.openssl);
|
const hasCrypto = Boolean(process.versions.openssl);
|
||||||
|
|
||||||
const { isMainThread } = require('worker_threads');
|
|
||||||
|
|
||||||
// Check for flags. Skip this for workers (both, the `cluster` module and
|
// Check for flags. Skip this for workers (both, the `cluster` module and
|
||||||
// `worker_threads`) and child processes.
|
// `worker_threads`) and child processes.
|
||||||
if (process.argv.length === 2 &&
|
if (process.argv.length === 2 &&
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
|
|
||||||
if (!common.isMainThread)
|
if (!common.isMainThread)
|
||||||
common.skip('process.umask is not available in Workers');
|
common.skip('Setting process.umask is not supported in Workers');
|
||||||
|
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
@ -7,7 +7,7 @@ const common = require('../common');
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
|
|
||||||
if (!common.isMainThread)
|
if (!common.isMainThread)
|
||||||
common.skip('process.umask is not available in Workers');
|
common.skip('Setting process.umask is not supported in Workers');
|
||||||
|
|
||||||
let mask;
|
let mask;
|
||||||
|
|
||||||
|
@ -22,8 +22,15 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
const common = require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
if (!common.isMainThread)
|
|
||||||
common.skip('process.umask is not available in Workers');
|
if (!common.isMainThread) {
|
||||||
|
assert.strictEqual(typeof process.umask(), 'number');
|
||||||
|
assert.throws(() => {
|
||||||
|
process.umask('0664');
|
||||||
|
}, { code: 'ERR_WORKER_UNSUPPORTED_OPERATION' });
|
||||||
|
|
||||||
|
common.skip('Setting process.umask is not supported in Workers');
|
||||||
|
}
|
||||||
|
|
||||||
// Note in Windows one can only set the "user" bits.
|
// Note in Windows one can only set the "user" bits.
|
||||||
let mask;
|
let mask;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user