; | |
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; | |
}; | |
} | |