andrey Tue Jun 16 09:15:38 2009 UTC Modified files: (Branch: PHP_5_3) /php-src/ext/mysqlnd mysqlnd_block_alloc.c mysqlnd_block_alloc.h mysqlnd_ps.c mysqlnd_result.c mysqlnd_structs.h mysqlnd_wireprotocol.c Log: MFH: Hardwire function call instead of using callbacks. We don't actually need callbacks, it was done for making 2 functions static, not to pollute the global functions space but that had its price of 8 bytes overheat per allocation, which is just too much. Also making the app member 32b instead of 64b, which should save additional 4 byte, to the total of 12 byte per allocation of a row buffer.
http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_block_alloc.c?r1=1.1.2.6&r2=1.1.2.7&diff_format=u Index: php-src/ext/mysqlnd/mysqlnd_block_alloc.c diff -u php-src/ext/mysqlnd/mysqlnd_block_alloc.c:1.1.2.6 php-src/ext/mysqlnd/mysqlnd_block_alloc.c:1.1.2.7 --- php-src/ext/mysqlnd/mysqlnd_block_alloc.c:1.1.2.6 Thu Jun 11 08:52:06 2009 +++ php-src/ext/mysqlnd/mysqlnd_block_alloc.c Tue Jun 16 09:15:38 2009 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_block_alloc.c,v 1.1.2.6 2009/06/11 08:52:06 andrey Exp $ */ +/* $Id: mysqlnd_block_alloc.c,v 1.1.2.7 2009/06/16 09:15:38 andrey Exp $ */ #include "php.h" #include "mysqlnd.h" @@ -35,7 +35,7 @@ DBG_ENTER("mysqlnd_mempool_dtor"); for (i = 0; i < pool->free_chunk_list_elements; i++) { MYSQLND_MEMORY_POOL_CHUNK * chunk = pool->free_chunk_list[i]; - chunk->free_chunk(chunk, FALSE TSRMLS_CC); + mysqlnd_mempool_free_chunk(chunk, FALSE TSRMLS_CC); } DBG_VOID_RETURN; @@ -44,11 +44,14 @@ /* {{{ mysqlnd_mempool_free_chunk */ -static void +void mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL_CHUNK * chunk, zend_bool cache_it TSRMLS_DC) { MYSQLND_MEMORY_POOL * pool = chunk->pool; DBG_ENTER("mysqlnd_mempool_free_chunk"); + if (!chunk) { + DBG_VOID_RETURN; + } if (chunk->from_pool) { /* Try to back-off and guess if this is the last block allocated */ if (chunk->ptr == (pool->arena + (pool->arena_size - pool->free_size - chunk->size))) { @@ -60,14 +63,14 @@ } pool->refcount--; } else { - mnd_free(chunk->ptr); + mnd_efree(chunk->ptr); } if (cache_it && pool->free_chunk_list_elements < MYSQLND_MEMORY_POOL_CHUNK_LIST_SIZE) { chunk->ptr = NULL; pool->free_chunk_list[pool->free_chunk_list_elements++] = chunk; } else { /* We did not cache it -> free it */ - mnd_free(chunk); + mnd_efree(chunk); } DBG_VOID_RETURN; } @@ -75,7 +78,7 @@ /* {{{ mysqlnd_mempool_resize_chunk */ -static void +void mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC) { DBG_ENTER("mysqlnd_mempool_resize_chunk"); @@ -132,11 +135,9 @@ if (pool->free_chunk_list_elements) { chunk = pool->free_chunk_list[--pool->free_chunk_list_elements]; } else { - chunk = mnd_malloc(sizeof(MYSQLND_MEMORY_POOL_CHUNK)); + chunk = mnd_emalloc(sizeof(MYSQLND_MEMORY_POOL_CHUNK)); } - chunk->free_chunk = mysqlnd_mempool_free_chunk; - chunk->resize_chunk = mysqlnd_mempool_resize_chunk; chunk->size = size; /* Should not go over MYSQLND_MAX_PACKET_SIZE, since we @@ -145,7 +146,7 @@ */ chunk->pool = pool; if (size > pool->free_size) { - chunk->ptr = mnd_malloc(size); + chunk->ptr = mnd_emalloc(size); chunk->from_pool = FALSE; } else { chunk->from_pool = TRUE; @@ -164,13 +165,13 @@ mysqlnd_mempool_create(size_t arena_size TSRMLS_DC) { /* We calloc, because we free(). We don't mnd_calloc() for a reason. */ - MYSQLND_MEMORY_POOL * ret = mnd_calloc(1, sizeof(MYSQLND_MEMORY_POOL)); + MYSQLND_MEMORY_POOL * ret = mnd_ecalloc(1, sizeof(MYSQLND_MEMORY_POOL)); DBG_ENTER("mysqlnd_mempool_create"); ret->free_size = ret->arena_size = arena_size; ret->refcount = 0; /* OOM ? */ - ret->arena = mnd_malloc(ret->arena_size); + ret->arena = mnd_emalloc(ret->arena_size); ret->get_chunk = mysqlnd_mempool_get_chunk; DBG_RETURN(ret); @@ -186,8 +187,8 @@ if (pool) { /* mnd_free will reference LOCK_access and might crash, depending on the caller...*/ mysqlnd_mempool_free_contents(pool TSRMLS_CC); - mnd_free(pool->arena); - mnd_free(pool); + mnd_efree(pool->arena); + mnd_efree(pool); } DBG_VOID_RETURN; } http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_block_alloc.h?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/ext/mysqlnd/mysqlnd_block_alloc.h diff -u php-src/ext/mysqlnd/mysqlnd_block_alloc.h:1.1.2.2 php-src/ext/mysqlnd/mysqlnd_block_alloc.h:1.1.2.3 --- php-src/ext/mysqlnd/mysqlnd_block_alloc.h:1.1.2.2 Wed Dec 31 11:15:39 2008 +++ php-src/ext/mysqlnd/mysqlnd_block_alloc.h Tue Jun 16 09:15:38 2009 @@ -18,13 +18,16 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_block_alloc.h,v 1.1.2.2 2008/12/31 11:15:39 sebastian Exp $ */ +/* $Id: mysqlnd_block_alloc.h,v 1.1.2.3 2009/06/16 09:15:38 andrey Exp $ */ #ifndef MYSQLND_BLOCK_ALLOC_H #define MYSQLND_BLOCK_ALLOC_H MYSQLND_MEMORY_POOL * mysqlnd_mempool_create(size_t arena_size TSRMLS_DC); void mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC); +void mysqlnd_mempool_resize_chunk(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC); +void mysqlnd_mempool_free_chunk(MYSQLND_MEMORY_POOL_CHUNK * chunk, zend_bool cache_it TSRMLS_DC); + #endif /* MYSQLND_BLOCK_ALLOC_H */ http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_ps.c?r1=1.3.2.27&r2=1.3.2.28&diff_format=u Index: php-src/ext/mysqlnd/mysqlnd_ps.c diff -u php-src/ext/mysqlnd/mysqlnd_ps.c:1.3.2.27 php-src/ext/mysqlnd/mysqlnd_ps.c:1.3.2.28 --- php-src/ext/mysqlnd/mysqlnd_ps.c:1.3.2.27 Fri May 29 12:19:40 2009 +++ php-src/ext/mysqlnd/mysqlnd_ps.c Tue Jun 16 09:15:38 2009 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_ps.c,v 1.3.2.27 2009/05/29 12:19:40 andrey Exp $ */ +/* $Id: mysqlnd_ps.c,v 1.3.2.28 2009/06/16 09:15:38 andrey Exp $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_wireprotocol.h" @@ -885,7 +885,7 @@ the bound variables. Thus we need to do part of what it does or Zend will report leaks. */ - row_packet->row_buffer->free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); row_packet->row_buffer = NULL; } } else if (ret == FAIL) { @@ -1060,13 +1060,13 @@ the bound variables. Thus we need to do part of what it does or Zend will report leaks. */ - row_packet->row_buffer->free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); row_packet->row_buffer = NULL; } /* We asked for one row, the next one should be EOF, eat it */ ret = PACKET_READ(row_packet, result->conn); if (row_packet->row_buffer) { - row_packet->row_buffer->free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC); row_packet->row_buffer = NULL; } MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR); http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_result.c?r1=1.4.2.29&r2=1.4.2.30&diff_format=u Index: php-src/ext/mysqlnd/mysqlnd_result.c diff -u php-src/ext/mysqlnd/mysqlnd_result.c:1.4.2.29 php-src/ext/mysqlnd/mysqlnd_result.c:1.4.2.30 --- php-src/ext/mysqlnd/mysqlnd_result.c:1.4.2.29 Thu May 28 17:47:37 2009 +++ php-src/ext/mysqlnd/mysqlnd_result.c Tue Jun 16 09:15:38 2009 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_result.c,v 1.4.2.29 2009/05/28 17:47:37 andrey Exp $ */ +/* $Id: mysqlnd_result.c,v 1.4.2.30 2009/06/16 09:15:38 andrey Exp $ */ #include "php.h" #include "mysqlnd.h" #include "mysqlnd_wireprotocol.h" @@ -177,7 +177,7 @@ if (unbuf->last_row_buffer) { DBG_INF("Freeing last row buffer"); /* Nothing points to this buffer now, free it */ - unbuf->last_row_buffer->free_chunk(unbuf->last_row_buffer, TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(unbuf->last_row_buffer, TRUE TSRMLS_CC); unbuf->last_row_buffer = NULL; } @@ -219,7 +219,7 @@ #if MYSQLND_DEBUG_MEMORY DBG_INF("Freeing current_row & current_buffer"); #endif - current_buffer->free_chunk(current_buffer, TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(current_buffer, TRUE TSRMLS_CC); } DBG_INF("Freeing data & row_buffer"); if (set->data) { http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_structs.h?r1=1.2.2.19&r2=1.2.2.20&diff_format=u Index: php-src/ext/mysqlnd/mysqlnd_structs.h diff -u php-src/ext/mysqlnd/mysqlnd_structs.h:1.2.2.19 php-src/ext/mysqlnd/mysqlnd_structs.h:1.2.2.20 --- php-src/ext/mysqlnd/mysqlnd_structs.h:1.2.2.19 Wed Dec 31 11:15:39 2008 +++ php-src/ext/mysqlnd/mysqlnd_structs.h Tue Jun 16 09:15:38 2009 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysqlnd_structs.h,v 1.2.2.19 2008/12/31 11:15:39 sebastian Exp $ */ +/* $Id: mysqlnd_structs.h,v 1.2.2.20 2009/06/16 09:15:38 andrey Exp $ */ #ifndef MYSQLND_STRUCTS_H #define MYSQLND_STRUCTS_H @@ -45,12 +45,10 @@ struct st_mysqlnd_memory_pool_chunk { - uint64_t app; + uint32_t app; MYSQLND_MEMORY_POOL *pool; zend_uchar *ptr; - unsigned int size; - void (*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC); - void (*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, zend_bool cache_it TSRMLS_DC); + uint32_t size; zend_bool from_pool; }; http://cvs.php.net/viewvc.cgi/php-src/ext/mysqlnd/mysqlnd_wireprotocol.c?r1=1.4.2.30&r2=1.4.2.31&diff_format=u Index: php-src/ext/mysqlnd/mysqlnd_wireprotocol.c diff -u php-src/ext/mysqlnd/mysqlnd_wireprotocol.c:1.4.2.30 php-src/ext/mysqlnd/mysqlnd_wireprotocol.c:1.4.2.31 --- php-src/ext/mysqlnd/mysqlnd_wireprotocol.c:1.4.2.30 Fri Jun 12 13:24:57 2009 +++ php-src/ext/mysqlnd/mysqlnd_wireprotocol.c Tue Jun 16 09:15:38 2009 @@ -1326,7 +1326,7 @@ We need a trailing \0 for the last string, in case of text-mode, to be able to implement read-only variables. */ - (*buffer)->resize_chunk((*buffer), *data_size + 1 TSRMLS_CC); + mysqlnd_mempool_resize_chunk((*buffer), *data_size + 1 TSRMLS_CC); /* The position could have changed, recalculate */ p = (*buffer)->ptr + (*data_size - header.size); } @@ -1343,7 +1343,7 @@ } } if (ret == FAIL && (*buffer)) { - (*buffer)->free_chunk((*buffer), TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(*buffer, TRUE TSRMLS_CC); *buffer = NULL; } *data_size -= prealloc_more_bytes; @@ -1826,7 +1826,7 @@ DBG_ENTER("php_mysqlnd_rowp_free_mem"); p = (php_mysql_packet_row *) _packet; if (p->row_buffer) { - p->row_buffer->free_chunk(p->row_buffer, TRUE TSRMLS_CC); + mysqlnd_mempool_free_chunk(p->row_buffer, TRUE TSRMLS_CC); p->row_buffer = NULL; } DBG_INF_FMT("alloca=%d persistent=%d", (int)alloca, (int)p->header.persistent);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php