| 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 783cef6176c59cbf30914631095a1a54f4e42e08..1479ddd0d09d69dad6780d40abeebb22bcfa0f67 100644
|
| --- a/third_party/sqlite/src/src/mem5.c
|
| +++ b/third_party/sqlite/src/src/mem5.c
|
| @@ -28,7 +28,7 @@
|
| ** 1. All memory allocations sizes are rounded up to a power of 2.
|
| **
|
| ** 2. If two adjacent free blocks are the halves of a larger block,
|
| -** then the two blocks are coalesed into the single larger block.
|
| +** then the two blocks are coalesced into the single larger block.
|
| **
|
| ** 3. New memory is allocated from the first available free block.
|
| **
|
| @@ -130,13 +130,13 @@ static SQLITE_WSD struct Mem5Global {
|
| } mem5;
|
|
|
| /*
|
| -** Access the static variable through a macro for SQLITE_OMIT_WSD
|
| +** Access the static variable through a macro for SQLITE_OMIT_WSD.
|
| */
|
| #define mem5 GLOBAL(struct Mem5Global, mem5)
|
|
|
| /*
|
| ** Assuming mem5.zPool is divided up into an array of Mem5Link
|
| -** structures, return a pointer to the idx-th such lik.
|
| +** structures, return a pointer to the idx-th such link.
|
| */
|
| #define MEM5LINK(idx) ((Mem5Link *)(&mem5.zPool[(idx)*mem5.szAtom]))
|
|
|
| @@ -202,7 +202,7 @@ static void memsys5Leave(void){
|
| static int memsys5Size(void *p){
|
| int iSize = 0;
|
| if( p ){
|
| - int i = ((u8 *)p-mem5.zPool)/mem5.szAtom;
|
| + int i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom);
|
| assert( i>=0 && i<mem5.nBlock );
|
| iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE));
|
| }
|
| @@ -210,29 +210,10 @@ static int memsys5Size(void *p){
|
| }
|
|
|
| /*
|
| -** Find the first entry on the freelist iLogsize. Unlink that
|
| -** entry and return its index.
|
| -*/
|
| -static int memsys5UnlinkFirst(int iLogsize){
|
| - int i;
|
| - int iFirst;
|
| -
|
| - assert( iLogsize>=0 && iLogsize<=LOGMAX );
|
| - i = iFirst = mem5.aiFreelist[iLogsize];
|
| - assert( iFirst>=0 );
|
| - while( i>0 ){
|
| - if( i<iFirst ) iFirst = i;
|
| - i = MEM5LINK(i)->next;
|
| - }
|
| - memsys5Unlink(iFirst, iLogsize);
|
| - return iFirst;
|
| -}
|
| -
|
| -/*
|
| ** Return a block of memory of at least nBytes in size.
|
| ** Return NULL if unable. Return NULL if nBytes==0.
|
| **
|
| -** The caller guarantees that nByte positive.
|
| +** The caller guarantees that nByte is positive.
|
| **
|
| ** The caller has obtained a mutex prior to invoking this
|
| ** routine so there is never any chance that two or more
|
| @@ -267,13 +248,14 @@ static void *memsys5MallocUnsafe(int nByte){
|
| ** block. If not, then split a block of the next larger power of
|
| ** two in order to create a new free block of size iLogsize.
|
| */
|
| - for(iBin=iLogsize; mem5.aiFreelist[iBin]<0 && iBin<=LOGMAX; iBin++){}
|
| + for(iBin=iLogsize; iBin<=LOGMAX && mem5.aiFreelist[iBin]<0; iBin++){}
|
| if( iBin>LOGMAX ){
|
| testcase( sqlite3GlobalConfig.xLog!=0 );
|
| sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes", nByte);
|
| return 0;
|
| }
|
| - i = memsys5UnlinkFirst(iBin);
|
| + i = mem5.aiFreelist[iBin];
|
| + memsys5Unlink(i, iBin);
|
| while( iBin>iLogsize ){
|
| int newSize;
|
|
|
| @@ -293,6 +275,12 @@ static void *memsys5MallocUnsafe(int nByte){
|
| if( mem5.maxCount<mem5.currentCount ) mem5.maxCount = mem5.currentCount;
|
| if( mem5.maxOut<mem5.currentOut ) mem5.maxOut = mem5.currentOut;
|
|
|
| +#ifdef SQLITE_DEBUG
|
| + /* Make sure the allocated memory does not assume that it is set to zero
|
| + ** or retains a value from a previous allocation */
|
| + memset(&mem5.zPool[i*mem5.szAtom], 0xAA, iFullSz);
|
| +#endif
|
| +
|
| /* Return a pointer to the allocated memory. */
|
| return (void*)&mem5.zPool[i*mem5.szAtom];
|
| }
|
| @@ -307,7 +295,7 @@ static void memsys5FreeUnsafe(void *pOld){
|
| /* Set iBlock to the index of the block pointed to by pOld in
|
| ** the array of mem5.szAtom byte blocks pointed to by mem5.zPool.
|
| */
|
| - iBlock = ((u8 *)pOld-mem5.zPool)/mem5.szAtom;
|
| + iBlock = (int)(((u8 *)pOld-mem5.zPool)/mem5.szAtom);
|
|
|
| /* Check that the pointer pOld points to a valid, non-free block. */
|
| assert( iBlock>=0 && iBlock<mem5.nBlock );
|
| @@ -350,11 +338,18 @@ static void memsys5FreeUnsafe(void *pOld){
|
| }
|
| size *= 2;
|
| }
|
| +
|
| +#ifdef SQLITE_DEBUG
|
| + /* Overwrite freed memory with the 0x55 bit pattern to verify that it is
|
| + ** not used after being freed */
|
| + memset(&mem5.zPool[iBlock*mem5.szAtom], 0x55, size);
|
| +#endif
|
| +
|
| memsys5Link(iBlock, iLogsize);
|
| }
|
|
|
| /*
|
| -** Allocate nBytes of memory
|
| +** Allocate nBytes of memory.
|
| */
|
| static void *memsys5Malloc(int nBytes){
|
| sqlite3_int64 *p = 0;
|
|
|