} alloc_prefix_t;
#define PREFIX_SIZE sizeof(struct alloc_prefix_s)
-
+//#define DEBUG 1
/*
* bitflag tools for Variable and a Flag
*/
real_size = size;
}
- while ((real_size & (sizeof(void *) - 1)) > 0) {
- real_size++;
- }
-
/*
* We use a specific free bits calculation here because if we are
* freeing 10 bytes then we will be putting it into the 8-byte free
*/
block_p = (ks_pool_block_t *) ((char *) free_addr - sizeof(ks_pool_block_t));
if (block_p->mb_magic != BLOCK_MAGIC || block_p->mb_magic2 != BLOCK_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
+
return KS_STATUS_POOL_OVER;
}
prefix = (alloc_prefix_t *) addr;
prefix->m1 = PRE_MAGIC1;
prefix->m2 = PRE_MAGIC2;
- prefix->size = size;
+ prefix->size = size + fence + PREFIX_SIZE;
prefix->refs = 1;
if (mp_p->mp_log_func != NULL) {
/* maintain our stats */
mp_p->mp_alloc_c++;
- mp_p->mp_user_alloc += size;
+ mp_p->mp_user_alloc += prefix->size;
if (mp_p->mp_user_alloc > mp_p->mp_max_alloc) {
mp_p->mp_max_alloc = mp_p->mp_user_alloc;
}
*/
static int free_mem(ks_pool_t *mp_p, void *addr)
{
- unsigned long size, old_size, fence;
+ unsigned long size;
int ret;
ks_pool_block_t *block_p;
alloc_prefix_t *prefix;
prefix = (alloc_prefix_t *) ((char *) addr - PREFIX_SIZE);
if (!(prefix->m1 == PRE_MAGIC1 && prefix->m2 == PRE_MAGIC2)) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_INVALID_POINTER;
}
if (size > MAX_BLOCK_USER_MEMORY(mp_p)) {
block_p = (ks_pool_block_t *) ((char *) addr - PREFIX_SIZE - sizeof(ks_pool_block_t));
if (block_p->mb_magic != BLOCK_MAGIC || block_p->mb_magic2 != BLOCK_MAGIC) {
- return KS_STATUS_POOL_OVER;
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
+ return KS_STATUS_INVALID_POINTER;
}
}
- /* make sure we have enough bytes */
- if (size < MIN_ALLOCATION) {
- old_size = MIN_ALLOCATION;
- } else {
- old_size = size;
- }
-
/* find the user's magic numbers */
- ret = check_magic(addr, old_size);
+ ret = check_magic(addr, size - FENCE_SIZE - PREFIX_SIZE);
perform_pool_cleanup_on_free(mp_p, addr);
addr = prefix;
if (ret != KS_STATUS_SUCCESS) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return ret;
}
- fence = FENCE_SIZE;
- /* now we free the pointer */
- ret = free_pointer(mp_p, addr, old_size + fence + PREFIX_SIZE);
+ ret = free_pointer(mp_p, addr, size);
+
if (ret != KS_STATUS_SUCCESS) {
return ret;
}
- mp_p->mp_user_alloc -= old_size;
+
+ mp_p->mp_user_alloc -= size;
/* adjust our stats */
mp_p->mp_alloc_c--;
return KS_STATUS_ARG_NULL;
}
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_PNT;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_POOL_OVER;
}
return KS_STATUS_ARG_NULL;
}
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_PNT;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_POOL_OVER;
}
/* free the blocks */
for (block_p = mp_p->mp_first_p; block_p != NULL; block_p = block_p->mb_next_p) {
if (block_p->mb_magic != BLOCK_MAGIC || block_p->mb_magic2 != BLOCK_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
final = KS_STATUS_POOL_OVER;
break;
}
ks_assert(mp_p);
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_PNT);
return NULL;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_POOL_OVER);
return NULL;
}
ks_assert(mp_p);
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_PNT);
return NULL;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_POOL_OVER);
return NULL;
}
ks_mutex_lock(mp_p->mutex);
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
r = KS_STATUS_PNT;
goto end;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
r = KS_STATUS_POOL_OVER;
goto end;
}
alloc_prefix_t *prefix;
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_PNT);
return NULL;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_POOL_OVER);
return NULL;
}
prefix = (alloc_prefix_t *) ((char *) addr - PREFIX_SIZE);
if (!(prefix->m1 == PRE_MAGIC1 && prefix->m2 == PRE_MAGIC2)) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_INVALID_POINTER);
return NULL;
}
*/
KS_DECLARE(void *) ks_pool_resize_ex(ks_pool_t *mp_p, void *old_addr, const unsigned long new_byte_size, ks_status_t *error_p)
{
- unsigned long copy_size, new_size, old_size, old_byte_size;
+ unsigned long copy_size, new_size, old_byte_size;
void *new_addr;
ks_pool_block_t *block_p;
int ret;
}
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_PNT);
return NULL;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_POOL_OVER);
return NULL;
}
prefix = (alloc_prefix_t *) ((char *) old_addr - PREFIX_SIZE);
if (!(prefix->m1 == PRE_MAGIC1 && prefix->m2 == PRE_MAGIC2)) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_INVALID_POINTER);
return NULL;
}
if (old_byte_size > MAX_BLOCK_USER_MEMORY(mp_p)) {
block_p = (ks_pool_block_t *) ((char *) old_addr - PREFIX_SIZE - sizeof(ks_pool_block_t));
if (block_p->mb_magic != BLOCK_MAGIC || block_p->mb_magic2 != BLOCK_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, KS_STATUS_POOL_OVER);
new_addr = NULL;
goto end;
}
}
- /* make sure we have enough bytes */
- if (old_byte_size < MIN_ALLOCATION) {
- old_size = MIN_ALLOCATION;
- } else {
- old_size = old_byte_size;
- }
-
- /* verify that the size matches exactly */
-
- if (old_size > 0) {
- ret = check_magic(old_addr, old_size);
+ if (old_byte_size > 0) {
+ ret = check_magic(old_addr, old_byte_size - FENCE_SIZE - PREFIX_SIZE);
if (ret != KS_STATUS_SUCCESS) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
SET_POINTER(error_p, ret);
new_addr = NULL;
goto end;
return KS_STATUS_ARG_NULL;
}
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_PNT;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_POOL_OVER;
}
return KS_STATUS_ARG_NULL;
}
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_PNT;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_POOL_OVER;
}
return KS_STATUS_ARG_NULL;
}
if (mp_p->mp_magic != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_PNT;
}
if (mp_p->mp_magic2 != KS_POOL_MAGIC) {
+ if (!(mp_p->mp_flags & KS_POOL_FLAG_NO_ASSERT)) {
+ abort();
+ }
return KS_STATUS_POOL_OVER;
}