diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-06-18 17:09:37 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-06-18 17:09:37 +0400 |
commit | a4f38192ecbbc7ece3a6070b8bac4468e890f476 (patch) | |
tree | 9630538078c49244a47ae603bb4ed96c0fb69283 /Zend/zend_arena.h | |
parent | 98afbc7f75580386a86b1f616ed96416d1a97b7e (diff) | |
download | php-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.h | 24 |
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_ */ /* |