andrey                                   Mon, 11 Jan 2010 14:27:35 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=293407

Log:
Rework the statistics macros to be reusable by external entities.
Rename handlers to triggers. Dynamically allocate space for the
statistics thus allow reusability.

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.c
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.h
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.h
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd.c	2010-01-11 14:27:35 UTC (rev 293407)
@@ -2115,7 +2115,7 @@
 	DBG_ENTER("mysqlnd_conn::init");
 	conn->net = mysqlnd_net_init(conn->persistent TSRMLS_CC);
 	conn->protocol = mysqlnd_protocol_init(conn->persistent TSRMLS_CC);
-	mysqlnd_stats_init(&conn->stats);
+	mysqlnd_stats_init(&conn->stats, STAT_LAST);

 	SET_ERROR_AFF_ROWS(conn);

@@ -2153,7 +2153,7 @@
 		mysqlnd_conn_methods = &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn);
 		_mysqlnd_init_ps_subsystem();
 		/* Should be calloc, as mnd_calloc will reference LOCK_access*/
-		mysqlnd_stats_init(&mysqlnd_global_stats);
+		mysqlnd_stats_init(&mysqlnd_global_stats, STAT_LAST);
 	}
 }
 /* }}} */

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.c	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.c	2010-01-11 14:27:35 UTC (rev 293407)
@@ -237,11 +237,13 @@

 /* {{{ mysqlnd_stats_init */
 PHPAPI void
-mysqlnd_stats_init(MYSQLND_STATS ** stats)
+mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count)
 {
 	*stats = calloc(1, sizeof(MYSQLND_STATS));
-	(*stats)->triggers = calloc(STAT_LAST, sizeof(mysqlnd_stat_trigger));
+	(*stats)->values = calloc(statistic_count, sizeof(uint64_t));
+	(*stats)->triggers = calloc(statistic_count, sizeof(mysqlnd_stat_trigger));
 	(*stats)->in_trigger = FALSE;
+	(*stats)->count = statistic_count;
 #ifdef ZTS
 	(*stats)->LOCK_access = tsrm_mutex_alloc();
 #endif
@@ -258,6 +260,7 @@
 	tsrm_mutex_free(stats->LOCK_access);
 #endif
 	free(stats->triggers);
+	free(stats->values);
 	/* mnd_free will reference LOCK_access and crash...*/
 	free(stats);
 }

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.h
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.h	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_statistics.h	2010-01-11 14:27:35 UTC (rev 293407)
@@ -43,184 +43,131 @@
 #endif

 #define MYSQLND_CHECK_AND_CALL_HANDLER(stats, statistic, value) \
+	{ \
 			if ((stats)->triggers[(statistic)] && (stats)->in_trigger == FALSE) { \
 				(stats)->in_trigger = TRUE; \
 				(stats)->triggers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \
 				(stats)->in_trigger = FALSE; \
 			} \
+	} \
+
+#define MYSQLND_DEC_STATISTIC(enabler, stats, statistic) \
+ { \
+	enum_mysqlnd_collected_stats _s = (statistic);\
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s && _s != _p_s->count) { \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, -1); \
+		_p_s->values[_s]--; \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
+	}\
+ }

-
-
-#define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
+#define MYSQLND_INC_STATISTIC(enabler, stats, statistic) \
  { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		DBG_INF_FMT("Global stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), 1); \
-		mysqlnd_global_stats->values[(statistic)]++; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
+	enum_mysqlnd_collected_stats _s = (statistic);\
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s && _s != _p_s->count) { \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, 1); \
+		_p_s->values[_s]++; \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
 	}\
  }

-#define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \
+#define MYSQLND_INC_STATISTIC_W_VALUE(enabler, stats, statistic, value) \
  { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		DBG_INF_FMT("Global&conn stat decrease [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), -1); \
-		mysqlnd_global_stats->values[(statistic)]--; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if ((conn_stats)) {  \
-			MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), (statistic), -1); \
-		} \
+	enum_mysqlnd_collected_stats _s = (statistic);\
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s && _s != _p_s->count) { \
+		uint64_t v = (uint64_t) (value); \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, v); \
+		_p_s->values[_s] += v; \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
 	}\
  }

