Skip to content

Commit

Permalink
os: improve tmpdir performance
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig committed Sep 2, 2024
1 parent 3d954dc commit 9e8c1be
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 11 deletions.
31 changes: 31 additions & 0 deletions benchmark/os/tmpdir.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'use strict';

const common = require('../common.js');
const { tmpdir } = require('os');
const assert = require('assert');

const bench = common.createBenchmark(main, {
n: [1e6],
});

function main({ n }) {
// Warm up.
const length = 1024;
const array = [];
for (let i = 0; i < length; ++i) {
array.push(tmpdir());
}

bench.start();
for (let i = 0; i < n; ++i) {
const index = i % length;
array[index] = tmpdir();
}
bench.end(n);

// Verify the entries to prevent dead code elimination from making
// the benchmark invalid.
for (let i = 0; i < length; ++i) {
assert.strictEqual(typeof array[i], 'string');
}
}
16 changes: 5 additions & 11 deletions lib/os.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const {
SymbolToPrimitive,
} = primordials;

const { safeGetenv } = internalBinding('credentials');
const { getTempDir } = internalBinding('credentials');
const constants = internalBinding('constants').os;
const isWindows = process.platform === 'win32';

Expand Down Expand Up @@ -179,24 +179,18 @@ platform[SymbolToPrimitive] = () => process.platform;
* @returns {string}
*/
function tmpdir() {
let path;
if (isWindows) {
path = process.env.TEMP ||
let path = process.env.TEMP ||
process.env.TMP ||
(process.env.SystemRoot || process.env.windir) + '\\temp';
if (path.length > 1 && StringPrototypeEndsWith(path, '\\') &&
!StringPrototypeEndsWith(path, ':\\'))
path = StringPrototypeSlice(path, 0, -1);
} else {
path = safeGetenv('TMPDIR') ||
safeGetenv('TMP') ||
safeGetenv('TEMP') ||
'/tmp';
if (path.length > 1 && StringPrototypeEndsWith(path, '/'))
path = StringPrototypeSlice(path, 0, -1);

return path;
}

return path;
return getTempDir();
}
tmpdir[SymbolToPrimitive] = () => tmpdir();

Expand Down
23 changes: 23 additions & 0 deletions src/node_credentials.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,27 @@ static void SafeGetenv(const FunctionCallbackInfo<Value>& args) {
args.GetReturnValue().Set(result);
}

static void GetTempDir(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
Isolate* isolate = env->isolate();

std::string dir = "tmp";

// Try TMPDIR, TMP, and TEMP in that order.
if (!SafeGetenv("TMPDIR", &dir, env->env_vars()) &&
!SafeGetenv("TMP", &dir, env->env_vars()) &&
!SafeGetenv("TEMP", &dir, env->env_vars())) {
return;
}

if (dir.size() > 1 && dir.ends_with("/")) {
dir.pop_back();
}

args.GetReturnValue().Set(
ToV8Value(isolate->GetCurrentContext(), dir).ToLocalChecked());
}

#ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS

static const uid_t uid_not_found = static_cast<uid_t>(-1);
Expand Down Expand Up @@ -456,6 +477,7 @@ static void InitGroups(const FunctionCallbackInfo<Value>& args) {

void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
registry->Register(SafeGetenv);
registry->Register(GetTempDir);

#ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS
registry->Register(GetUid);
Expand All @@ -478,6 +500,7 @@ static void Initialize(Local<Object> target,
Local<Context> context,
void* priv) {
SetMethod(context, target, "safeGetenv", SafeGetenv);
SetMethod(context, target, "getTempDir", GetTempDir);

#ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS
Environment* env = Environment::GetCurrent(context);
Expand Down

0 comments on commit 9e8c1be

Please sign in to comment.