Browse Source

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: https://github.com/nodejs/node/pull/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>
v6
Trevor Norris 8 years ago
parent
commit
833294f681
No known key found for this signature in database GPG Key ID: 251CA676820DC7F3
  1. 6
      src/async-wrap.cc
  2. 14
      test/parallel/test-async-wrap-uid.js

6
src/async-wrap.cc

@ -199,7 +199,9 @@ void AsyncWrap::DestroyIdsCb(uv_idle_t* handle) {
TryCatch try_catch(env->isolate()); 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 // Want each callback to be cleaned up after itself, instead of cleaning
// them all up after the while() loop completes. // them all up after the while() loop completes.
HandleScope scope(env->isolate()); HandleScope scope(env->isolate());
@ -212,6 +214,8 @@ void AsyncWrap::DestroyIdsCb(uv_idle_t* handle) {
FatalException(env->isolate(), try_catch); FatalException(env->isolate(), try_catch);
} }
} }
env->destroy_ids_list()->clear();
} }

14
test/parallel/test-async-wrap-uid.js

@ -5,8 +5,14 @@ const fs = require('fs');
const assert = require('assert'); const assert = require('assert');
const async_wrap = process.binding('async_wrap'); 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(); const storage = new Map();
async_wrap.setupHooks({ init, pre, post }); async_wrap.setupHooks({ init, pre, post, destroy });
async_wrap.enable(); async_wrap.enable();
function init(uid) { function init(uid) {
@ -14,6 +20,7 @@ function init(uid) {
init: true, init: true,
pre: false, pre: false,
post: false, post: false,
destroy: false,
}); });
} }
@ -25,6 +32,10 @@ function post(uid) {
storage.get(uid).post = true; storage.get(uid).post = true;
} }
function destroy(uid) {
storage.get(uid).destroy = true;
}
fs.access(__filename, function(err) { fs.access(__filename, function(err) {
assert.ifError(err); assert.ifError(err);
}); });
@ -46,6 +57,7 @@ process.once('exit', function() {
init: true, init: true,
pre: true, pre: true,
post: true, post: true,
destroy: true,
}); });
} }
}); });

Loading…
Cancel
Save