diff options
author | Kyle Farnung <kfarnung@microsoft.com> | 2018-01-22 22:43:35 +0300 |
---|---|---|
committer | Kyle Farnung <kfarnung@microsoft.com> | 2018-01-25 04:29:45 +0300 |
commit | be2cbccf003d110cad00317090072788021efa56 (patch) | |
tree | 6a5431d3abcd80b1b7a13335988f22b34df698e8 | |
parent | 142d6237b6b24d80c96fd2c68be471d29bb079e3 (diff) |
http2,perf_hooks: perf state using AliasedBuffer
Update performance_state to use AliasedBuffer and update usage sites.
PR-URL: https://github.com/nodejs/node/pull/18300
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r-- | src/env-inl.h | 5 | ||||
-rw-r--r-- | src/env.h | 4 | ||||
-rw-r--r-- | src/node_http2.cc | 3 | ||||
-rw-r--r-- | src/node_perf.cc | 35 | ||||
-rw-r--r-- | src/node_perf_common.h | 31 |
5 files changed, 50 insertions, 28 deletions
diff --git a/src/env-inl.h b/src/env-inl.h index 4a6e73cc388..2a004f58153 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -344,7 +344,7 @@ inline Environment::Environment(IsolateData* isolate_data, AssignToContext(context, ContextInfo("")); destroy_async_id_list_.reserve(512); - performance_state_ = Calloc<performance::performance_state>(1); + performance_state_.reset(new performance::performance_state(isolate())); performance_state_->milestones[ performance::NODE_PERFORMANCE_MILESTONE_ENVIRONMENT] = PERFORMANCE_NOW(); @@ -377,7 +377,6 @@ inline Environment::~Environment() { delete[] heap_statistics_buffer_; delete[] heap_space_statistics_buffer_; delete[] http_parser_buffer_; - free(performance_state_); } inline v8::Isolate* Environment::isolate() const { @@ -583,7 +582,7 @@ void Environment::SetUnrefImmediate(native_immediate_callback cb, } inline performance::performance_state* Environment::performance_state() { - return performance_state_; + return performance_state_.get(); } inline std::map<std::string, uint64_t>* Environment::performance_marks() { diff --git a/src/env.h b/src/env.h index a1f505c4fe1..198cda1d52c 100644 --- a/src/env.h +++ b/src/env.h @@ -48,7 +48,7 @@ struct nghttp2_rcbuf; namespace node { namespace performance { -struct performance_state; +class performance_state; } namespace loader { @@ -758,7 +758,7 @@ class Environment { int should_not_abort_scope_counter_ = 0; - performance::performance_state* performance_state_ = nullptr; + std::unique_ptr<performance::performance_state> performance_state_; std::map<std::string, uint64_t> performance_marks_; #if HAVE_INSPECTOR diff --git a/src/node_http2.cc b/src/node_http2.cc index cd28f57ffe2..bd7eeee8655 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -554,7 +554,8 @@ Http2Session::~Http2Session() { } inline bool HasHttp2Observer(Environment* env) { - uint32_t* observers = env->performance_state()->observers; + AliasedBuffer<uint32_t, v8::Uint32Array>& observers = + env->performance_state()->observers; return observers[performance::NODE_PERFORMANCE_ENTRY_TYPE_HTTP2] != 0; } diff --git a/src/node_perf.cc b/src/node_perf.cc index 34e6a35000e..4c3dfbe4eb7 100644 --- a/src/node_perf.cc +++ b/src/node_perf.cc @@ -85,9 +85,9 @@ void PerformanceEntry::Notify(Environment* env, PerformanceEntryType type, Local<Value> object) { Context::Scope scope(env->context()); - uint32_t* observers = env->performance_state()->observers; - if (observers != nullptr && - type != NODE_PERFORMANCE_ENTRY_TYPE_INVALID && + AliasedBuffer<uint32_t, v8::Uint32Array>& observers = + env->performance_state()->observers; + if (type != NODE_PERFORMANCE_ENTRY_TYPE_INVALID && observers[type]) { node::MakeCallback(env->isolate(), env->process_object(), @@ -130,7 +130,8 @@ void Measure(const FunctionCallbackInfo<Value>& args) { Utf8Value startMark(env->isolate(), args[1]); Utf8Value endMark(env->isolate(), args[2]); - double* milestones = env->performance_state()->milestones; + AliasedBuffer<double, v8::Float64Array>& milestones = + env->performance_state()->milestones; uint64_t startTimestamp = timeOrigin; uint64_t start = GetPerformanceMark(env, *startMark); @@ -165,7 +166,8 @@ void Measure(const FunctionCallbackInfo<Value>& args) { void MarkMilestone(const FunctionCallbackInfo<Value>& args) { Environment* env = Environment::GetCurrent(args); Local<Context> context = env->context(); - double* milestones = env->performance_state()->milestones; + AliasedBuffer<double, v8::Float64Array>& milestones = + env->performance_state()->milestones; PerformanceMilestone milestone = static_cast<PerformanceMilestone>( args[0]->Int32Value(context).ToChecked()); @@ -187,7 +189,8 @@ void PerformanceGCCallback(Environment* env, void* ptr) { HandleScope scope(env->isolate()); Local<Context> context = env->context(); - uint32_t* observers = env->performance_state()->observers; + AliasedBuffer<uint32_t, v8::Uint32Array>& observers = + env->performance_state()->observers; if (observers[NODE_PERFORMANCE_ENTRY_TYPE_GC]) { Local<Object> obj = entry->ToObject(); v8::PropertyAttribute attr = @@ -289,8 +292,8 @@ void TimerFunctionCall(const FunctionCallbackInfo<Value>& args) { args.GetReturnValue().Set(ret.ToLocalChecked()); } - - uint32_t* observers = env->performance_state()->observers; + AliasedBuffer<uint32_t, v8::Uint32Array>& observers = + env->performance_state()->observers; if (!observers[NODE_PERFORMANCE_ENTRY_TYPE_FUNCTION]) return; @@ -323,16 +326,12 @@ void Init(Local<Object> target, performance_state* state = env->performance_state(); auto state_ab = ArrayBuffer::New(isolate, state, sizeof(*state)); - #define SET_STATE_TYPEDARRAY(name, type, field) \ - target->Set(context, \ - FIXED_ONE_BYTE_STRING(isolate, (name)), \ - type::New(state_ab, \ - offsetof(performance_state, field), \ - arraysize(state->field))) \ - .FromJust() - SET_STATE_TYPEDARRAY("observerCounts", v8::Uint32Array, observers); - SET_STATE_TYPEDARRAY("milestones", v8::Float64Array, milestones); - #undef SET_STATE_TYPEDARRAY + target->Set(context, + FIXED_ONE_BYTE_STRING(isolate, "observerCounts"), + state->observers.GetJSArray()).FromJust(); + target->Set(context, + FIXED_ONE_BYTE_STRING(isolate, "milestones"), + state->milestones.GetJSArray()).FromJust(); Local<String> performanceEntryString = FIXED_ONE_BYTE_STRING(isolate, "PerformanceEntry"); diff --git a/src/node_perf_common.h b/src/node_perf_common.h index 713f126d7f7..435a4cffe5a 100644 --- a/src/node_perf_common.h +++ b/src/node_perf_common.h @@ -61,10 +61,33 @@ enum PerformanceEntryType { node::performance::NODE_PERFORMANCE_MILESTONE_##n); \ } while (0); -struct performance_state { - // doubles first so that they are always sizeof(double)-aligned - double milestones[NODE_PERFORMANCE_MILESTONE_INVALID]; - uint32_t observers[NODE_PERFORMANCE_ENTRY_TYPE_INVALID]; +class performance_state { + public: + explicit performance_state(v8::Isolate* isolate) : + root( + isolate, + sizeof(performance_state_internal)), + milestones( + isolate, + offsetof(performance_state_internal, milestones), + NODE_PERFORMANCE_MILESTONE_INVALID, + root), + observers( + isolate, + offsetof(performance_state_internal, observers), + NODE_PERFORMANCE_ENTRY_TYPE_INVALID, + root) {} + + AliasedBuffer<uint8_t, v8::Uint8Array> root; + AliasedBuffer<double, v8::Float64Array> milestones; + AliasedBuffer<uint32_t, v8::Uint32Array> observers; + + private: + struct performance_state_internal { + // doubles first so that they are always sizeof(double)-aligned + double milestones[NODE_PERFORMANCE_MILESTONE_INVALID]; + uint32_t observers[NODE_PERFORMANCE_ENTRY_TYPE_INVALID]; + }; }; } // namespace performance |