diff options
author | Andi Gutmans <andi@php.net> | 2000-06-23 00:04:05 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2000-06-23 00:04:05 +0000 |
commit | 56adbffdbff07997a7e05e7e4bee470ee524ffff (patch) | |
tree | aac57626bcc72c7e5ce2ed2d5595ca15aa5bc346 /Zend/zend_static_allocator.c | |
parent | 63526e633eab576cc927d51ff801a66737441b6c (diff) | |
download | php-git-56adbffdbff07997a7e05e7e4bee470ee524ffff.tar.gz |
- Commit static allocator structure which we might use in an upcoming Zend
- change
Diffstat (limited to 'Zend/zend_static_allocator.c')
-rw-r--r-- | Zend/zend_static_allocator.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/Zend/zend_static_allocator.c b/Zend/zend_static_allocator.c new file mode 100644 index 0000000000..af89a8c7bc --- /dev/null +++ b/Zend/zend_static_allocator.c @@ -0,0 +1,58 @@ +#include <stdlib.h> + +#include "zend_static_allocator.h" + +/* Not checking emalloc() and erealloc() return values as they are supposed to bailout */ + +inline static void block_init(Block *block, zend_uint block_size) +{ + block->pos = block->bp = (char *) emalloc(block_size); + block->end = block->bp + block_size; +} + +inline static char *block_allocate(Block *block, zend_uint size) +{ + char *retval = block->pos; + if ((block->pos += size) >= block->end) { + return (char *)NULL; + } + return retval; +} + +inline static void block_destroy(Block *block) +{ + efree(block->bp); +} + +int static_allocator_init(StaticAllocator *sa) +{ + sa->Blocks = (Block *) emalloc(sizeof(Block)); + block_init(sa->Blocks, ALLOCATOR_BLOCK_SIZE); + sa->num_blocks = 1; + sa->current_block = 0; +} + +char *static_allocator_allocate(StaticAllocator *sa, zend_uint size) +{ + char *retval; + + retval = block_allocate(&sa->Blocks[sa->current_block], size); + if (retval) { + return retval; + } + sa->Blocks = (Block *) erealloc(sa->Blocks, ++sa->num_blocks); + sa->current_block++; + block_init(&sa->Blocks[sa->current_block], (size > ALLOCATOR_BLOCK_SIZE) ? size : ALLOCATOR_BLOCK_SIZE); + retval = block_allocate(&sa->Blocks[sa->current_block], size); + return retval; +} + +void static_allocator_destroy(StaticAllocator *sa) +{ + zend_uint i; + + for (i=0; i<sa->num_blocks; i++) { + block_free(&sa->Blocks[i]); + } + efree(sa->Blocks); +} |