Permalink
Browse files

async_wrap: clear destroy_ids vector

After processing all the callbacks in the destroy_ids vector make sure
to clear() it otherwise the DestroyIdsCb() won't run again.

PR-URL: #10400
Fixes: b49b496 "async_wrap: call destroy() callback in uv_idle_t"
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information...
1 parent 5e5b1f8 commit d1843ec3a79030157dd205331947c66199ba30fc @trevnorris trevnorris committed with evanlucas Dec 21, 2016
Showing with 18 additions and 2 deletions.
  1. +5 −1 src/async-wrap.cc
  2. +13 −1 test/parallel/test-async-wrap-uid.js
View
@@ -199,7 +199,9 @@ void AsyncWrap::DestroyIdsCb(uv_idle_t* handle) {
TryCatch try_catch(env->isolate());
- for (auto current_id : *env->destroy_ids_list()) {
+ std::vector<int64_t> destroy_ids_list;
+ destroy_ids_list.swap(*env->destroy_ids_list());
+ for (auto current_id : destroy_ids_list) {
// Want each callback to be cleaned up after itself, instead of cleaning
// them all up after the while() loop completes.
HandleScope scope(env->isolate());
@@ -212,6 +214,8 @@ void AsyncWrap::DestroyIdsCb(uv_idle_t* handle) {
FatalException(env->isolate(), try_catch);
}
}
+
+ env->destroy_ids_list()->clear();
}
@@ -5,15 +5,22 @@ const fs = require('fs');
const assert = require('assert');
const async_wrap = process.binding('async_wrap');
+// Give the event loop time to clear out the final uv_close().
+var si_cntr = 3;
+process.on('beforeExit', () => {
+ if (--si_cntr > 0) setImmediate(() => {});
+});
+
const storage = new Map();
-async_wrap.setupHooks({ init, pre, post });
+async_wrap.setupHooks({ init, pre, post, destroy });
async_wrap.enable();
function init(uid) {
storage.set(uid, {
init: true,
pre: false,
post: false,
+ destroy: false,
});
}
@@ -25,6 +32,10 @@ function post(uid) {
storage.get(uid).post = true;
}
+function destroy(uid) {
+ storage.get(uid).destroy = true;
+}
+
fs.access(__filename, function(err) {
assert.ifError(err);
});
@@ -46,6 +57,7 @@ process.once('exit', function() {
init: true,
pre: true,
post: true,
+ destroy: true,
});
}
});

0 comments on commit d1843ec

Please sign in to comment.