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());
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();
}

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

@ -5,8 +5,14 @@ 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) {
@ -14,6 +20,7 @@ function init(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,
});
}
});

Loading…
Cancel
Save