missed to commit to the branch

This commit is contained in:
Andrey Hristov 2010-01-11 12:37:42 +00:00
parent d2f681cecd
commit 4a549fbb3d
3 changed files with 47 additions and 9 deletions

View file

@ -240,7 +240,8 @@ PHPAPI void
mysqlnd_stats_init(MYSQLND_STATS ** stats) mysqlnd_stats_init(MYSQLND_STATS ** stats)
{ {
*stats = calloc(1, sizeof(MYSQLND_STATS)); *stats = calloc(1, sizeof(MYSQLND_STATS));
(*stats)->handlers = calloc(STAT_LAST, sizeof(mysqlnd_stat_handler)); (*stats)->triggers = calloc(STAT_LAST, sizeof(mysqlnd_stat_trigger));
(*stats)->in_trigger = FALSE;
#ifdef ZTS #ifdef ZTS
(*stats)->LOCK_access = tsrm_mutex_alloc(); (*stats)->LOCK_access = tsrm_mutex_alloc();
#endif #endif
@ -256,13 +257,46 @@ mysqlnd_stats_end(MYSQLND_STATS * stats)
#ifdef ZTS #ifdef ZTS
tsrm_mutex_free(stats->LOCK_access); tsrm_mutex_free(stats->LOCK_access);
#endif #endif
free(stats->handlers); free(stats->triggers);
/* mnd_free will reference LOCK_access and crash...*/ /* mnd_free will reference LOCK_access and crash...*/
free(stats); free(stats);
} }
/* }}} */ /* }}} */
/* {{{ mysqlnd_stats_set_trigger */
PHPAPI mysqlnd_stat_trigger
mysqlnd_stats_set_trigger(MYSQLND_STATS * const stats, enum_mysqlnd_collected_stats stat, mysqlnd_stat_trigger trigger TSRMLS_DC)
{
mysqlnd_stat_trigger ret = NULL;
DBG_ENTER("mysqlnd_stats_set_trigger");
if (stats) {
MYSQLND_STATS_LOCK(stats);
ret = stats->triggers[stat];
stats->triggers[stat] = trigger;
MYSQLND_STATS_UNLOCK(stats);
}
DBG_RETURN(ret);
}
/* }}} */
/* {{{ mysqlnd_stats_set_handler */
PHPAPI mysqlnd_stat_trigger
mysqlnd_stats_reset_triggers(MYSQLND_STATS * const stats TSRMLS_DC)
{
mysqlnd_stat_trigger ret = NULL;
DBG_ENTER("mysqlnd_stats_reset_trigger");
if (stats) {
MYSQLND_STATS_LOCK(stats);
memset(stats->triggers, 0, STAT_LAST * sizeof(mysqlnd_stat_trigger));
MYSQLND_STATS_UNLOCK(stats);
}
DBG_RETURN(ret);
}
/* }}} */
/* /*
* Local variables: * Local variables:
* tab-width: 4 * tab-width: 4

View file

@ -43,10 +43,10 @@ extern const MYSQLND_STRING mysqlnd_stats_values_names[];
#endif #endif
#define MYSQLND_CHECK_AND_CALL_HANDLER(stats, statistic, value) \ #define MYSQLND_CHECK_AND_CALL_HANDLER(stats, statistic, value) \
if ((stats)->handlers[(statistic)] && (stats)->in_handler == FALSE) { \ if ((stats)->triggers[(statistic)] && (stats)->in_trigger == FALSE) { \
(stats)->in_handler = TRUE; \ (stats)->in_trigger = TRUE; \
(stats)->handlers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \ (stats)->triggers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \
(stats)->in_handler = FALSE; \ (stats)->in_trigger = FALSE; \
} \ } \
@ -223,6 +223,10 @@ void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_val
PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats); PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats);
PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats); PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats);
PHPAPI mysqlnd_stat_trigger mysqlnd_stats_set_trigger(MYSQLND_STATS * const stats, enum_mysqlnd_collected_stats stat, mysqlnd_stat_trigger trigger TSRMLS_DC);
PHPAPI mysqlnd_stat_trigger mysqlnd_stats_reset_triggers(MYSQLND_STATS * const stats TSRMLS_DC);
#endif /* MYSQLND_STATISTICS_H */ #endif /* MYSQLND_STATISTICS_H */

View file

@ -210,13 +210,13 @@ typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
typedef struct st_mysqlnd_stats MYSQLND_STATS; typedef struct st_mysqlnd_stats MYSQLND_STATS;
typedef void (*mysqlnd_stat_handler)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC); typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC);
struct st_mysqlnd_stats struct st_mysqlnd_stats
{ {
uint64_t values[STAT_LAST]; uint64_t values[STAT_LAST];
mysqlnd_stat_handler *handlers; mysqlnd_stat_trigger *triggers;
zend_bool in_handler; zend_bool in_trigger;
#ifdef ZTS #ifdef ZTS
MUTEX_T LOCK_access; MUTEX_T LOCK_access;
#endif #endif