-#define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
+#define MYSQLND_INC_STATISTIC_W_VALUE2(enabler, stats, statistic1, value1, statistic2, value2) \
  { \
- 	if (MYSQLND_G(collect_statistics)) { \
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s) { \
 		uint64_t v1 = (uint64_t) (value1); \
 		uint64_t v2 = (uint64_t) (value2); \
 		enum_mysqlnd_collected_stats _s1 = (statistic1);\
 		enum_mysqlnd_collected_stats _s2 = (statistic2);\
-								 \
-		if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-		if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-										\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		if (_s1 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s1, v1); \
-			mysqlnd_global_stats->values[_s1]+= v1; \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		if (_s1 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \
+			_p_s->values[_s1]+= v1; \
 		} \
-		if (_s2 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s2, v2); \
-			mysqlnd_global_stats->values[_s2]+= v2; \
+		if (_s2 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \
+			_p_s->values[_s2]+= v2; \
 		} \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
 	}\
  }

-#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
+#define MYSQLND_INC_STATISTIC_W_VALUE3(enabler, stats, statistic1, value1, statistic2, value2, statistic3, value3) \
  { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		DBG_INF_FMT("Global&Conn stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), 1); \
-		mysqlnd_global_stats->values[(statistic)]++; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), (statistic), 1); \
-			(conn_stats)->values[(statistic)]++; \
-		} \
-	}\
- }
-
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
- { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		uint64_t v = (uint64_t) (value); \
-		DBG_INF_FMT("Global&Conn stat increase w value [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), v); \
-		mysqlnd_global_stats->values[(statistic)] += v; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), (statistic), v); \
-			(conn_stats)->values[(statistic)]+= v; \
-		} \
-	}\
- }
-
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
- { \
- 	if (MYSQLND_G(collect_statistics)) { \
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s) { \
 		uint64_t v1 = (uint64_t) (value1); \
 		uint64_t v2 = (uint64_t) (value2); \
+		uint64_t v3 = (uint64_t) (value3); \
 		enum_mysqlnd_collected_stats _s1 = (statistic1);\
 		enum_mysqlnd_collected_stats _s2 = (statistic2);\
-								 \
-		if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-		if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-					\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		if (_s1 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s1, v1); \
-			mysqlnd_global_stats->values[_s1]+= v1; \
+		enum_mysqlnd_collected_stats _s3 = (statistic3);\
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		if (_s1 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \
+			_p_s->values[_s1]+= v1; \
 		} \
-		if (_s2 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s2, v2); \
-			mysqlnd_global_stats->values[_s2]+= v2; \
+		if (_s2 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \
+			_p_s->values[_s2]+= v2; \
 		} \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			if (_s1 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s1, v1); \
-				(conn_stats)->values[_s1]+= v1; \
-			} \
-			if (_s2 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s2, v2); \
-				(conn_stats)->values[_s2]+= v2; \
-			} \
+		if (_s3 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s3, v3); \
+			_p_s->values[_s3]+= v3; \
 		} \
-	} \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
+	}\
  }


+#define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
+	 MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
+
+#define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \
+	 MYSQLND_DEC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
+
+#define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
+ 	MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2))
+
+#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
+	 MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)); \
+	 MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), (conn_stats), (statistic));
+
+#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
+	 MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic), (value)); \
+	 MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), (conn_stats), (statistic), (value));
+
+#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
+	 MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2)); \
+	 MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2));
+
 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \
