diff options
author | Dmitry Stogov <dmitry@zend.com> | 2017-11-15 11:33:32 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2017-11-15 11:33:32 +0300 |
commit | e2c9dfb5de2a34df980159603f8ebd75ddfce087 (patch) | |
tree | 4ad8cddc6f7f76d411a8f02ecfb6e1cca89d97a2 /ext/mysqlnd/mysqlnd_block_alloc.c | |
parent | de5cc9017efee667f00d11ec6886c45801294a90 (diff) | |
download | php-git-e2c9dfb5de2a34df980159603f8ebd75ddfce087.tar.gz |
Cleanup. Make difference between MYSQLND_ROW_BUFFER and MYSQLND_MEMORY_POOL_CHUNK (the last one is completely removed).
Diffstat (limited to 'ext/mysqlnd/mysqlnd_block_alloc.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd_block_alloc.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/ext/mysqlnd/mysqlnd_block_alloc.c b/ext/mysqlnd/mysqlnd_block_alloc.c index 2ca242d0cf..db183a4fb3 100644 --- a/ext/mysqlnd/mysqlnd_block_alloc.c +++ b/ext/mysqlnd/mysqlnd_block_alloc.c @@ -78,16 +78,17 @@ static zend_always_inline void* mysqlnd_arena_alloc(zend_arena **arena_ptr, size /* {{{ mysqlnd_mempool_free_chunk */ static void -mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL * pool, MYSQLND_MEMORY_POOL_CHUNK * chunk) +mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL * pool, void * ptr) { DBG_ENTER("mysqlnd_mempool_free_chunk"); /* Try to back-off and guess if this is the last block allocated */ - if ((char*)chunk == (char*)pool->arena->ptr - ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_MEMORY_POOL_CHUNK) + chunk->size)) { + if (ptr == pool->last) { /* This was the last allocation. Lucky us, we can free a bit of memory from the pool. Next time we will return from the same ptr. */ - pool->arena->ptr = (char*)chunk; + pool->arena->ptr = (char*)ptr; + pool->last = NULL; } DBG_VOID_RETURN; } @@ -95,41 +96,40 @@ mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL * pool, MYSQLND_MEMORY_POOL_CHUNK /* {{{ mysqlnd_mempool_resize_chunk */ -static MYSQLND_MEMORY_POOL_CHUNK * -mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL * pool, MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size) +static void * +mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL * pool, void * ptr, size_t old_size, size_t size) { DBG_ENTER("mysqlnd_mempool_resize_chunk"); /* Try to back-off and guess if this is the last block allocated */ - if (((char*)chunk == (char*)pool->arena->ptr - ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_MEMORY_POOL_CHUNK) + chunk->size)) - && (ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_MEMORY_POOL_CHUNK) + size) <= ((char*)pool->arena->end - (char*)chunk))) { + if (ptr == pool->last + && (ZEND_MM_ALIGNED_SIZE(size) <= ((char*)pool->arena->end - (char*)ptr))) { /* This was the last allocation. Lucky us, we can free a bit of memory from the pool. Next time we will return from the same ptr. */ - pool->arena->ptr = (char*)chunk + ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_MEMORY_POOL_CHUNK) + size); + pool->arena->ptr = (char*)ptr + ZEND_MM_ALIGNED_SIZE(size); } else { - MYSQLND_MEMORY_POOL_CHUNK *new_chunk = mysqlnd_arena_alloc(&pool->arena, sizeof(MYSQLND_MEMORY_POOL_CHUNK) + size); - memcpy(new_chunk, chunk, sizeof(MYSQLND_MEMORY_POOL_CHUNK) + MIN(size, chunk->size)); - chunk = new_chunk; + void *new_ptr = mysqlnd_arena_alloc(&pool->arena, size); + memcpy(new_ptr, ptr, MIN(old_size, size)); + pool->last = ptr = new_ptr; } - chunk->size = size; - DBG_RETURN(chunk); + DBG_RETURN(ptr); } /* }}} */ /* {{{ mysqlnd_mempool_get_chunk */ -static MYSQLND_MEMORY_POOL_CHUNK * -mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool, unsigned int size) +static void * +mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool, size_t size) { - MYSQLND_MEMORY_POOL_CHUNK *chunk = NULL; + void *ptr = NULL; DBG_ENTER("mysqlnd_mempool_get_chunk"); - chunk = mysqlnd_arena_alloc(&pool->arena, sizeof(MYSQLND_MEMORY_POOL_CHUNK) + size); - chunk->size = size; + ptr = mysqlnd_arena_alloc(&pool->arena, size); + pool->last = ptr; - DBG_RETURN(chunk); + DBG_RETURN(ptr); } /* }}} */ |