summaryrefslogtreecommitdiff
path: root/Zend/zend_arena.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-06-18 17:09:37 +0400
committerDmitry Stogov <dmitry@zend.com>2014-06-18 17:09:37 +0400
commita4f38192ecbbc7ece3a6070b8bac4468e890f476 (patch)
tree9630538078c49244a47ae603bb4ed96c0fb69283 /Zend/zend_arena.h
parent98afbc7f75580386a86b1f616ed96416d1a97b7e (diff)
downloadphp-git-a4f38192ecbbc7ece3a6070b8bac4468e890f476.tar.gz
Use arena allocator for optimizer temporary data structures
Diffstat (limited to 'Zend/zend_arena.h')
-rw-r--r--Zend/zend_arena.h24
1 files changed, 21 insertions, 3 deletions
diff --git a/Zend/zend_arena.h b/Zend/zend_arena.h
index 68fb660bbb..69ac6687ef 100644
--- a/Zend/zend_arena.h
+++ b/Zend/zend_arena.h
@@ -78,17 +78,35 @@ static zend_always_inline void* zend_arena_alloc(zend_arena **arena_ptr, size_t
return (void*) ptr;
}
-static zend_always_inline void* zend_arena_calloc(zend_arena **arena_ptr, size_t unit_size, size_t count)
+static zend_always_inline void* zend_arena_calloc(zend_arena **arena_ptr, size_t count, size_t unit_size)
{
- size_t size = ZEND_MM_ALIGNED_SIZE(unit_size) * count;
+ size_t size = unit_size * count;
void *ret;
- ZEND_ASSERT(size > ZEND_MM_ALIGNED_SIZE(unit_size) && size > count);
+ ZEND_ASSERT(size >= unit_size && size >= count);
ret = zend_arena_alloc(arena_ptr, size);
memset(ret, 0, size);
return ret;
}
+static zend_always_inline void* zend_arena_checkpoint(zend_arena *arena)
+{
+ return arena->ptr;
+}
+
+static zend_always_inline void zend_arena_release(zend_arena **arena_ptr, void *checkpoint)
+{
+ zend_arena *arena = *arena_ptr;
+
+ while (UNEXPECTED((char*)checkpoint > arena->end) ||
+ UNEXPECTED((char*)checkpoint < (char*)arena)) {
+ zend_arena *prev = arena->prev;
+ efree(arena);
+ *arena_ptr = arena = prev;
+ }
+ arena->ptr = (char*)checkpoint;
+}
+
#endif /* _ZEND_ARENA_H_ */
/*