Skip to content

Commit

Permalink
http2,perf_hooks: perf state using AliasedBuffer
Browse files Browse the repository at this point in the history
Update performance_state to use AliasedBuffer and update usage sites.

PR-URL: nodejs#18300
Reviewed-By: Anna Henningsen <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
kfarnung committed Jan 25, 2018
1 parent 142d623 commit be2cbcc
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 28 deletions.
5 changes: 2 additions & 3 deletions src/env-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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() {
Expand Down
4 changes: 2 additions & 2 deletions src/env.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ struct nghttp2_rcbuf;
namespace node {

namespace performance {
struct performance_state;
class performance_state;
}

namespace loader {
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion src/node_http2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
35 changes: 17 additions & 18 deletions src/node_perf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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());
Expand All @@ -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 =
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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");
Expand Down
31 changes: 27 additions & 4 deletions src/node_perf_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit be2cbcc

Please sign in to comment.