#include "dpiImpl.h"
int dpiHandlePool__acquire(dpiHandlePool *pool, void **handle, dpiError *error)
{
void **tempHandles;
uint32_t numSlots;
dpiMutex__acquire(pool->mutex);
if (pool->acquirePos != pool->releasePos) {
*handle = pool->handles[pool->acquirePos];
pool->handles[pool->acquirePos++] = NULL;
if (pool->acquirePos == pool->numSlots)
pool->acquirePos = 0;
} else {
*handle = NULL;
pool->numUsedSlots++;
if (pool->numUsedSlots > pool->numSlots) {
numSlots = pool->numSlots + 8;
if (dpiUtils__allocateMemory(numSlots, sizeof(void*), 1,
"allocate slots", (void**) &tempHandles, error) < 0) {
dpiMutex__release(pool->mutex);
return DPI_FAILURE;
}
memcpy(tempHandles, pool->handles, pool->numSlots * sizeof(void*));
dpiUtils__freeMemory(pool->handles);
pool->handles = tempHandles;
pool->numSlots = numSlots;
}
}
dpiMutex__release(pool->mutex);
return DPI_SUCCESS;
}
int dpiHandlePool__create(dpiHandlePool **pool, dpiError *error)
{
dpiHandlePool *tempPool;
if (dpiUtils__allocateMemory(1, sizeof(dpiHandlePool), 0,
"allocate handle pool", (void**) &tempPool, error) < 0)
return DPI_FAILURE;
tempPool->numSlots = 8;
tempPool->numUsedSlots = 0;
if (dpiUtils__allocateMemory(tempPool->numSlots, sizeof(void*), 1,
"allocate handle pool slots", (void**) &tempPool->handles,
error) < 0) {
dpiUtils__freeMemory(tempPool);
return DPI_FAILURE;
}
dpiMutex__initialize(tempPool->mutex);
tempPool->acquirePos = 0;
tempPool->releasePos = 0;
*pool = tempPool;
return DPI_SUCCESS;
}
void dpiHandlePool__free(dpiHandlePool *pool)
{
if (pool->handles) {
dpiUtils__freeMemory(pool->handles);
pool->handles = NULL;
}
dpiMutex__destroy(pool->mutex);
dpiUtils__freeMemory(pool);
}
void dpiHandlePool__release(dpiHandlePool *pool, void **handle)
{
dpiMutex__acquire(pool->mutex);
pool->handles[pool->releasePos++] = *handle;
*handle = NULL;
if (pool->releasePos == pool->numSlots)
pool->releasePos = 0;
dpiMutex__release(pool->mutex);
}