]> granicus.if.org Git - php/commitdiff
- Commit static allocator structure which we might use in an upcoming Zend
authorAndi Gutmans <andi@php.net>
Fri, 23 Jun 2000 00:04:05 +0000 (00:04 +0000)
committerAndi Gutmans <andi@php.net>
Fri, 23 Jun 2000 00:04:05 +0000 (00:04 +0000)
- change

Zend/zend_static_allocator.c [new file with mode: 0644]
Zend/zend_static_allocator.h [new file with mode: 0644]

diff --git a/Zend/zend_static_allocator.c b/Zend/zend_static_allocator.c
new file mode 100644 (file)
index 0000000..af89a8c
--- /dev/null
@@ -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);
+}
diff --git a/Zend/zend_static_allocator.h b/Zend/zend_static_allocator.h
new file mode 100644 (file)
index 0000000..132d182
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _STATIC_ALLOCATOR_H
+#define _STATIC_ALLOCATOR_H
+
+#define ALLOCATOR_BLOCK_SIZE 400000
+
+typedef unsigned int zend_uint;
+
+typedef struct _Block {
+       char *bp;
+       char *pos;
+       char *end;
+} Block;
+
+typedef struct _StaticAllocator {
+       Block *Blocks;
+       zend_uint num_blocks;
+       zend_uint current_block;
+} StaticAllocator;
+
+int static_allocator_init(StaticAllocator *sa);
+char *static_allocator_allocate(StaticAllocator *sa, zend_uint size);
+void static_allocator_destroy(StaticAllocator *sa);
+
+/* Temporary */
+#define emalloc(s) malloc(s)
+#define efree(p) free(p)
+#define SUCCESS 0
+#define FAILURE -1
+
+#endif /* _STATIC_ALLOCATOR_H */