@@ -73,7 +73,7 @@ enum class ProfileStatus {
73
73
74
74
class MeasurementsTicker {
75
75
private:
76
- uv_timer_t timer;
76
+ uv_timer_t * timer;
77
77
uint64_t period_ms;
78
78
std::unordered_map<std::string,
79
79
const std::function<bool (uint64_t , v8::HeapStatistics &)>>
@@ -87,9 +87,10 @@ class MeasurementsTicker {
87
87
public:
88
88
MeasurementsTicker (uv_loop_t *loop)
89
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));
90
+ timer = new uv_timer_t ;
91
+ uv_timer_init (loop, timer);
92
+ uv_handle_set_data ((uv_handle_t *)timer, this );
93
+ uv_ref ((uv_handle_t *)timer);
93
94
}
94
95
95
96
static void ticker (uv_timer_t *);
@@ -112,13 +113,13 @@ class MeasurementsTicker {
112
113
size_t listener_count ();
113
114
114
115
~MeasurementsTicker () {
115
- uv_timer_stop (&timer) ;
116
+ uv_handle_t *handle = ( uv_handle_t *)timer ;
116
117
117
- auto handle = reinterpret_cast <uv_handle_t *>(&timer);
118
+ uv_timer_stop (timer);
119
+ uv_unref (handle);
118
120
119
- // Calling uv_close on an inactive handle will cause a segfault.
120
- if (uv_is_active (handle)) {
121
- uv_close (handle, nullptr );
121
+ if (!uv_is_closing (handle)) {
122
+ uv_close (handle, [](uv_handle_t *handle) { delete handle; });
122
123
}
123
124
}
124
125
};
@@ -143,8 +144,8 @@ void MeasurementsTicker::add_heap_listener(
143
144
heap_listeners.emplace (profile_id, cb);
144
145
145
146
if (listener_count () == 1 ) {
146
- uv_timer_set_repeat (& timer, period_ms);
147
- uv_timer_start (& timer, ticker, 0 , period_ms);
147
+ uv_timer_set_repeat (timer, period_ms);
148
+ uv_timer_start (timer, ticker, 0 , period_ms);
148
149
}
149
150
}
150
151
@@ -154,7 +155,7 @@ void MeasurementsTicker::remove_heap_listener(
154
155
heap_listeners.erase (profile_id);
155
156
156
157
if (listener_count () == 0 ) {
157
- uv_timer_stop (& timer);
158
+ uv_timer_stop (timer);
158
159
}
159
160
};
160
161
@@ -223,8 +224,8 @@ void MeasurementsTicker::add_cpu_listener(
223
224
cpu_listeners.emplace (profile_id, cb);
224
225
225
226
if (listener_count () == 1 ) {
226
- uv_timer_set_repeat (& timer, period_ms);
227
- uv_timer_start (& timer, ticker, 0 , period_ms);
227
+ uv_timer_set_repeat (timer, period_ms);
228
+ uv_timer_start (timer, ticker, 0 , period_ms);
228
229
}
229
230
}
230
231
@@ -233,7 +234,7 @@ void MeasurementsTicker::remove_cpu_listener(
233
234
cpu_listeners.erase (profile_id);
234
235
235
236
if (listener_count () == 0 ) {
236
- uv_timer_stop (& timer);
237
+ uv_timer_stop (timer);
237
238
}
238
239
};
239
240
0 commit comments