diff options
-rw-r--r-- | ext/mysql/php_mysql.c | 2 | ||||
-rw-r--r-- | ext/mysqli/mysqli_nonapi.c | 2 | ||||
-rw-r--r-- | ext/mysqlnd/mysqlnd.c | 20 | ||||
-rw-r--r-- | ext/mysqlnd/mysqlnd.h | 7 |
4 files changed, 22 insertions, 9 deletions
diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 140d945003..0e5319cb21 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -791,7 +791,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) } } else { #ifdef MYSQL_USE_MYSQLND - mysqlnd_restart_psession(mysql->conn); + mysqlnd_restart_psession(mysql->conn, MySG(mysqlnd_thd_zval_cache)); #endif } } diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c index 27e6b4ebd4..8c67e30799 100644 --- a/ext/mysqli/mysqli_nonapi.c +++ b/ext/mysqli/mysqli_nonapi.c @@ -170,7 +170,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne if (!mysql_ping(mysql->mysql)) { #endif #ifdef MYSQLI_USE_MYSQLND - mysqlnd_restart_psession(mysql->mysql); + mysqlnd_restart_psession(mysql->mysql, MyG(mysqlnd_thd_zval_cache)); #endif MyG(num_active_persistent)++; goto end; diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 6394e0f06a..cd21ebed56 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -442,7 +442,7 @@ MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn, /* {{{ _mysqlnd_restart_psession */ -PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC) +PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC) { DBG_ENTER("_mysqlnd_restart_psession"); MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_REUSED); @@ -451,15 +451,27 @@ PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC) mnd_pefree(conn->last_message, conn->persistent); conn->last_message = NULL; } + conn->zval_cache = cache; DBG_VOID_RETURN; } /* }}} */ -/* {{{ mysqlnd_end_psession */ -PHPAPI void mysqlnd_end_psession(MYSQLND *conn) +/* {{{ _mysqlnd_end_psession */ +PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC) { - + DBG_ENTER("_mysqlnd_end_psession"); + /* + BEWARE!!!! This will have a problem with a query cache. + We need to move the data out of the zval cache before we end the psession. + Or we will use nirvana pointers!! + */ + if (conn->zval_cache) { + DBG_INF("Freeing zval cache reference"); + mysqlnd_palloc_free_thd_cache_reference(&conn->zval_cache); + conn->zval_cache = NULL; + } + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index 9e6c0e665d..cc6afab51c 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -67,9 +67,10 @@ void mysqlnd_library_init(TSRMLS_D); void mysqlnd_library_end(TSRMLS_D); -#define mysqlnd_restart_psession(conn) _mysqlnd_restart_psession((conn) TSRMLS_CC) -PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC); -PHPAPI void mysqlnd_end_psession(MYSQLND *conn); +#define mysqlnd_restart_psession(conn, cache) _mysqlnd_restart_psession((conn), (cache) TSRMLS_CC) +PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC); +#define mysqlnd_end_psession(conn) _mysqlnd_end_psession((conn) TSRMLS_CC) +PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC); PHPAPI void mysqlnd_minfo_print_hash(zval *values); #define mysqlnd_thread_safe() TRUE |