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