Index: third_party/sqlite/src/src/mem5.c |
diff --git a/third_party/sqlite/src/src/mem5.c b/third_party/sqlite/src/src/mem5.c |
index 49bebca0938423128b4a7c6d9310c6498c13046b..c194a6b778172d6abb109512a64ad4dfa93b79c0 100644 |
--- a/third_party/sqlite/src/src/mem5.c |
+++ b/third_party/sqlite/src/src/mem5.c |
@@ -102,6 +102,7 @@ static SQLITE_WSD struct Mem5Global { |
*/ |
sqlite3_mutex *mutex; |
+#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
/* |
** Performance statistics |
*/ |
@@ -113,6 +114,7 @@ static SQLITE_WSD struct Mem5Global { |
u32 maxOut; /* Maximum instantaneous currentOut */ |
u32 maxCount; /* Maximum instantaneous currentCount */ |
u32 maxRequest; /* Largest allocation (exclusive of internal frag) */ |
+#endif |
/* |
** Lists of free blocks. aiFreelist[0] is a list of free blocks of |
@@ -224,14 +226,17 @@ static void *memsys5MallocUnsafe(int nByte){ |
/* nByte must be a positive */ |
assert( nByte>0 ); |
+ /* No more than 1GiB per allocation */ |
+ if( nByte > 0x40000000 ) return 0; |
+ |
+#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
/* Keep track of the maximum allocation request. Even unfulfilled |
** requests are counted */ |
if( (u32)nByte>mem5.maxRequest ){ |
- /* Abort if the requested allocation size is larger than the largest |
- ** power of two that we can represent using 32-bit signed integers. */ |
- if( nByte > 0x40000000 ) return 0; |
mem5.maxRequest = nByte; |
} |
+#endif |
+ |
/* Round nByte up to the next valid power of two */ |
for(iFullSz=mem5.szAtom,iLogsize=0; iFullSz<nByte; iFullSz*=2,iLogsize++){} |
@@ -258,6 +263,7 @@ static void *memsys5MallocUnsafe(int nByte){ |
} |
mem5.aCtrl[i] = iLogsize; |
+#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
/* Update allocator performance statistics. */ |
mem5.nAlloc++; |
mem5.totalAlloc += iFullSz; |
@@ -266,6 +272,7 @@ static void *memsys5MallocUnsafe(int nByte){ |
mem5.currentOut += iFullSz; |
if( mem5.maxCount<mem5.currentCount ) mem5.maxCount = mem5.currentCount; |
if( mem5.maxOut<mem5.currentOut ) mem5.maxOut = mem5.currentOut; |
+#endif |
#ifdef SQLITE_DEBUG |
/* Make sure the allocated memory does not assume that it is set to zero |
@@ -300,23 +307,26 @@ static void memsys5FreeUnsafe(void *pOld){ |
mem5.aCtrl[iBlock] |= CTRL_FREE; |
mem5.aCtrl[iBlock+size-1] |= CTRL_FREE; |
+ |
+#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
assert( mem5.currentCount>0 ); |
assert( mem5.currentOut>=(size*mem5.szAtom) ); |
mem5.currentCount--; |
mem5.currentOut -= size*mem5.szAtom; |
assert( mem5.currentOut>0 || mem5.currentCount==0 ); |
assert( mem5.currentCount>0 || mem5.currentOut==0 ); |
+#endif |
mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize; |
while( ALWAYS(iLogsize<LOGMAX) ){ |
int iBuddy; |
if( (iBlock>>iLogsize) & 1 ){ |
iBuddy = iBlock - size; |
+ assert( iBuddy>=0 ); |
}else{ |
iBuddy = iBlock + size; |
+ if( iBuddy>=mem5.nBlock ) break; |
} |
- assert( iBuddy>=0 ); |
- if( (iBuddy+(1<<iLogsize))>mem5.nBlock ) break; |
if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break; |
memsys5Unlink(iBuddy, iLogsize); |
iLogsize++; |