PHPAPI void _mysqlnd_palloc_rshutdown(MYSQLND_THD_ZVAL_PCACHE * cache TSRMLS_DC);
-#define mysqlnd_palloc_init_thd_cache(cache) _mysqlnd_palloc_init_thd_cache((cache) TSRMLS_CC)
#define mysqlnd_palloc_free_thd_cache_reference(cache) _mysqlnd_palloc_free_thd_cache_reference((cache) TSRMLS_CC)
#define mysqlnd_palloc_get_thd_cache_reference(cache) _mysqlnd_palloc_get_thd_cache_reference((cache) TSRMLS_CC)
-PHPAPI MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCACHE * const cache TSRMLS_DC);
MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_get_thd_cache_reference(MYSQLND_THD_ZVAL_PCACHE * const cache TSRMLS_DC);
PHPAPI void _mysqlnd_palloc_free_thd_cache_reference(MYSQLND_THD_ZVAL_PCACHE **cache TSRMLS_DC);
/* {{{ mysqlnd_palloc_get_cache_reference */
+static inline
MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_get_cache_reference(MYSQLND_ZVAL_PCACHE * const cache)
{
if (cache) {
/* }}} */
+/* {{{ mysqlnd_palloc_release_cache_reference */
+static inline
+MYSQLND_ZVAL_PCACHE* mysqlnd_palloc_release_cache_reference(MYSQLND_ZVAL_PCACHE * const cache)
+{
+ if (cache) {
+ LOCK_PCACHE(cache);
+ cache->references--;
+ UNLOCK_PCACHE(cache);
+ }
+ return cache;
+}
+/* }}} */
+
+
/* {{{ mysqlnd_palloc_free_cache */
/*
As this call will happen on MSHUTDOWN(), then we don't need to copy the zvals with
/* {{{ _mysqlnd_palloc_init_thd_cache */
-PHPAPI MYSQLND_THD_ZVAL_PCACHE* _mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCACHE * const cache TSRMLS_DC)
+MYSQLND_THD_ZVAL_PCACHE* mysqlnd_palloc_init_thd_cache(MYSQLND_ZVAL_PCACHE * const cache TSRMLS_DC)
{
MYSQLND_THD_ZVAL_PCACHE *ret = calloc(1, sizeof(MYSQLND_THD_ZVAL_PCACHE));
DBG_ENTER("_mysqlnd_palloc_init_thd_cache");
{
DBG_ENTER("_mysqlnd_palloc_get_thd_cache_reference");
if (cache) {
- ++cache->references;
DBG_INF_FMT("cache=%p new_refc=%d gc_list.canary1=%p gc_list.canary2=%p",
cache, cache->references, cache->gc_list.canary1, cache->gc_list.canary2);
mysqlnd_palloc_get_cache_reference(cache->parent);
+ /* No concurrency here, we are in the same thread */
+ ++cache->references;
}
DBG_RETURN(cache);
}
/* }}} */
-/* {{{ mysqlnd_palloc_free_cache */
+/* {{{ mysqlnd_palloc_free_thd_cache */
/*
As this call will happen on MSHUTDOWN(), then we don't need to copy the zvals with
copy_ctor but scrap what they point to with zval_dtor() and then just free our
{
DBG_ENTER("_mysqlnd_palloc_free_thd_cache_reference");
if (*cache) {
- --(*cache)->parent->references;
+ mysqlnd_palloc_release_cache_reference((*cache)->parent);
DBG_INF_FMT("cache=%p references_left=%d canary1=%p canary2=%p",
*cache, (*cache)->references, (*cache)->gc_list.canary1, (*cache)->gc_list.canary2);
/* {{{ _mysqlnd_palloc_rinit */
PHPAPI MYSQLND_THD_ZVAL_PCACHE * _mysqlnd_palloc_rinit(MYSQLND_ZVAL_PCACHE * cache TSRMLS_DC)
{
- return mysqlnd_palloc_init_thd_cache(cache);
+ return mysqlnd_palloc_init_thd_cache(cache TSRMLS_CC);
}
/* }}} */
#define MYSQLND_DUMP_HEADER_N_BODY2
#define MYSQLND_DUMP_HEADER_N_BODY_FULL2
-
#define PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_size, packet_type_as_text, packet_type) \
{ \
if (FAIL == mysqlnd_read_header((conn), &((packet)->header) TSRMLS_CC)) {\
zval **current_field, **end_field, **start_field;
zend_bool as_unicode = conn->options.numeric_and_datetime_as_unicode;
zend_bool allocated;
- void *obj;
+ void *obj = NULL;
DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol");
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values),
- (void **)&values_entry, &pos_values) == SUCCESS) {
- TSRMLS_FETCH();
+ (void **)&values_entry, &pos_values) == SUCCESS) {
zstr string_key;
uint string_key_len;
ulong num_key;
int s_len;
char *s = NULL;
+ TSRMLS_FETCH();
zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);