blob: 410b3b36d2491a5a542b87efb70f5855a96dfeb2 [file] [log] [blame]
function SeqQueue(size, maxWaiting) {
this.lo = 0
this.size = size
this.maxWaiting = maxWaiting
this.waiting = 0
this.list = new Array(size)
this.locked = true
}
SeqQueue.prototype.start = function(seq) {
this.locked = false
// The loop in maybeConsume() will make sure that the value wraps correctly
// if necessary.
this.lo = seq + 1
this.maybeConsume()
}
SeqQueue.prototype.stop = function() {
this.locked = true
this.maybeConsume()
}
SeqQueue.prototype.push = function(seq, handler) {
if (seq >= this.size) {
return
}
this.list[seq] = handler
this.waiting += 1
this.maybeConsume()
}
SeqQueue.prototype.maybeConsume = function() {
if (this.locked) {
return
}
while (this.waiting) {
// Did we reach the end of the loop? If so, start from the beginning.
if (this.lo >= this.size) {
this.lo = 0
}
var handler = this.list[this.lo]
// Have we received it yet?
if (handler) {
this.list[this.lo] = undefined
handler()
this.lo += 1
this.waiting -= 1
}
// Are we too much behind? If so, just move on.
else if (this.waiting >= this.maxWaiting) {
this.lo += 1
this.waiting -= 1
}
// We don't have it yet, stop.
else {
break
}
}
}
module.exports = SeqQueue