aboutsummaryrefslogtreecommitdiff
path: root/src/mem3.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2007-10-20 16:36:31 +0000
committerdrh <drh@noemail.net>2007-10-20 16:36:31 +0000
commit979aeaa395b51b49f07b5573508658126a0b7d2b (patch)
treefc52d6293169d8804faa774474ceeaa235ebeb0c /src/mem3.c
parentc0ad3e8df68ad6e3210b2ce8188d7dd3e11e11dd (diff)
downloadsqlite-979aeaa395b51b49f07b5573508658126a0b7d2b.tar.gz
sqlite-979aeaa395b51b49f07b5573508658126a0b7d2b.zip
Add the new memory allocator to the amalgamation. Improvements to
out-of-memory handling. (CVS 4498) FossilOrigin-Name: b58c2b37a5deb19ce0ef78629989016743a46bb3
Diffstat (limited to 'src/mem3.c')
-rw-r--r--src/mem3.c37
1 files changed, 20 insertions, 17 deletions
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);
+ }
}
}