- { \
- 	if (MYSQLND_G(collect_statistics)) { \
-		uint64_t v1 = (uint64_t) (value1); \
-		uint64_t v2 = (uint64_t) (value2); \
-		uint64_t v3 = (uint64_t) (value3); \
-		enum_mysqlnd_collected_stats _s1 = (statistic1); \
-		enum_mysqlnd_collected_stats _s2 = (statistic2); \
-		enum_mysqlnd_collected_stats _s3 = (statistic3); \
-								 \
-		if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-		if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-		if (_s3 != STAT_LAST) DBG_INF_FMT("Global stat increase3 [%s]", mysqlnd_stats_values_names[_s3].s); \
-								 		\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		if (_s1 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s1, v1); \
-			mysqlnd_global_stats->values[_s1]+= v1; \
-		} \
-		if (_s2 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s2, v2); \
-			mysqlnd_global_stats->values[_s2]+= v2; \
-		} \
-		if (_s3 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s3, v3); \
-			mysqlnd_global_stats->values[_s3]+= v3; \
-		} \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			if (_s1 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s1, v1); \
-				(conn_stats)->values[_s1]+= v1; \
-			} \
-			if (_s2 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s2, v2); \
-				(conn_stats)->values[_s2]+= v2; \
-			} \
-			if (_s3 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s3, v3); \
-				(conn_stats)->values[_s3]+= v3; \
-			} \
-		} \
-	} \
- }
+	 MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2), (statistic3), (value3)); \
+	 MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2), (statistic3), (value3));


 void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value
 							 TSRMLS_DC ZEND_FILE_LINE_DC);


-PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats);
+PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count);
 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);

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_structs.h	2010-01-11 14:27:35 UTC (rev 293407)
@@ -214,8 +214,9 @@

 struct st_mysqlnd_stats
 {
-	uint64_t				values[STAT_LAST];
+	uint64_t				*values;
 	mysqlnd_stat_trigger 	*triggers;
+	size_t					count;
 	zend_bool				in_trigger;
 #ifdef ZTS
 	MUTEX_T	LOCK_access;

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd.c	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd.c	2010-01-11 14:27:35 UTC (rev 293407)
@@ -2115,7 +2115,7 @@
 	DBG_ENTER("mysqlnd_conn::init");
 	conn->net = mysqlnd_net_init(conn->persistent TSRMLS_CC);
 	conn->protocol = mysqlnd_protocol_init(conn->persistent TSRMLS_CC);
-	mysqlnd_stats_init(&conn->stats);
+	mysqlnd_stats_init(&conn->stats, STAT_LAST);

 	SET_ERROR_AFF_ROWS(conn);

@@ -2153,7 +2153,7 @@
 		mysqlnd_conn_methods = &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn);
 		_mysqlnd_init_ps_subsystem();
 		/* Should be calloc, as mnd_calloc will reference LOCK_access*/
-		mysqlnd_stats_init(&mysqlnd_global_stats);
+		mysqlnd_stats_init(&mysqlnd_global_stats, STAT_LAST);
 	}
 }
 /* }}} */

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.c	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.c	2010-01-11 14:27:35 UTC (rev 293407)
@@ -237,11 +237,13 @@

 /* {{{ mysqlnd_stats_init */
 PHPAPI void
-mysqlnd_stats_init(MYSQLND_STATS ** stats)
+mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count)
 {
 	*stats = calloc(1, sizeof(MYSQLND_STATS));
-	(*stats)->triggers = calloc(STAT_LAST, sizeof(mysqlnd_stat_trigger));
+	(*stats)->values = calloc(statistic_count, sizeof(uint64_t));
+	(*stats)->triggers = calloc(statistic_count, sizeof(mysqlnd_stat_trigger));
 	(*stats)->in_trigger = FALSE;
+	(*stats)->count = statistic_count;
 #ifdef ZTS
 	(*stats)->LOCK_access = tsrm_mutex_alloc();
 #endif
@@ -258,6 +260,7 @@
 	tsrm_mutex_free(stats->LOCK_access);
 #endif
 	free(stats->triggers);
+	free(stats->values);
 	/* mnd_free will reference LOCK_access and crash...*/
 	free(stats);
 }

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.h	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_statistics.h	2010-01-11 14:27:35 UTC (rev 293407)
@@ -43,188 +43,137 @@
 #endif

 #define MYSQLND_CHECK_AND_CALL_HANDLER(stats, statistic, value) \
