summaryrefslogtreecommitdiff
path: root/node_modules/dir-compare/src/fs/BufferPool.js
blob: 48febce69ff9a75d5bb54957be9a46ba890abf02 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
 * 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