@thermopylae/lib.pool
v1.0.1
Published
Resources pool.
Downloads
26
Maintainers
Readme
Resources pool.
Install
npm install @thermopylae/lib.pool
Description
This package contains a set of pools for resource management:
- Array Object Pool - a pool which manages object resources. Internal implementation uses a single array to keep used and free objects. All operations are constant, while memory footprint is low.
- DLL Object Pool - a pool which manages object resources. Internal implementation uses two doubly linked lists to keep used and free objects. All operations are constant, while memory footprint is higher than the one of Array Object Pool.
The 'go-to' option is Array Object Pool.
Usage
ArrayObjectPool:
import { ArrayObjectPool } from '@thermopylae/lib.pool';
/* Create a static pool */
const pool = new ArrayObjectPool({
// if you ommit capacity, pool will grow as you use it
capacity: 1,
initializer(cacheEntry, args) {
cacheEntry['key'] = args[0];
cacheEntry['value'] = args[1];
return cacheEntry;
},
deInitializer(cacheEntry) {
// GC can collect the values now
cacheEntry['key'] = undefined;
cacheEntry['value'] = undefined;
return cacheEntry;
}
});
/* Acquire resource */
const resourceHandle = pool.acquire('key1', 'value1');
console.log(resourceHandle.value); // { key: 'key1', value: 'value1' }
try {
pool.acquire('key1', 'value1');
} catch (e) {
console.error(e);
}
/* Release resource */
pool.release(resourceHandle);
/* Release all resources */
pool.acquire('key1', 'value1');
pool.releaseAll(); // after releasing all resources, you can acquire them again
/* Clear pool */
// it's RECOMMENDED to release resources before calling clear,
// as this method won't call object destructors
pool.clear(); // after this operation pool should no longer be used
DLLObjectPool:
import { DLLObjectPool } from '@thermopylae/lib.pool';
/* Create pool */
const pool = new DLLObjectPool({
capacity: 1,
constructor(key: string, value: string) {
return { key, value };
},
initializer(cacheEntry: object, key: string, value: string) {
cacheEntry.key = key;
cacheEntry.value = value;
return cacheEntry;
},
destructor(cacheEntry: object) {
cacheEntry.key = undefined;
cacheEntry.value = undefined;
return cacheEntry;
}
});
/* Use pool */
let resourceHandle = pool.acquire('key1', 'value1');
console.log(resourceHandle.value); // { key: 'key1', value: 'value1' }
pool.releaseHandle(resourceHandle);
console.log(resourceHandle.value); // { key: undefined, value: undefined }
const cacheEntry = { key: 'key', value: 'value' };
resourceHandle = pool.preempt(cacheEntry);
console.log(resourceHandle.value); // { key: 'key', value: 'value' }
pool.releaseObject(cacheEntry); // works slower, has O(n) complexity
pool.acquire('key', 'value');
pool.releaseAll(); // after release all, objects can be acquired again
API Reference
API documentation is available here.
It can also be generated by issuing the following commands:
git clone [email protected]:marinrusu1997/thermopylae.git
cd thermopylae
yarn install
yarn workspace @thermopylae/lib.pool run doc
Author
👤 Rusu Marin
- GitHub: @marinrusu1997
- Email: [email protected]
- LinkedIn: @marinrusu1997
📝 License
Copyright © 2021 Rusu Marin. This project is MIT licensed.