summaryrefslogtreecommitdiff
path: root/Zend
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
parent63526e633eab576cc927d51ff801a66737441b6c (diff)
downloadphp-git-56adbffdbff07997a7e05e7e4bee470ee524ffff.tar.gz
- Commit static allocator structure which we might use in an upcoming Zend
- change
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_static_allocator.c58
-rw-r--r--Zend/zend_static_allocator.h30
2 files changed, 88 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);
+}
diff --git a/Zend/zend_static_allocator.h b/Zend/zend_static_allocator.h
new file mode 100644
index 0000000000..132d18283a
--- /dev/null
+++ b/Zend/zend_static_allocator.h
@@ -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 */