Fix possible bug with persistent connections

This commit is contained in:
Andrey Hristov 2008-06-24 11:19:07 +00:00
parent 0a7198a297
commit fd699ce7d3
4 changed files with 22 additions and 9 deletions

View file

@ -813,7 +813,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
} }
} else { } else {
#ifdef MYSQL_USE_MYSQLND #ifdef MYSQL_USE_MYSQLND
mysqlnd_restart_psession(mysql->conn); mysqlnd_restart_psession(mysql->conn, MySG(mysqlnd_thd_zval_cache));
#endif #endif
} }
} }

View file

@ -165,7 +165,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
if (!mysql_ping(mysql->mysql)) { if (!mysql_ping(mysql->mysql)) {
#endif #endif
#ifdef MYSQLI_USE_MYSQLND #ifdef MYSQLI_USE_MYSQLND
mysqlnd_restart_psession(mysql->mysql); mysqlnd_restart_psession(mysql->mysql, MyG(mysqlnd_thd_zval_cache));
#endif #endif
MyG(num_active_persistent)++; MyG(num_active_persistent)++;
goto end; goto end;

View file

@ -442,7 +442,7 @@ MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn,
/* {{{ _mysqlnd_restart_psession */ /* {{{ _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"); DBG_ENTER("_mysqlnd_restart_psession");
MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_REUSED); 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); mnd_pefree(conn->last_message, conn->persistent);
conn->last_message = NULL; conn->last_message = NULL;
} }
conn->zval_cache = cache;
DBG_VOID_RETURN; DBG_VOID_RETURN;
} }
/* }}} */ /* }}} */
/* {{{ mysqlnd_end_psession */ /* {{{ _mysqlnd_end_psession */
PHPAPI void mysqlnd_end_psession(MYSQLND *conn) 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;
} }
/* }}} */ /* }}} */

View file

@ -67,9 +67,10 @@
void mysqlnd_library_init(TSRMLS_D); void mysqlnd_library_init(TSRMLS_D);
void mysqlnd_library_end(TSRMLS_D); void mysqlnd_library_end(TSRMLS_D);
#define mysqlnd_restart_psession(conn) _mysqlnd_restart_psession((conn) TSRMLS_CC) #define mysqlnd_restart_psession(conn, cache) _mysqlnd_restart_psession((conn), (cache) TSRMLS_CC)
PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC); PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC);
PHPAPI void mysqlnd_end_psession(MYSQLND *conn); #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); PHPAPI void mysqlnd_minfo_print_hash(zval *values);
#define mysqlnd_thread_safe() TRUE #define mysqlnd_thread_safe() TRUE