andrey Tue Jun 16 09:15:10 2009 UTC
Modified files:
/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:
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.9&r2=1.10&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_block_alloc.c
diff -u php-src/ext/mysqlnd/mysqlnd_block_alloc.c:1.9
php-src/ext/mysqlnd/mysqlnd_block_alloc.c:1.10
--- php-src/ext/mysqlnd/mysqlnd_block_alloc.c:1.9 Thu Jun 11 08:51:20 2009
+++ php-src/ext/mysqlnd/mysqlnd_block_alloc.c Tue Jun 16 09:15:09 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mysqlnd_block_alloc.c,v 1.9 2009/06/11 08:51:20 andrey Exp $ */
+/* $Id: mysqlnd_block_alloc.c,v 1.10 2009/06/16 09:15:09 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.5&r2=1.6&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_block_alloc.h
diff -u php-src/ext/mysqlnd/mysqlnd_block_alloc.h:1.5
php-src/ext/mysqlnd/mysqlnd_block_alloc.h:1.6
--- php-src/ext/mysqlnd/mysqlnd_block_alloc.h:1.5 Wed Dec 31 11:12:33 2008
+++ php-src/ext/mysqlnd/mysqlnd_block_alloc.h Tue Jun 16 09:15:09 2009
@@ -18,13 +18,16 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mysqlnd_block_alloc.h,v 1.5 2008/12/31 11:12:33 sebastian Exp $ */
+/* $Id: mysqlnd_block_alloc.h,v 1.6 2009/06/16 09:15:09 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.30&r2=1.31&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_ps.c
diff -u php-src/ext/mysqlnd/mysqlnd_ps.c:1.30
php-src/ext/mysqlnd/mysqlnd_ps.c:1.31
--- php-src/ext/mysqlnd/mysqlnd_ps.c:1.30 Fri May 29 12:19:26 2009
+++ php-src/ext/mysqlnd/mysqlnd_ps.c Tue Jun 16 09:15:09 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mysqlnd_ps.c,v 1.30 2009/05/29 12:19:26 andrey Exp $ */
+/* $Id: mysqlnd_ps.c,v 1.31 2009/06/16 09:15:09 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.33&r2=1.34&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_result.c
diff -u php-src/ext/mysqlnd/mysqlnd_result.c:1.33
php-src/ext/mysqlnd/mysqlnd_result.c:1.34
--- php-src/ext/mysqlnd/mysqlnd_result.c:1.33 Thu May 28 17:47:18 2009
+++ php-src/ext/mysqlnd/mysqlnd_result.c Tue Jun 16 09:15:09 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mysqlnd_result.c,v 1.33 2009/05/28 17:47:18 andrey Exp $ */
+/* $Id: mysqlnd_result.c,v 1.34 2009/06/16 09:15:09 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.21&r2=1.22&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_structs.h
diff -u php-src/ext/mysqlnd/mysqlnd_structs.h:1.21
php-src/ext/mysqlnd/mysqlnd_structs.h:1.22
--- php-src/ext/mysqlnd/mysqlnd_structs.h:1.21 Wed Dec 31 11:12:33 2008
+++ php-src/ext/mysqlnd/mysqlnd_structs.h Tue Jun 16 09:15:09 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: mysqlnd_structs.h,v 1.21 2008/12/31 11:12:33 sebastian Exp $ */
+/* $Id: mysqlnd_structs.h,v 1.22 2009/06/16 09:15:09 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.32&r2=1.33&diff_format=u
Index: php-src/ext/mysqlnd/mysqlnd_wireprotocol.c
diff -u php-src/ext/mysqlnd/mysqlnd_wireprotocol.c:1.32
php-src/ext/mysqlnd/mysqlnd_wireprotocol.c:1.33
--- php-src/ext/mysqlnd/mysqlnd_wireprotocol.c:1.32 Fri Jun 12 13:24:37 2009
+++ php-src/ext/mysqlnd/mysqlnd_wireprotocol.c Tue Jun 16 09:15:09 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