diff options
| author | Andrey Hristov <andrey@php.net> | 2010-08-12 13:23:16 +0000 | 
|---|---|---|
| committer | Andrey Hristov <andrey@php.net> | 2010-08-12 13:23:16 +0000 | 
| commit | 6fc06f265ee07113b5a00c96eeb2aff43b896b2b (patch) | |
| tree | 80741cdf4493a1e0d077324c2f8c882bbeeb8c27 | |
| parent | 92ef63a07b04bb85d6587b2905d068ce8a781061 (diff) | |
| download | php-git-6fc06f265ee07113b5a00c96eeb2aff43b896b2b.tar.gz | |
Allocate memory in a burst mode, and later use it. Increases
locality of the data.
Also use MYSQLND_INC_CONN_STATISTIC in one place, instead of
two, thus removing code duplication from macro expansion - less
code to fit in the instruction cache.
| -rw-r--r-- | ext/mysqlnd/mysqlnd_wireprotocol.c | 36 | 
1 files changed, 22 insertions, 14 deletions
diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index eb2ce4b459..7a53160b87 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1201,24 +1201,29 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv  	DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol"); -	end_field = (current_field = start_field = fields) + field_count; -	if (!current_field) { +	if (!fields) {  		DBG_RETURN(FAIL);  	} +	end_field = (start_field = fields) + field_count; +  	/* skip the first byte, not EODATA_MARKER -> 0x0, status */  	p++;  	null_ptr= p;  	p += (field_count + 9)/8;	/* skip null bits */  	bit	= 4;					/* first 2 bits are reserved */ -	for (i = 0; current_field < end_field; current_field++, i++) { +	for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) {  		DBG_INF("Directly creating zval");  		MAKE_STD_ZVAL(*current_field);  		if (!*current_field) {  			DBG_RETURN(FAIL);  		} - +	} +	 +	for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) { +		enum_mysqlnd_collected_stats statistic; +	  		DBG_INF_FMT("Into zval=%p decoding column %u [%s.%s.%s] type=%u field->flags&unsigned=%u flags=%u is_bit=%u as_unicode=%u",  			*current_field, i,  			fields_metadata[i].db, fields_metadata[i].table, fields_metadata[i].name, fields_metadata[i].type, @@ -1226,13 +1231,12 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv  		if (*null_ptr & bit) {  			DBG_INF("It's null");  			ZVAL_NULL(*current_field); -			MYSQLND_INC_CONN_STATISTIC(stats, STAT_BINARY_TYPE_FETCHED_NULL); +			statistic = STAT_BINARY_TYPE_FETCHED_NULL;  		} else {  			enum_mysqlnd_field_types type = fields_metadata[i].type;  			mysqlnd_ps_fetch_functions[type].func(*current_field, &fields_metadata[i], 0, &p, as_unicode TSRMLS_CC);  			if (MYSQLND_G(collect_statistics)) { -				enum_mysqlnd_collected_stats statistic;  				switch (fields_metadata[i].type) {  					case MYSQL_TYPE_DECIMAL:	statistic = STAT_BINARY_TYPE_FETCHED_DECIMAL; break;  					case MYSQL_TYPE_TINY:		statistic = STAT_BINARY_TYPE_FETCHED_INT8; break; @@ -1263,9 +1267,10 @@ php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zv  					case MYSQL_TYPE_GEOMETRY:	statistic = STAT_BINARY_TYPE_FETCHED_GEOMETRY; break;  					default: statistic = STAT_BINARY_TYPE_FETCHED_OTHER; break;  				} -				MYSQLND_INC_CONN_STATISTIC(stats, statistic);  			}  		} +		MYSQLND_INC_CONN_STATISTIC(stats, statistic); +  		if (!((bit<<=1) & 255)) {  			bit = 1;	/* to the following byte */  			null_ptr++; @@ -1294,22 +1299,25 @@ php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval  	DBG_ENTER("php_mysqlnd_rowp_read_text_protocol"); -	end_field = (current_field = start_field = fields) + field_count; -	if (!current_field) { +	if (!fields) {  		DBG_RETURN(FAIL);  	} -	for (i = 0; current_field < end_field; current_field++, i++) { -		/* Don't reverse the order. It is significant!*/ -		zend_uchar *this_field_len_pos = p; -		/* php_mysqlnd_net_field_length() call should be after *this_field_len_pos = p; */ -		unsigned long len = php_mysqlnd_net_field_length(&p); +	end_field = (start_field = fields) + field_count; +	for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) {  		DBG_INF("Directly creating zval");  		MAKE_STD_ZVAL(*current_field);  		if (!*current_field) {  			DBG_RETURN(FAIL);  		} +	} + +	for (i = 0, current_field = start_field; current_field < end_field; current_field++, i++) { +		/* Don't reverse the order. It is significant!*/ +		zend_uchar *this_field_len_pos = p; +		/* php_mysqlnd_net_field_length() call should be after *this_field_len_pos = p; */ +		unsigned long len = php_mysqlnd_net_field_length(&p);  		if (current_field > start_field && last_field_was_string) {  			/*  | 
