summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKyle Farnung <kfarnung@microsoft.com>2018-01-22 11:43:35 -0800
committerKyle Farnung <kfarnung@microsoft.com>2018-01-24 17:29:45 -0800
commitbe2cbccf003d110cad00317090072788021efa56 (patch)
tree6a5431d3abcd80b1b7a13335988f22b34df698e8 /src
parent142d6237b6b24d80c96fd2c68be471d29bb079e3 (diff)
downloadandroid-node-v8-be2cbccf003d110cad00317090072788021efa56.tar.gz
android-node-v8-be2cbccf003d110cad00317090072788021efa56.tar.bz2
android-node-v8-be2cbccf003d110cad00317090072788021efa56.zip
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>
Diffstat (limited to 'src')
-rw-r--r--src/env-inl.h5
-rw-r--r--src/env.h4
-rw-r--r--src/node_http2.cc3
-rw-r--r--src/node_perf.cc35
-rw-r--r--src/node_perf_common.h31
5 files changed, 50 insertions, 28 deletions
diff --git a/src/env-inl.h b/src/env-inl.h
index 4a6e73cc38..2a004f5815 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 a1f505c4fe..198cda1d52 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 cd28f57ffe..bd7eeee865 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 34e6a35000..4c3dfbe4eb 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 713f126d7f..435a4cffe5 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