@@ -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 &)>>
@@ -86,13 +86,15 @@ class MeasurementsTicker {
86
86
87
87
public:
88
88
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);
93
95
}
94
96
95
- static void ticker (uv_timer_t *);
97
+ static void ticker (uv_timer_t *);
96
98
// Memory listeners
97
99
void heap_callback ();
98
100
void add_heap_listener (
@@ -111,9 +113,17 @@ class MeasurementsTicker {
111
113
112
114
size_t listener_count ();
113
115
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
+ }
117
127
}
118
128
};
119
129
@@ -137,8 +147,8 @@ void MeasurementsTicker::add_heap_listener(
137
147
heap_listeners.emplace (profile_id, cb);
138
148
139
149
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);
142
152
}
143
153
}
144
154
@@ -148,7 +158,7 @@ void MeasurementsTicker::remove_heap_listener(
148
158
heap_listeners.erase (profile_id);
149
159
150
160
if (listener_count () == 0 ) {
151
- uv_timer_stop (& timer);
161
+ uv_timer_stop (timer);
152
162
}
153
163
};
154
164
@@ -202,12 +212,12 @@ void MeasurementsTicker::cpu_callback() {
202
212
uv_free_cpu_info (cpu, count);
203
213
};
204
214
205
- void MeasurementsTicker::ticker (uv_timer_t * handle) {
215
+ void MeasurementsTicker::ticker (uv_timer_t * handle) {
206
216
if (handle == nullptr ) {
207
217
return ;
208
218
}
209
219
210
- MeasurementsTicker *self = static_cast <MeasurementsTicker *>(handle->data );
220
+ MeasurementsTicker *self = static_cast <MeasurementsTicker*>(handle->data );
211
221
self->heap_callback ();
212
222
self->cpu_callback ();
213
223
}
@@ -217,8 +227,8 @@ void MeasurementsTicker::add_cpu_listener(
217
227
cpu_listeners.emplace (profile_id, cb);
218
228
219
229
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);
222
232
}
223
233
}
224
234
@@ -227,7 +237,7 @@ void MeasurementsTicker::remove_cpu_listener(
227
237
cpu_listeners.erase (profile_id);
228
238
229
239
if (listener_count () == 0 ) {
230
- uv_timer_stop (& timer);
240
+ uv_timer_stop (timer);
231
241
}
232
242
};
233
243
@@ -1149,7 +1159,6 @@ void FreeAddonData(napi_env env, void *data, void *hint) {
1149
1159
profiler->cpu_profiler = nullptr ;
1150
1160
}
1151
1161
1152
- profiler->measurements_ticker .Cleanup ();
1153
1162
delete profiler;
1154
1163
}
1155
1164
0 commit comments