Mercurial > molko
diff src/libmlk-core/core/alloc.c @ 404:7321511052f6
core: rework alloc module
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 02 Apr 2022 16:58:33 +0200 |
parents | d3fa956cdaf0 |
children |
line wrap: on
line diff
--- a/src/libmlk-core/core/alloc.c Sat Apr 02 16:58:23 2022 +0200 +++ b/src/libmlk-core/core/alloc.c Sat Apr 02 16:58:33 2022 +0200 @@ -85,12 +85,7 @@ { assert(size != 0); - void *ptr; - - if ((ptr = funcs->alloc(size))) - memset(ptr, 0, size); - - return ptr; + return memset(funcs->alloc(size), 0, size); } void * @@ -99,12 +94,7 @@ assert(len != 0); assert(elemsize != 0); - size_t size = len * elemsize; - - if (size / len != elemsize) - return errorf("%s", strerror(ENOMEM)), NULL; - - return funcs->alloc(size); + return funcs->alloc(len * elemsize); } void * @@ -113,16 +103,7 @@ assert(len != 0); assert(elemsize != 0); - void *mem; - size_t size = len * elemsize; - - if (size / len != elemsize) - return errorf("%s", strerror(ENOMEM)), NULL; - - if ((mem = funcs->alloc(size))) - memset(mem, 0, size); - - return mem; + return alloc_new0(len * elemsize); } void * @@ -134,23 +115,15 @@ void * alloc_rearray(void *ptr, size_t len, size_t elemsize) { - size_t size = len * elemsize; + assert(elemsize != 0); - if (size / len != elemsize) - return errorf("%s", strerror(ENOMEM)), NULL; - - return funcs->realloc(ptr, size); + return funcs->realloc(ptr, len * elemsize); } void * alloc_rearray0(void *ptr, size_t oldlen, size_t newlen, size_t elemsize) { - size_t size = newlen * elemsize; - - if (size / newlen != elemsize) - return errorf("%s", strerror(ENOMEM)), NULL; - if (!(ptr = funcs->realloc(ptr, size))) - return NULL; + ptr = funcs->realloc(ptr, newlen * elemsize); if (newlen > oldlen) memset((unsigned char *)ptr + (oldlen * elemsize), 0, (newlen - oldlen) * elemsize); @@ -164,12 +137,7 @@ assert(ptr); assert(size != 0); - void *mem; - - if ((mem = funcs->alloc(size))) - memcpy(mem, ptr, size); - - return mem; + return memcpy(funcs->alloc(size), ptr, size); } char * @@ -177,54 +145,41 @@ { assert(src); - char *ret; - size_t length = strlen(src) + 1; + size_t len = strlen(src) + 1; - if ((ret = funcs->alloc(length))) - memcpy(ret, src, length + 1); - - return ret; + return memcpy(funcs->alloc(len), src, len); } char * alloc_sdupf(const char *fmt, ...) { struct buf buf = {0}; - char *ret; va_list ap; va_start(ap, fmt); buf_vprintf(&buf, fmt, ap); va_end(ap); - if (!buf.data) - panicf("%s", strerror(ENOMEM)); - - /* - * We need to reallocate a copy because the API expects to use - * alloc_free. - */ - ret = alloc_dup(buf.data, buf.length + 1); - buf_finish(&buf); - - return ret; + return buf.data; } -int +void +alloc_free(void *ptr) +{ + funcs->free(ptr); +} + +void alloc_pool_init(struct alloc_pool *pool, size_t elemsize, void (*finalizer)(void *)) { assert(pool); assert(elemsize != 0); - if (!(pool->data = alloc_array(ALLOC_POOL_INIT_DEFAULT, elemsize))) - return -1; - + pool->data = alloc_array(ALLOC_POOL_INIT_DEFAULT, elemsize); pool->elemsize = elemsize; pool->size = 0; pool->capacity = ALLOC_POOL_INIT_DEFAULT; pool->finalizer = finalizer; - - return 0; } void * @@ -233,13 +188,8 @@ assert(pool); if (pool->size >= pool->capacity) { - void *newptr = alloc_rearray(pool->data, pool->capacity * 2, pool->elemsize); - - if (!newptr) - return NULL; - - pool->data = newptr; pool->capacity *= 2; + pool->data = alloc_rearray(pool->data, pool->capacity, pool->elemsize); } return ((unsigned char *)pool->data) + pool->size++ * pool->elemsize; @@ -254,11 +204,29 @@ return ((unsigned char *)pool->data) + index * pool->elemsize; } +void * +alloc_pool_shrink(struct alloc_pool *pool) +{ + assert(pool); + + void *ptr; + + ptr = alloc_rearray(pool->data, pool->size, pool->elemsize); + memset(pool, 0, sizeof (*pool)); + + return ptr; +} + void alloc_pool_finish(struct alloc_pool *pool) { + unsigned char *tab; + + if (!pool) + return; + if (pool->finalizer) { - unsigned char *tab = pool->data; + tab = pool->data; for (size_t i = 0; i < pool->size; ++i) pool->finalizer(tab + i * pool->elemsize);