Skip to content

Commit

Permalink
async_wrap: clear destroy_ids vector
Browse files Browse the repository at this point in the history
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
trevnorris authored and MylesBorins committed Jan 31, 2017
1 parent cfa1b5a commit d532d74
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
6 changes: 5 additions & 1 deletion src/async-wrap.cc
Expand Up @@ -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());
Expand All @@ -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();
} }




Expand Down
14 changes: 13 additions & 1 deletion test/parallel/test-async-wrap-uid.js
Expand Up @@ -5,15 +5,22 @@ 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) {
storage.set(uid, { storage.set(uid, {
init: true, init: true,
pre: false, pre: false,
post: false, post: false,
destroy: false,
}); });
} }


Expand All @@ -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);
}); });
Expand All @@ -46,6 +57,7 @@ process.once('exit', function() {
init: true, init: true,
pre: true, pre: true,
post: true, post: true,
destroy: true,
}); });
} }
}); });

0 comments on commit d532d74

Please sign in to comment.