Skip to content

Commit f9ddbb6

Browse files
committed
lib: move DTRACE_* probes out of global scope
The DTRACE_* probes have been global for no really good reason. Move those into an internalBinding. PR-URL: #26541 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Matheus Marchini <[email protected]> Reviewed-By: Gus Caplan <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]>
1 parent f2064df commit f9ddbb6

14 files changed

+92
-54
lines changed

.eslintrc.js

-6
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,6 @@ module.exports = {
281281
BigInt: 'readable',
282282
BigInt64Array: 'readable',
283283
BigUint64Array: 'readable',
284-
DTRACE_HTTP_CLIENT_REQUEST: 'readable',
285-
DTRACE_HTTP_CLIENT_RESPONSE: 'readable',
286-
DTRACE_HTTP_SERVER_REQUEST: 'readable',
287-
DTRACE_HTTP_SERVER_RESPONSE: 'readable',
288-
DTRACE_NET_SERVER_CONNECTION: 'readable',
289-
DTRACE_NET_STREAM_END: 'readable',
290284
TextEncoder: 'readable',
291285
TextDecoder: 'readable',
292286
queueMicrotask: 'readable',

lib/_http_client.js

+4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ const {
4747
} = require('internal/errors').codes;
4848
const { validateTimerDuration } = require('internal/timers');
4949
const is_reused_symbol = require('internal/freelist').symbols.is_reused_symbol;
50+
const {
51+
DTRACE_HTTP_CLIENT_REQUEST,
52+
DTRACE_HTTP_CLIENT_RESPONSE
53+
} = require('internal/dtrace');
5054

5155
const INVALID_PATH_REGEX = /[^\u0021-\u00ff]/;
5256

lib/_http_server.js

+4
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ const {
5050
ERR_INVALID_CHAR
5151
} = require('internal/errors').codes;
5252
const Buffer = require('buffer').Buffer;
53+
const {
54+
DTRACE_HTTP_SERVER_REQUEST,
55+
DTRACE_HTTP_SERVER_RESPONSE
56+
} = require('internal/dtrace');
5357

5458
const kServerResponse = Symbol('ServerResponse');
5559

lib/internal/dtrace.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use strict';
2+
3+
const config = internalBinding('config');
4+
5+
const {
6+
DTRACE_HTTP_CLIENT_REQUEST = () => {},
7+
DTRACE_HTTP_CLIENT_RESPONSE = () => {},
8+
DTRACE_HTTP_SERVER_REQUEST = () => {},
9+
DTRACE_HTTP_SERVER_RESPONSE = () => {},
10+
DTRACE_NET_SERVER_CONNECTION = () => {},
11+
DTRACE_NET_STREAM_END = () => {}
12+
} = (config.hasDtrace ? internalBinding('dtrace') : {});
13+
14+
module.exports = {
15+
DTRACE_HTTP_CLIENT_REQUEST,
16+
DTRACE_HTTP_CLIENT_RESPONSE,
17+
DTRACE_HTTP_SERVER_REQUEST,
18+
DTRACE_HTTP_SERVER_RESPONSE,
19+
DTRACE_NET_SERVER_CONNECTION,
20+
DTRACE_NET_STREAM_END
21+
};

lib/net.js

+4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ const {
8585
} = require('internal/errors');
8686
const { validateInt32, validateString } = require('internal/validators');
8787
const kLastWriteQueueSize = Symbol('lastWriteQueueSize');
88+
const {
89+
DTRACE_NET_SERVER_CONNECTION,
90+
DTRACE_NET_STREAM_END
91+
} = require('internal/dtrace');
8892

8993
// Lazy loaded to improve startup performance.
9094
let cluster;

node.gyp

+1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
'lib/internal/dns/promises.js',
117117
'lib/internal/dns/utils.js',
118118
'lib/internal/domexception.js',
119+
'lib/internal/dtrace.js',
119120
'lib/internal/encoding.js',
120121
'lib/internal/errors.js',
121122
'lib/internal/error-serdes.js',

src/node.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ MaybeLocal<Value> RunBootstrapping(Environment* env) {
255255
Local<Object> global = context->Global();
256256

257257
#if defined HAVE_DTRACE || defined HAVE_ETW
258-
InitDTrace(env, global);
258+
InitDTrace(env);
259259
#endif
260260

261261
Local<Object> process = env->process_object();

src/node_binding.cc

+8-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@
2828
#define NODE_BUILTIN_PROFILER_MODULES(V)
2929
#endif
3030

31+
#if HAVE_DTRACE || HAVE_ETW
32+
#define NODE_BUILTIN_DTRACE_MODULES(V) V(dtrace)
33+
#else
34+
#define NODE_BUILTIN_DTRACE_MODULES(V)
35+
#endif
36+
3137
// A list of built-in modules. In order to do module registration
3238
// in node::Init(), need to add built-in modules in the following list.
3339
// Then in binding::RegisterBuiltinModules(), it calls modules' registration
@@ -85,7 +91,8 @@
8591
NODE_BUILTIN_OPENSSL_MODULES(V) \
8692
NODE_BUILTIN_ICU_MODULES(V) \
8793
NODE_BUILTIN_REPORT_MODULES(V) \
88-
NODE_BUILTIN_PROFILER_MODULES(V)
94+
NODE_BUILTIN_PROFILER_MODULES(V) \
95+
NODE_BUILTIN_DTRACE_MODULES(V)
8996

9097
// This is used to load built-in modules. Instead of using
9198
// __attribute__((constructor)), we call the _register_<modname>

src/node_config.cc

+4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ static void Initialize(Local<Object> target,
7474
READONLY_PROPERTY(target,
7575
"bits",
7676
Number::New(env->isolate(), 8 * sizeof(intptr_t)));
77+
78+
#if defined HAVE_DTRACE || defined HAVE_ETW
79+
READONLY_TRUE_PROPERTY(target, "hasDtrace");
80+
#endif
7781
} // InitConfig
7882

7983
} // namespace node

src/node_dtrace.cc

+20-26
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
namespace node {
5050

51+
using v8::Context;
5152
using v8::FunctionCallbackInfo;
5253
using v8::GCCallbackFlags;
5354
using v8::GCType;
@@ -262,31 +263,7 @@ void dtrace_gc_done(Isolate* isolate, GCType type, GCCallbackFlags flags) {
262263
}
263264

264265

265-
void InitDTrace(Environment* env, Local<Object> target) {
266-
HandleScope scope(env->isolate());
267-
268-
static struct {
269-
const char* name;
270-
void (*func)(const FunctionCallbackInfo<Value>&);
271-
} tab[] = {
272-
#define NODE_PROBE(name) #name, name
273-
{ NODE_PROBE(DTRACE_NET_SERVER_CONNECTION) },
274-
{ NODE_PROBE(DTRACE_NET_STREAM_END) },
275-
{ NODE_PROBE(DTRACE_HTTP_SERVER_REQUEST) },
276-
{ NODE_PROBE(DTRACE_HTTP_SERVER_RESPONSE) },
277-
{ NODE_PROBE(DTRACE_HTTP_CLIENT_REQUEST) },
278-
{ NODE_PROBE(DTRACE_HTTP_CLIENT_RESPONSE) }
279-
#undef NODE_PROBE
280-
};
281-
282-
for (size_t i = 0; i < arraysize(tab); i++) {
283-
Local<String> key = OneByteString(env->isolate(), tab[i].name);
284-
Local<Value> val = env->NewFunctionTemplate(tab[i].func)
285-
->GetFunction(env->context())
286-
.ToLocalChecked();
287-
target->Set(env->context(), key, val).FromJust();
288-
}
289-
266+
void InitDTrace(Environment* env) {
290267
#ifdef HAVE_ETW
291268
// ETW is neither thread-safe nor does it clean up resources on exit,
292269
// so we can use it only on the main thread.
@@ -295,10 +272,27 @@ void InitDTrace(Environment* env, Local<Object> target) {
295272
}
296273
#endif
297274

298-
#if defined HAVE_DTRACE || defined HAVE_ETW
299275
env->isolate()->AddGCPrologueCallback(dtrace_gc_start);
300276
env->isolate()->AddGCEpilogueCallback(dtrace_gc_done);
277+
}
278+
279+
void InitializeDTrace(Local<Object> target,
280+
Local<Value> unused,
281+
Local<Context> context,
282+
void* priv) {
283+
Environment* env = Environment::GetCurrent(context);
284+
285+
#if defined HAVE_DTRACE || defined HAVE_ETW
286+
# define NODE_PROBE(name) env->SetMethod(target, #name, name);
287+
NODE_PROBE(DTRACE_NET_SERVER_CONNECTION)
288+
NODE_PROBE(DTRACE_NET_STREAM_END)
289+
NODE_PROBE(DTRACE_HTTP_SERVER_REQUEST)
290+
NODE_PROBE(DTRACE_HTTP_SERVER_RESPONSE)
291+
NODE_PROBE(DTRACE_HTTP_CLIENT_REQUEST)
292+
NODE_PROBE(DTRACE_HTTP_CLIENT_RESPONSE)
293+
# undef NODE_PROBE
301294
#endif
302295
}
303296

304297
} // namespace node
298+
NODE_MODULE_CONTEXT_AWARE_INTERNAL(dtrace, node::InitializeDTrace)

src/node_dtrace.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ typedef struct {
7676

7777
namespace node {
7878

79-
void InitDTrace(Environment* env, v8::Local<v8::Object> target);
79+
void InitDTrace(Environment* env);
8080

8181
} // namespace node
8282

test/common/index.js

-9
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,6 @@ if (global.gc) {
266266
knownGlobals.push(global.gc);
267267
}
268268

269-
if (global.DTRACE_HTTP_SERVER_RESPONSE) {
270-
knownGlobals.push(DTRACE_HTTP_SERVER_RESPONSE);
271-
knownGlobals.push(DTRACE_HTTP_SERVER_REQUEST);
272-
knownGlobals.push(DTRACE_HTTP_CLIENT_RESPONSE);
273-
knownGlobals.push(DTRACE_HTTP_CLIENT_REQUEST);
274-
knownGlobals.push(DTRACE_NET_STREAM_END);
275-
knownGlobals.push(DTRACE_NET_SERVER_CONNECTION);
276-
}
277-
278269
if (process.env.NODE_TEST_KNOWN_GLOBALS) {
279270
const knownFromEnv = process.env.NODE_TEST_KNOWN_GLOBALS.split(',');
280271
allowGlobals(...knownFromEnv);

test/parallel/test-global.js

-10
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,6 @@ builtinModules.forEach((moduleName) => {
5151
'setInterval',
5252
'setTimeout'
5353
];
54-
if (global.DTRACE_HTTP_SERVER_RESPONSE) {
55-
expected.unshift(
56-
'DTRACE_HTTP_SERVER_RESPONSE',
57-
'DTRACE_HTTP_SERVER_REQUEST',
58-
'DTRACE_HTTP_CLIENT_RESPONSE',
59-
'DTRACE_HTTP_CLIENT_REQUEST',
60-
'DTRACE_NET_STREAM_END',
61-
'DTRACE_NET_SERVER_CONNECTION'
62-
);
63-
}
6454
assert.deepStrictEqual(new Set(Object.keys(global)), new Set(expected));
6555
}
6656

test/parallel/test-internal-dtrace.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Flags: --expose-internals
2+
'use strict';
3+
4+
require('../common');
5+
const assert = require('assert');
6+
7+
const {
8+
DTRACE_HTTP_CLIENT_REQUEST,
9+
DTRACE_HTTP_CLIENT_RESPONSE,
10+
DTRACE_HTTP_SERVER_REQUEST,
11+
DTRACE_HTTP_SERVER_RESPONSE,
12+
DTRACE_NET_SERVER_CONNECTION,
13+
DTRACE_NET_STREAM_END
14+
} = require('internal/dtrace');
15+
16+
// We're just testing to make sure these are always defined and
17+
// callable. We don't actually test their function here.
18+
19+
assert.strictEqual(typeof DTRACE_HTTP_CLIENT_REQUEST, 'function');
20+
assert.strictEqual(typeof DTRACE_HTTP_CLIENT_RESPONSE, 'function');
21+
assert.strictEqual(typeof DTRACE_HTTP_SERVER_REQUEST, 'function');
22+
assert.strictEqual(typeof DTRACE_HTTP_SERVER_RESPONSE, 'function');
23+
assert.strictEqual(typeof DTRACE_NET_SERVER_CONNECTION, 'function');
24+
assert.strictEqual(typeof DTRACE_NET_STREAM_END, 'function');

0 commit comments

Comments
 (0)