+	{ \
 			if ((stats)->triggers[(statistic)] && (stats)->in_trigger == FALSE) { \
 				(stats)->in_trigger = TRUE; \
 				(stats)->triggers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \
 				(stats)->in_trigger = FALSE; \
 			} \
+	} \
+
+#define MYSQLND_DEC_STATISTIC(enabler, stats, statistic) \
+ { \
+	enum_mysqlnd_collected_stats _s = (statistic);\
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s && _s != _p_s->count) { \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, -1); \
+		_p_s->values[_s]--; \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
+	}\
+ }

-
-
-#define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
+#define MYSQLND_INC_STATISTIC(enabler, stats, statistic) \
  { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		DBG_INF_FMT("Global stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), 1); \
-		mysqlnd_global_stats->values[(statistic)]++; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
+	enum_mysqlnd_collected_stats _s = (statistic);\
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s && _s != _p_s->count) { \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, 1); \
+		_p_s->values[_s]++; \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
 	}\
  }

-#define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \
+#define MYSQLND_INC_STATISTIC_W_VALUE(enabler, stats, statistic, value) \
  { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		DBG_INF_FMT("Global&conn stat decrease [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), -1); \
-		mysqlnd_global_stats->values[(statistic)]--; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if ((conn_stats)) {  \
-			MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), (statistic), -1); \
-		} \
+	enum_mysqlnd_collected_stats _s = (statistic);\
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s && _s != _p_s->count) { \
+		uint64_t v = (uint64_t) (value); \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, v); \
+		_p_s->values[_s] += v; \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
 	}\
  }

-#define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
+#define MYSQLND_INC_STATISTIC_W_VALUE2(enabler, stats, statistic1, value1, statistic2, value2) \
  { \
- 	if (MYSQLND_G(collect_statistics)) { \
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s) { \
 		uint64_t v1 = (uint64_t) (value1); \
 		uint64_t v2 = (uint64_t) (value2); \
 		enum_mysqlnd_collected_stats _s1 = (statistic1);\
 		enum_mysqlnd_collected_stats _s2 = (statistic2);\
-								 \
-		if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-		if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-										\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		if (_s1 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s1, v1); \
-			mysqlnd_global_stats->values[_s1]+= v1; \
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		if (_s1 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \
+			_p_s->values[_s1]+= v1; \
 		} \
-		if (_s2 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s2, v2); \
-			mysqlnd_global_stats->values[_s2]+= v2; \
+		if (_s2 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \
+			_p_s->values[_s2]+= v2; \
 		} \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
 	}\
  }

