diff options
author | Kirill Fomichev <fanatid@ya.ru> | 2019-09-13 17:25:31 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2020-02-04 19:41:44 +0300 |
commit | 018c3e8949e925efc8077801d44c2b2feb974750 (patch) | |
tree | ef8e6e43c89df503aff29546daa75a8455f9bf6f | |
parent | 60de60a0ce21378c80353489759dc70f05156cc7 (diff) |
perf_hooks: add property flags to GCPerformanceEntry
PR-URL: https://github.com/nodejs/node/pull/29547
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
-rw-r--r-- | doc/api/perf_hooks.md | 19 | ||||
-rw-r--r-- | src/node_perf.cc | 20 | ||||
-rw-r--r-- | src/node_perf.h | 24 | ||||
-rw-r--r-- | test/parallel/test-performance-gc.js | 4 |
4 files changed, 65 insertions, 2 deletions
diff --git a/doc/api/perf_hooks.md b/doc/api/perf_hooks.md index 02dee38bae1..36668b5cc53 100644 --- a/doc/api/perf_hooks.md +++ b/doc/api/perf_hooks.md @@ -201,6 +201,25 @@ The value may be one of: * `perf_hooks.constants.NODE_PERFORMANCE_GC_INCREMENTAL` * `perf_hooks.constants.NODE_PERFORMANCE_GC_WEAKCB` +### performanceEntry.flags +<!-- YAML +added: REPLACEME +--> + +* {number} + +When `performanceEntry.entryType` is equal to `'gc'`, the `performance.flags` +property contains additional information about garbage collection operation. +The value may be one of: + +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_NO` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_FORCED` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY` +* `perf_hooks.constants.NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE` + ## Class: `PerformanceNodeTiming extends PerformanceEntry` <!-- YAML added: v8.5.0 diff --git a/src/node_perf.cc b/src/node_perf.cc index 0536c39f6c7..68b015f33ed 100644 --- a/src/node_perf.cc +++ b/src/node_perf.cc @@ -244,6 +244,10 @@ void PerformanceGCCallback(Environment* env, env->kind_string(), Integer::New(env->isolate(), entry->gckind()), attr).Check(); + obj->DefineOwnProperty(context, + env->flags_string(), + Integer::New(env->isolate(), entry->gcflags()), + attr).Check(); PerformanceEntry::Notify(env, entry->kind(), obj); } } @@ -270,6 +274,7 @@ void MarkGarbageCollectionEnd(Isolate* isolate, auto entry = std::make_unique<GCPerformanceEntry>( env, static_cast<PerformanceGCKind>(type), + static_cast<PerformanceGCFlags>(flags), state->performance_last_gc_start_mark, PERFORMANCE_NOW()); env->SetUnrefImmediate([entry = std::move(entry)](Environment* env) mutable { @@ -587,6 +592,21 @@ void Initialize(Local<Object> target, NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_INCREMENTAL); NODE_DEFINE_CONSTANT(constants, NODE_PERFORMANCE_GC_WEAKCB); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_NO); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_FORCED); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY); + NODE_DEFINE_CONSTANT( + constants, NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE); + #define V(name, _) \ NODE_DEFINE_HIDDEN_CONSTANT(constants, NODE_PERFORMANCE_ENTRY_TYPE_##name); NODE_PERFORMANCE_ENTRY_TYPES(V) diff --git a/src/node_perf.h b/src/node_perf.h index c5e45261c2c..4f5ca93f223 100644 --- a/src/node_perf.h +++ b/src/node_perf.h @@ -21,6 +21,7 @@ namespace performance { using v8::FunctionCallbackInfo; using v8::GCType; +using v8::GCCallbackFlags; using v8::Local; using v8::Object; using v8::Value; @@ -110,19 +111,40 @@ enum PerformanceGCKind { NODE_PERFORMANCE_GC_WEAKCB = GCType::kGCTypeProcessWeakCallbacks }; +enum PerformanceGCFlags { + NODE_PERFORMANCE_GC_FLAGS_NO = + GCCallbackFlags::kNoGCCallbackFlags, + NODE_PERFORMANCE_GC_FLAGS_CONSTRUCT_RETAINED = + GCCallbackFlags::kGCCallbackFlagConstructRetainedObjectInfos, + NODE_PERFORMANCE_GC_FLAGS_FORCED = + GCCallbackFlags::kGCCallbackFlagForced, + NODE_PERFORMANCE_GC_FLAGS_SYNCHRONOUS_PHANTOM_PROCESSING = + GCCallbackFlags::kGCCallbackFlagSynchronousPhantomCallbackProcessing, + NODE_PERFORMANCE_GC_FLAGS_ALL_AVAILABLE_GARBAGE = + GCCallbackFlags::kGCCallbackFlagCollectAllAvailableGarbage, + NODE_PERFORMANCE_GC_FLAGS_ALL_EXTERNAL_MEMORY = + GCCallbackFlags::kGCCallbackFlagCollectAllExternalMemory, + NODE_PERFORMANCE_GC_FLAGS_SCHEDULE_IDLE = + GCCallbackFlags::kGCCallbackScheduleIdleGarbageCollection +}; + class GCPerformanceEntry : public PerformanceEntry { public: GCPerformanceEntry(Environment* env, PerformanceGCKind gckind, + PerformanceGCFlags gcflags, uint64_t startTime, uint64_t endTime) : PerformanceEntry(env, "gc", "gc", startTime, endTime), - gckind_(gckind) { } + gckind_(gckind), + gcflags_(gcflags) { } PerformanceGCKind gckind() const { return gckind_; } + PerformanceGCFlags gcflags() const { return gcflags_; } private: PerformanceGCKind gckind_; + PerformanceGCFlags gcflags_; }; class ELDHistogram : public HandleWrap, public Histogram { diff --git a/test/parallel/test-performance-gc.js b/test/parallel/test-performance-gc.js index d071cddbcf0..aef0ee14254 100644 --- a/test/parallel/test-performance-gc.js +++ b/test/parallel/test-performance-gc.js @@ -12,7 +12,8 @@ const { NODE_PERFORMANCE_GC_MAJOR, NODE_PERFORMANCE_GC_MINOR, NODE_PERFORMANCE_GC_INCREMENTAL, - NODE_PERFORMANCE_GC_WEAKCB + NODE_PERFORMANCE_GC_WEAKCB, + NODE_PERFORMANCE_GC_FLAGS_FORCED } = constants; const kinds = [ @@ -30,6 +31,7 @@ const kinds = [ assert.strictEqual(entry.name, 'gc'); assert.strictEqual(entry.entryType, 'gc'); assert(kinds.includes(entry.kind)); + assert.strictEqual(entry.flags, NODE_PERFORMANCE_GC_FLAGS_FORCED); assert.strictEqual(typeof entry.startTime, 'number'); assert.strictEqual(typeof entry.duration, 'number'); obs.disconnect(); |