worker: optimize cpu profile implement · nodejs/node@2e54411

@@ -915,9 +915,6 @@ void Worker::StartCpuProfile(const FunctionCallbackInfo<Value>& args) {

915915

ASSIGN_OR_RETURN_UNWRAP(&w, args.This());

916916

Environment* env = w->env();

917917918-

CHECK(args[0]->IsString());

919-

node::Utf8Value name(env->isolate(), args[0]);

920-921918

AsyncHooks::DefaultTriggerAsyncIdScope trigger_id_scope(w);

922919

Local<Object> wrap;

923920

if (!env->worker_cpu_profile_taker_template()

@@ -930,25 +927,23 @@ void Worker::StartCpuProfile(const FunctionCallbackInfo<Value>& args) {

930927

MakeDetachedBaseObject<WorkerCpuProfileTaker>(env, wrap);

931928932929

bool scheduled = w->RequestInterrupt([taker = std::move(taker),

933-

name = name.ToString(),

934930

env](Environment* worker_env) mutable {

935-

CpuProfilingResult result = worker_env->StartCpuProfile(name);

931+

CpuProfilingResult result = worker_env->StartCpuProfile();

936932

env->SetImmediateThreadsafe(

937-

[taker = std::move(taker),

938-

status = result.status](Environment* env) mutable {

933+

[taker = std::move(taker), result = result](Environment* env) mutable {

939934

Isolate* isolate = env->isolate();

940935

HandleScope handle_scope(isolate);

941936

Context::Scope context_scope(env->context());

942937

AsyncHooks::DefaultTriggerAsyncIdScope trigger_id_scope(taker.get());

943938

Local<Value> argv[] = {

944-

Null(isolate), // error

939+

Null(isolate), // error

940+

Undefined(isolate), // profile id

945941

};

946-

if (status == CpuProfilingStatus::kAlreadyStarted) {

947-

argv[0] = ERR_CPU_PROFILE_ALREADY_STARTED(

948-

isolate, "CPU profile already started");

949-

} else if (status == CpuProfilingStatus::kErrorTooManyProfilers) {

942+

if (result.status == CpuProfilingStatus::kErrorTooManyProfilers) {

950943

argv[0] = ERR_CPU_PROFILE_TOO_MANY(

951944

isolate, "There are too many CPU profiles");

945+

} else if (result.status == CpuProfilingStatus::kStarted) {

946+

argv[1] = Number::New(isolate, result.id);

952947

}

953948

taker->MakeCallback(env->ondone_string(), arraysize(argv), argv);

954949

},

@@ -965,8 +960,8 @@ void Worker::StopCpuProfile(const FunctionCallbackInfo<Value>& args) {

965960

ASSIGN_OR_RETURN_UNWRAP(&w, args.This());

966961967962

Environment* env = w->env();

968-

CHECK(args[0]->IsString());

969-

node::Utf8Value name(env->isolate(), args[0]);

963+

CHECK(args[0]->IsUint32());

964+

uint32_t profile_id = args[0]->Uint32Value(env->context()).FromJust();

970965971966

AsyncHooks::DefaultTriggerAsyncIdScope trigger_id_scope(w);

972967

Local<Object> wrap;

@@ -980,11 +975,11 @@ void Worker::StopCpuProfile(const FunctionCallbackInfo<Value>& args) {

980975

MakeDetachedBaseObject<WorkerCpuProfileTaker>(env, wrap);

981976982977

bool scheduled = w->RequestInterrupt([taker = std::move(taker),

983-

name = name.ToString(),

978+

profile_id = profile_id,

984979

env](Environment* worker_env) mutable {

985980

bool found = false;

986981

auto json_out_stream = std::make_unique<node::JSONOutputStream>();

987-

CpuProfile* profile = worker_env->StopCpuProfile(name);

982+

CpuProfile* profile = worker_env->StopCpuProfile(profile_id);

988983

if (profile) {

989984

profile->Serialize(json_out_stream.get(),

990985

CpuProfile::SerializationFormat::kJSON);