summaryrefslogtreecommitdiff
path: root/Zend/zend_static_allocator.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2000-06-23 00:04:05 +0000
committerAndi Gutmans <andi@php.net>2000-06-23 00:04:05 +0000
commit56adbffdbff07997a7e05e7e4bee470ee524ffff (patch)
treeaac57626bcc72c7e5ce2ed2d5595ca15aa5bc346 /Zend/zend_static_allocator.c
parent63526e633eab576cc927d51ff801a66737441b6c (diff)
downloadphp-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.c58
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);
+}