Skip to content

Commit 16c93ee

Browse files
committed
os: add availableParallelism()
This commit exposes uv_available_parallelism() as an alternative to cpus().length. uv_available_parallelism() is inspired by Rust's available_parallelism().
1 parent 6fe6e76 commit 16c93ee

File tree

4 files changed

+27
-0
lines changed

4 files changed

+27
-0
lines changed

doc/api/os.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ The operating system-specific end-of-line marker.
2626
* `\n` on POSIX
2727
* `\r\n` on Windows
2828

29+
## `os.availableParallelism()`
30+
31+
<!-- YAML
32+
added: REPLACEME
33+
-->
34+
35+
* Returns: {integer}
36+
37+
Returns an estimate of the default amount of parallelism a program should use.
38+
Always returns a non-zero value.
39+
2940
## `os.arch()`
3041

3142
<!-- YAML

lib/os.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ const {
4545
const { validateInt32 } = require('internal/validators');
4646

4747
const {
48+
getAvailableParallelism,
4849
getCPUs,
4950
getFreeMem,
5051
getHomeDirectory: _getHomeDirectory,
@@ -100,6 +101,7 @@ const getOSVersion = () => version;
100101
*/
101102
const getMachine = () => machine;
102103

104+
getAvailableParallelism[SymbolToPrimitive] = () => getAvailableParallelism();
103105
getFreeMem[SymbolToPrimitive] = () => getFreeMem();
104106
getHostname[SymbolToPrimitive] = () => getHostname();
105107
getOSVersion[SymbolToPrimitive] = () => getOSVersion();
@@ -364,6 +366,7 @@ function userInfo(options) {
364366

365367
module.exports = {
366368
arch,
369+
availableParallelism: getAvailableParallelism,
367370
cpus,
368371
endianness,
369372
freemem: getFreeMem,

src/node_os.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,12 @@ static void GetPriority(const FunctionCallbackInfo<Value>& args) {
381381
}
382382

383383

384+
static void GetAvailableParallelism(const FunctionCallbackInfo<Value>& args) {
385+
unsigned int parallelism = uv_available_parallelism();
386+
args.GetReturnValue().Set(parallelism);
387+
}
388+
389+
384390
void Initialize(Local<Object> target,
385391
Local<Value> unused,
386392
Local<Context> context,
@@ -397,6 +403,8 @@ void Initialize(Local<Object> target,
397403
SetMethod(context, target, "getUserInfo", GetUserInfo);
398404
SetMethod(context, target, "setPriority", SetPriority);
399405
SetMethod(context, target, "getPriority", GetPriority);
406+
SetMethod(
407+
context, target, "getAvailableParallelism", GetAvailableParallelism);
400408
SetMethod(context, target, "getOSInformation", GetOSInformation);
401409
target
402410
->Set(context,
@@ -417,6 +425,7 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
417425
registry->Register(GetUserInfo);
418426
registry->Register(SetPriority);
419427
registry->Register(GetPriority);
428+
registry->Register(GetAvailableParallelism);
420429
registry->Register(GetOSInformation);
421430
}
422431

test/parallel/test-os.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ if (!common.isIBMi) {
255255
is.number(os.uptime(), 'uptime');
256256
}
257257

258+
is.number(+os.availableParallelism, 'availableParallelism');
259+
is.number(os.availableParallelism(), 'availableParallelism');
258260
is.number(+os.freemem, 'freemem');
259261
is.number(os.freemem(), 'freemem');
260262

@@ -264,3 +266,5 @@ if (common.isWindows) {
264266
} else {
265267
assert.strictEqual(devNull, '/dev/null');
266268
}
269+
270+
assert.ok(os.availableParallelism() > 0);

0 commit comments

Comments
 (0)