File size: 1,240 Bytes
f8f5b35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
47
48
49
"use strict";
module.exports = pool;

/**

 * An allocator as used by {@link util.pool}.

 * @typedef PoolAllocator

 * @type {function}

 * @param {number} size Buffer size

 * @returns {Uint8Array} Buffer

 */

/**

 * A slicer as used by {@link util.pool}.

 * @typedef PoolSlicer

 * @type {function}

 * @param {number} start Start offset

 * @param {number} end End offset

 * @returns {Uint8Array} Buffer slice

 * @this {Uint8Array}

 */

/**

 * A general purpose buffer pool.

 * @memberof util

 * @function

 * @param {PoolAllocator} alloc Allocator

 * @param {PoolSlicer} slice Slicer

 * @param {number} [size=8192] Slab size

 * @returns {PoolAllocator} Pooled allocator

 */
function pool(alloc, slice, size) {
    var SIZE   = size || 8192;
    var MAX    = SIZE >>> 1;
    var slab   = null;
    var offset = SIZE;
    return function pool_alloc(size) {
        if (size < 1 || size > MAX)
            return alloc(size);
        if (offset + size > SIZE) {
            slab = alloc(SIZE);
            offset = 0;
        }
        var buf = slice.call(slab, offset, offset += size);
        if (offset & 7) // align to 32 bit
            offset = (offset | 7) + 1;
        return buf;
    };
}