Skip to content

Commit b9a3c02

Browse files
committed
fix(profiling) segfault on close
1 parent 0812b24 commit b9a3c02

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

packages/profiling-node/bindings/cpu_profiler.cc

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ enum class ProfileStatus {
7373

7474
class MeasurementsTicker {
7575
private:
76-
uv_timer_t timer;
76+
uv_timer_t* timer;
7777
uint64_t period_ms;
7878
std::unordered_map<std::string,
7979
const std::function<bool(uint64_t, v8::HeapStatistics &)>>
@@ -86,13 +86,15 @@ class MeasurementsTicker {
8686

8787
public:
8888
MeasurementsTicker(uv_loop_t *loop)
89-
: period_ms(100), isolate(v8::Isolate::GetCurrent()) {
90-
uv_timer_init(loop, &timer);
91-
uv_handle_set_data(reinterpret_cast<uv_handle_t *>(&timer), this);
92-
uv_unref(reinterpret_cast<uv_handle_t *>(&timer));
89+
: period_ms(100),
90+
isolate(v8::Isolate::GetCurrent()) {
91+
timer = new uv_timer_t;
92+
uv_timer_init(loop, timer);
93+
uv_handle_set_data((uv_handle_t*)timer, this);
94+
uv_ref((uv_handle_t*)timer);
9395
}
9496

95-
static void ticker(uv_timer_t *);
97+
static void ticker(uv_timer_t*);
9698
// Memory listeners
9799
void heap_callback();
98100
void add_heap_listener(
@@ -111,9 +113,17 @@ class MeasurementsTicker {
111113

112114
size_t listener_count();
113115

114-
void Cleanup() {
115-
uv_timer_stop(&timer);
116-
uv_close(reinterpret_cast<uv_handle_t *>(&timer), nullptr);
116+
~MeasurementsTicker() {
117+
uv_handle_t* handle = (uv_handle_t*)timer;
118+
119+
uv_timer_stop(timer);
120+
uv_unref(handle);
121+
122+
if (!uv_is_closing(handle)) {
123+
uv_close(handle, [](uv_handle_t *handle) {
124+
delete handle;
125+
});
126+
}
117127
}
118128
};
119129

@@ -137,8 +147,8 @@ void MeasurementsTicker::add_heap_listener(
137147
heap_listeners.emplace(profile_id, cb);
138148

139149
if (listener_count() == 1) {
140-
uv_timer_set_repeat(&timer, period_ms);
141-
uv_timer_start(&timer, ticker, 0, period_ms);
150+
uv_timer_set_repeat(timer, period_ms);
151+
uv_timer_start(timer, ticker, 0, period_ms);
142152
}
143153
}
144154

@@ -148,7 +158,7 @@ void MeasurementsTicker::remove_heap_listener(
148158
heap_listeners.erase(profile_id);
149159

150160
if (listener_count() == 0) {
151-
uv_timer_stop(&timer);
161+
uv_timer_stop(timer);
152162
}
153163
};
154164

@@ -202,12 +212,12 @@ void MeasurementsTicker::cpu_callback() {
202212
uv_free_cpu_info(cpu, count);
203213
};
204214

205-
void MeasurementsTicker::ticker(uv_timer_t *handle) {
215+
void MeasurementsTicker::ticker(uv_timer_t* handle) {
206216
if (handle == nullptr) {
207217
return;
208218
}
209219

210-
MeasurementsTicker *self = static_cast<MeasurementsTicker *>(handle->data);
220+
MeasurementsTicker *self = static_cast<MeasurementsTicker*>(handle->data);
211221
self->heap_callback();
212222
self->cpu_callback();
213223
}
@@ -217,8 +227,8 @@ void MeasurementsTicker::add_cpu_listener(
217227
cpu_listeners.emplace(profile_id, cb);
218228

219229
if (listener_count() == 1) {
220-
uv_timer_set_repeat(&timer, period_ms);
221-
uv_timer_start(&timer, ticker, 0, period_ms);
230+
uv_timer_set_repeat(timer, period_ms);
231+
uv_timer_start(timer, ticker, 0, period_ms);
222232
}
223233
}
224234

@@ -227,7 +237,7 @@ void MeasurementsTicker::remove_cpu_listener(
227237
cpu_listeners.erase(profile_id);
228238

229239
if (listener_count() == 0) {
230-
uv_timer_stop(&timer);
240+
uv_timer_stop(timer);
231241
}
232242
};
233243

@@ -1149,7 +1159,6 @@ void FreeAddonData(napi_env env, void *data, void *hint) {
11491159
profiler->cpu_profiler = nullptr;
11501160
}
11511161

1152-
profiler->measurements_ticker.Cleanup();
11531162
delete profiler;
11541163
}
11551164

0 commit comments

Comments
 (0)