@@ -96,25 +96,25 @@ ELECTRON_DESKTOP_CAPTURER_MODULE(V)
96
96
namespace {
97
97
98
98
void stop_and_close_uv_loop (uv_loop_t * loop) {
99
- // Close any active handles
100
99
uv_stop (loop);
101
- uv_walk (
102
- loop,
103
- [](uv_handle_t * handle, void *) {
104
- if (!uv_is_closing (handle)) {
105
- uv_close (handle, nullptr );
106
- }
107
- },
108
- nullptr );
109
-
110
- // Run the loop to let it finish all the closing handles
111
- // NB: after uv_stop(), uv_run(UV_RUN_DEFAULT) returns 0 when that's done
112
- for (;;)
113
- if (!uv_run (loop, UV_RUN_DEFAULT))
114
- break ;
100
+ int error = uv_loop_close (loop);
101
+
102
+ while (error) {
103
+ uv_run (loop, UV_RUN_DEFAULT);
104
+ uv_stop (loop);
105
+ uv_walk (
106
+ loop,
107
+ [](uv_handle_t * handle, void *) {
108
+ if (!uv_is_closing (handle)) {
109
+ uv_close (handle, nullptr );
110
+ }
111
+ },
112
+ nullptr );
113
+ uv_run (loop, UV_RUN_DEFAULT);
114
+ error = uv_loop_close (loop);
115
+ }
115
116
116
- DCHECK (!uv_loop_alive (loop));
117
- uv_loop_close (loop);
117
+ DCHECK_EQ (error, 0 );
118
118
}
119
119
120
120
bool g_is_initialized = false ;
@@ -274,6 +274,7 @@ NodeBindings::~NodeBindings() {
274
274
// Quit the embed thread.
275
275
embed_closed_ = true ;
276
276
uv_sem_post (&embed_sem_);
277
+
277
278
WakeupEmbedThread ();
278
279
279
280
// Wait for everything to be done.
@@ -284,7 +285,7 @@ NodeBindings::~NodeBindings() {
284
285
uv_close (reinterpret_cast <uv_handle_t *>(&dummy_uv_handle_), nullptr );
285
286
286
287
// Clean up worker loop
287
- if (uv_loop_ == &worker_loop_ )
288
+ if (in_worker_loop () )
288
289
stop_and_close_uv_loop (uv_loop_);
289
290
}
290
291
@@ -501,7 +502,8 @@ void NodeBindings::WakeupMainThread() {
501
502
}
502
503
503
504
void NodeBindings::WakeupEmbedThread () {
504
- uv_async_send (&dummy_uv_handle_);
505
+ if (!in_worker_loop ())
506
+ uv_async_send (&dummy_uv_handle_);
505
507
}
506
508
507
509
// static
0 commit comments