mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Further reductions in the amount of stack space required. (CVS 6707)
FossilOrigin-Name: 04bad9eb6dd8bf7cafc9f3918b676e95d5b1c984
This commit is contained in:
41
src/bitvec.c
41
src/bitvec.c
@@ -34,7 +34,7 @@
|
||||
** start of a transaction, and is thus usually less than a few thousand,
|
||||
** but can be as large as 2 billion for a really big database.
|
||||
**
|
||||
** @(#) $Id: bitvec.c,v 1.14 2009/04/01 23:49:04 drh Exp $
|
||||
** @(#) $Id: bitvec.c,v 1.15 2009/06/02 21:31:39 drh Exp $
|
||||
*/
|
||||
#include "sqliteInt.h"
|
||||
|
||||
@@ -209,15 +209,20 @@ bitvec_set_rehash:
|
||||
if( p->nSet>=BITVEC_MXHASH ){
|
||||
unsigned int j;
|
||||
int rc;
|
||||
u32 aiValues[BITVEC_NINT];
|
||||
memcpy(aiValues, p->u.aHash, sizeof(aiValues));
|
||||
memset(p->u.apSub, 0, sizeof(aiValues));
|
||||
p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR;
|
||||
rc = sqlite3BitvecSet(p, i);
|
||||
for(j=0; j<BITVEC_NINT; j++){
|
||||
if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]);
|
||||
u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash));
|
||||
if( aiValues==0 ){
|
||||
return SQLITE_NOMEM;
|
||||
}else{
|
||||
memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash));
|
||||
memset(p->u.apSub, 0, sizeof(p->u.apSub));
|
||||
p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR;
|
||||
rc = sqlite3BitvecSet(p, i);
|
||||
for(j=0; j<BITVEC_NINT; j++){
|
||||
if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]);
|
||||
}
|
||||
sqlite3StackFree(0, aiValues);
|
||||
return rc;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
bitvec_set_end:
|
||||
p->nSet++;
|
||||
@@ -227,8 +232,11 @@ bitvec_set_end:
|
||||
|
||||
/*
|
||||
** Clear the i-th bit.
|
||||
**
|
||||
** pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage
|
||||
** that BitvecClear can use to rebuilt its hash table.
|
||||
*/
|
||||
void sqlite3BitvecClear(Bitvec *p, u32 i){
|
||||
void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){
|
||||
assert( p!=0 );
|
||||
assert( i>0 );
|
||||
i--;
|
||||
@@ -244,9 +252,9 @@ void sqlite3BitvecClear(Bitvec *p, u32 i){
|
||||
p->u.aBitmap[i/BITVEC_SZELEM] &= ~(1 << (i&(BITVEC_SZELEM-1)));
|
||||
}else{
|
||||
unsigned int j;
|
||||
u32 aiValues[BITVEC_NINT];
|
||||
memcpy(aiValues, p->u.aHash, sizeof(aiValues));
|
||||
memset(p->u.aHash, 0, sizeof(aiValues));
|
||||
u32 *aiValues = pBuf;
|
||||
memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash));
|
||||
memset(p->u.aHash, 0, sizeof(p->u.aHash));
|
||||
p->nSet = 0;
|
||||
for(j=0; j<BITVEC_NINT; j++){
|
||||
if( aiValues[j] && aiValues[j]!=(i+1) ){
|
||||
@@ -330,12 +338,14 @@ int sqlite3BitvecBuiltinTest(int sz, int *aOp){
|
||||
unsigned char *pV = 0;
|
||||
int rc = -1;
|
||||
int i, nx, pc, op;
|
||||
void *pTmpSpace;
|
||||
|
||||
/* Allocate the Bitvec to be tested and a linear array of
|
||||
** bits to act as the reference */
|
||||
pBitvec = sqlite3BitvecCreate( sz );
|
||||
pV = sqlite3_malloc( (sz+7)/8 + 1 );
|
||||
if( pBitvec==0 || pV==0 ) goto bitvec_end;
|
||||
pTmpSpace = sqlite3_malloc(BITVEC_SZ);
|
||||
if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end;
|
||||
memset(pV, 0, (sz+7)/8 + 1);
|
||||
|
||||
/* Run the program */
|
||||
@@ -368,7 +378,7 @@ int sqlite3BitvecBuiltinTest(int sz, int *aOp){
|
||||
}
|
||||
}else{
|
||||
CLEARBIT(pV, (i+1));
|
||||
sqlite3BitvecClear(pBitvec, i+1);
|
||||
sqlite3BitvecClear(pBitvec, i+1, pTmpSpace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -389,6 +399,7 @@ int sqlite3BitvecBuiltinTest(int sz, int *aOp){
|
||||
|
||||
/* Free allocated structure */
|
||||
bitvec_end:
|
||||
sqlite3_free(pTmpSpace);
|
||||
sqlite3_free(pV);
|
||||
sqlite3BitvecDestroy(pBitvec);
|
||||
return rc;
|
||||
|
Reference in New Issue
Block a user