diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/malloc.c | 3 | ||||
-rw-r--r-- | src/mem3.c | 37 |
2 files changed, 21 insertions, 19 deletions
diff --git a/src/malloc.c b/src/malloc.c index bc321ab9a..a04734868 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -12,7 +12,7 @@ ** Memory allocation functions used throughout sqlite. ** ** -** $Id: malloc.c,v 1.13 2007/08/29 14:06:23 danielk1977 Exp $ +** $Id: malloc.c,v 1.14 2007/10/20 16:36:31 drh Exp $ */ #include "sqliteInt.h" #include <stdarg.h> @@ -237,4 +237,3 @@ int sqlite3ApiExit(sqlite3* db, int rc){ } return rc & (db ? db->errMask : 0xff); } - diff --git a/src/mem3.c b/src/mem3.c index 4b6fcf6c6..8cbafe37a 100644 --- a/src/mem3.c +++ b/src/mem3.c @@ -20,7 +20,7 @@ ** This version of the memory allocation subsystem is used if ** and only if SQLITE_MEMORY_SIZE is defined. ** -** $Id: mem3.c,v 1.4 2007/10/20 16:11:39 drh Exp $ +** $Id: mem3.c,v 1.5 2007/10/20 16:36:31 drh Exp $ */ /* @@ -372,6 +372,7 @@ static void memsys3Merge(int *pRoot){ static void *memsys3Malloc(int nByte){ int i; int nBlock; + int toFree; assert( sizeof(Mem3Block)==8 ); if( nByte<=0 ){ @@ -418,22 +419,24 @@ static void *memsys3Malloc(int nByte){ ** of the end of the master chunk. This step happens very ** rarely (we hope!) */ - memsys3OutOfMemory(nBlock*16); - if( mem.iMaster ){ - memsys3Link(mem.iMaster); - mem.iMaster = 0; - mem.szMaster = 0; - } - for(i=0; i<N_HASH; i++){ - memsys3Merge(&mem.aiHash[i]); - } - for(i=0; i<MX_SMALL-1; i++){ - memsys3Merge(&mem.aiSmall[i]); - } - if( mem.szMaster ){ - memsys3Unlink(mem.iMaster); - if( mem.szMaster>=nBlock ){ - return memsys3FromMaster(nBlock); + for(toFree=nBlock*16; toFree<SQLITE_MEMORY_SIZE*2; toFree *= 2){ + memsys3OutOfMemory(toFree); + if( mem.iMaster ){ + memsys3Link(mem.iMaster); + mem.iMaster = 0; + mem.szMaster = 0; + } + for(i=0; i<N_HASH; i++){ + memsys3Merge(&mem.aiHash[i]); + } + for(i=0; i<MX_SMALL-1; i++){ + memsys3Merge(&mem.aiSmall[i]); + } + if( mem.szMaster ){ + memsys3Unlink(mem.iMaster); + if( mem.szMaster>=nBlock ){ + return memsys3FromMaster(nBlock); + } } } |