/**
|
* Collection of buffers to be shared between async processes.
|
* Avoids allocating buffers each time async process starts.
|
* bufSize - size of each buffer
|
* bufNo - number of buffers
|
* Caller has to make sure no more than bufNo async processes run simultaneously.
|
*/
|
function BufferPool(bufSize, bufNo) {
|
var bufferPool = []
|
for (var i = 0; i < bufNo; i++) {
|
bufferPool.push({
|
buf1: alloc(bufSize),
|
buf2: alloc(bufSize),
|
busy: false
|
})
|
}
|
|
var allocateBuffers = function () {
|
for (var j = 0; j < bufNo; j++) {
|
var bufferPair = bufferPool[j]
|
if (!bufferPair.busy) {
|
bufferPair.busy = true
|
return bufferPair
|
}
|
}
|
throw new Error('Async buffer limit reached')
|
}
|
|
return {
|
allocateBuffers: allocateBuffers,
|
freeBuffers: freeBuffers
|
}
|
|
function freeBuffers(bufferPair) {
|
bufferPair.busy = false
|
}
|
}
|
|
function alloc(bufSize) {
|
if (Buffer.alloc) {
|
return Buffer.alloc(bufSize)
|
}
|
return new Buffer(bufSize)
|
}
|
|
module.exports = BufferPool
|