| 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++;
|
|
|