-#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
+#define MYSQLND_INC_STATISTIC_W_VALUE3(enabler, stats, statistic1, value1, statistic2, value2, statistic3, value3) \
  { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		DBG_INF_FMT("Global&Conn stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), 1); \
-		mysqlnd_global_stats->values[(statistic)]++; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), (statistic), 1); \
-			(conn_stats)->values[(statistic)]++; \
-		} \
-	}\
- }
-
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
- { \
- 	if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-		uint64_t v = (uint64_t) (value); \
-		DBG_INF_FMT("Global&Conn stat increase w value [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-			\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, (statistic), v); \
-		mysqlnd_global_stats->values[(statistic)] += v; \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), (statistic), v); \
-			(conn_stats)->values[(statistic)]+= v; \
-		} \
-	}\
- }
-
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
- { \
- 	if (MYSQLND_G(collect_statistics)) { \
+	MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+ 	if ((enabler) && _p_s) { \
 		uint64_t v1 = (uint64_t) (value1); \
 		uint64_t v2 = (uint64_t) (value2); \
+		uint64_t v3 = (uint64_t) (value3); \
 		enum_mysqlnd_collected_stats _s1 = (statistic1);\
 		enum_mysqlnd_collected_stats _s2 = (statistic2);\
-								 \
-		if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-		if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-					\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		if (_s1 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s1, v1); \
-			mysqlnd_global_stats->values[_s1]+= v1; \
+		enum_mysqlnd_collected_stats _s3 = (statistic3);\
+ 		MYSQLND_STATS_LOCK(_p_s); \
+		if (_s1 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \
+			_p_s->values[_s1]+= v1; \
 		} \
-		if (_s2 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s2, v2); \
-			mysqlnd_global_stats->values[_s2]+= v2; \
+		if (_s2 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \
+			_p_s->values[_s2]+= v2; \
 		} \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			if (_s1 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s1, v1); \
-				(conn_stats)->values[_s1]+= v1; \
-			} \
-			if (_s2 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s2, v2); \
-				(conn_stats)->values[_s2]+= v2; \
-			} \
+		if (_s3 != _p_s->count) { \
+			MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s3, v3); \
+			_p_s->values[_s3]+= v3; \
 		} \
-	} \
+ 		MYSQLND_STATS_UNLOCK(_p_s); \
+	}\
  }


+#define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
+	 MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
+
+#define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \
+	 MYSQLND_DEC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
+
+#define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
+ 	MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2))
+
+#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
+	 MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)); \
+	 MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), (conn_stats), (statistic));
+
+#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
+	 MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic), (value)); \
+	 MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), (conn_stats), (statistic), (value));
+
+#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
+	 MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2)); \
+	 MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2));
+
 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \
- { \
- 	if (MYSQLND_G(collect_statistics)) { \
-		uint64_t v1 = (uint64_t) (value1); \
-		uint64_t v2 = (uint64_t) (value2); \
-		uint64_t v3 = (uint64_t) (value3); \
-		enum_mysqlnd_collected_stats _s1 = (statistic1); \
-		enum_mysqlnd_collected_stats _s2 = (statistic2); \
-		enum_mysqlnd_collected_stats _s3 = (statistic3); \
-								 \
-		if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-		if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-		if (_s3 != STAT_LAST) DBG_INF_FMT("Global stat increase3 [%s]", mysqlnd_stats_values_names[_s3].s); \
-								 		\
- 		MYSQLND_STATS_LOCK(mysqlnd_global_stats); \
-		if (_s1 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s1, v1); \
-			mysqlnd_global_stats->values[_s1]+= v1; \
-		} \
-		if (_s2 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s2, v2); \
-			mysqlnd_global_stats->values[_s2]+= v2; \
-		} \
-		if (_s3 != STAT_LAST) { \
-			MYSQLND_CHECK_AND_CALL_HANDLER(mysqlnd_global_stats, _s3, v3); \
-			mysqlnd_global_stats->values[_s3]+= v3; \
-		} \
- 		MYSQLND_STATS_UNLOCK(mysqlnd_global_stats); \
-		if (conn_stats) { \
-			if (_s1 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s1, v1); \
-				(conn_stats)->values[_s1]+= v1; \
-			} \
-			if (_s2 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s2, v2); \
-				(conn_stats)->values[_s2]+= v2; \
-			} \
-			if (_s3 != STAT_LAST) { \
-				MYSQLND_CHECK_AND_CALL_HANDLER((conn_stats), _s3, v3); \
-				(conn_stats)->values[_s3]+= v3; \
-			} \
-		} \
-	} \
- }
+	 MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2), (statistic3), (value3)); \
+	 MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2), (statistic3), (value3));


 void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value
 							 TSRMLS_DC ZEND_FILE_LINE_DC);


-PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats);
+PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count);
 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 */



Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h	2010-01-11 14:21:10 UTC (rev 293406)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_structs.h	2010-01-11 14:27:35 UTC (rev 293407)
@@ -214,8 +214,9 @@

 struct st_mysqlnd_stats
 {
-	uint64_t				values[STAT_LAST];
+	uint64_t				*values;
 	mysqlnd_stat_trigger 	*triggers;
+	size_t					count;
 	zend_bool				in_trigger;
 #ifdef ZTS
 	MUTEX_T	LOCK_access;
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to