From a132569bb636b5f91c12174ca11bd9ad67d446ed Mon Sep 17 00:00:00 2001 From: Fred Kuo Date: Wed, 29 Jan 2014 00:31:27 +0000 Subject: [PATCH 1/2] add barrier.abort --- lib/vasync.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/vasync.js b/lib/vasync.js index 00bfdbc..38fbe8f 100644 --- a/lib/vasync.js +++ b/lib/vasync.js @@ -434,6 +434,7 @@ function Barrier(args) this.recent = []; } + this.aborted = {}; this.pending = {}; this.scheduled = false; } @@ -444,14 +445,22 @@ Barrier.prototype.start = function (name) { mod_assert.ok(!this.pending.hasOwnProperty(name), 'operation "' + name + '" is already pending'); + + if (this.aborted.hasOwnProperty(name)) + delete this.aborted[name]; + this.pending[name] = Date.now(); }; Barrier.prototype.done = function (name) { - mod_assert.ok(this.pending.hasOwnProperty(name), + mod_assert.ok(this.pending.hasOwnProperty(name) || + this.aborted.hasOwnProperty(name), 'operation "' + name + '" is not pending'); + if (this.aborted.hasOwnProperty(name)) + return; + if (this.recent) { this.recent.push({ 'name': name, @@ -494,3 +503,15 @@ Barrier.prototype.done = function (name) self.emit('drain'); }); }; + +Barrier.prototype.abort = function (err) +{ + var self = this; + + var now = Date.now(); + Object.keys(this.pending).forEach(function (name) { + self.aborted[name] = now; + }); + this.pending = {}; + this.emit('drain', err); +}; From 96126af3156e0b1a63f009befa2364ceda108fc0 Mon Sep 17 00:00:00 2001 From: Fred Kuo Date: Wed, 29 Jan 2014 00:45:12 +0000 Subject: [PATCH 2/2] send abort's drain on next tick --- lib/vasync.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/vasync.js b/lib/vasync.js index 38fbe8f..fe6f501 100644 --- a/lib/vasync.js +++ b/lib/vasync.js @@ -513,5 +513,10 @@ Barrier.prototype.abort = function (err) self.aborted[name] = now; }); this.pending = {}; - this.emit('drain', err); + this.scheduled = true; + + setImmediate(function () { + self.scheduled = false; + self.emit('drain', err); + }); };