Don't allocate 2 chunks of memory when one can fit. Reduces memory

fragmentation. There is one more place that fragments memory but it will
complicate the ongoing Unicode upgrade of mysqli so leaving it away for now.
This commit is contained in:
Andrey Hristov 2006-05-10 11:53:13 +00:00
parent 0881dbd101
commit ac97b77ed9
2 changed files with 17 additions and 8 deletions

View File

@ -69,10 +69,6 @@ void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
return;
}
if (bbuf.is_null) {
efree(bbuf.is_null);
}
for (i=0; i < bbuf.var_cnt; i++) {
/* free temporary bind buffer */
@ -89,9 +85,18 @@ void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
efree(bbuf.vars);
}
/*
Don't free bbuf.is_null for FETCH_RESULT since we have allocated
is_null and buf in one block so we free only buf, which is the beginning
of the block. When FETCH_SIMPLE then buf wasn't allocated together with
buf and we have to free it.
*/
if (type == FETCH_RESULT) {
efree(bbuf.buf);
} else if (type == FETCH_SIMPLE){
efree(bbuf.is_null);
}
bbuf.var_cnt = 0;
return;
}

View File

@ -250,12 +250,16 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
}
bind = (MYSQL_BIND *)ecalloc(var_cnt, sizeof(MYSQL_BIND));
stmt->result.buf = (VAR_BUFFER *)ecalloc(var_cnt,sizeof(VAR_BUFFER));
stmt->result.is_null = (char *)ecalloc(var_cnt, sizeof(char));
{
int size;
char *p= emalloc(size= var_cnt * (sizeof(char) + sizeof(VAR_BUFFER)));
stmt->result.buf = (VAR_BUFFER *) p;
stmt->result.is_null = p + var_cnt * sizeof(VAR_BUFFER);
memset(p, 0, size);
}
for (i=start; i < var_cnt + start ; i++) {
ofs = i - start;
stmt->result.is_null[ofs] = 0;
col_type = (stmt->stmt->fields) ? stmt->stmt->fields[ofs].type : MYSQL_TYPE_STRING;
switch (col_type) {
@ -373,8 +377,8 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
efree(stmt->result.buf[i].val);
}
}
/* Don't free stmt->result.is_null because is_null & buf are one block of memory */
efree(stmt->result.buf);
efree(stmt->result.is_null);
RETVAL_FALSE;
} else {
stmt->result.var_cnt = var_cnt;