Annotation of embedaddon/sqlite3/src/mem2.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** 2007 August 15
                      3: **
                      4: ** The author disclaims copyright to this source code.  In place of
                      5: ** a legal notice, here is a blessing:
                      6: **
                      7: **    May you do good and not evil.
                      8: **    May you find forgiveness for yourself and forgive others.
                      9: **    May you share freely, never taking more than you give.
                     10: **
                     11: *************************************************************************
                     12: **
                     13: ** This file contains low-level memory allocation drivers for when
                     14: ** SQLite will use the standard C-library malloc/realloc/free interface
                     15: ** to obtain the memory it needs while adding lots of additional debugging
                     16: ** information to each allocation in order to help detect and fix memory
                     17: ** leaks and memory usage errors.
                     18: **
                     19: ** This file contains implementations of the low-level memory allocation
                     20: ** routines specified in the sqlite3_mem_methods object.
                     21: */
                     22: #include "sqliteInt.h"
                     23: 
                     24: /*
                     25: ** This version of the memory allocator is used only if the
                     26: ** SQLITE_MEMDEBUG macro is defined
                     27: */
                     28: #ifdef SQLITE_MEMDEBUG
                     29: 
                     30: /*
                     31: ** The backtrace functionality is only available with GLIBC
                     32: */
                     33: #ifdef __GLIBC__
                     34:   extern int backtrace(void**,int);
                     35:   extern void backtrace_symbols_fd(void*const*,int,int);
                     36: #else
                     37: # define backtrace(A,B) 1
                     38: # define backtrace_symbols_fd(A,B,C)
                     39: #endif
                     40: #include <stdio.h>
                     41: 
                     42: /*
                     43: ** Each memory allocation looks like this:
                     44: **
                     45: **  ------------------------------------------------------------------------
                     46: **  | Title |  backtrace pointers |  MemBlockHdr |  allocation |  EndGuard |
                     47: **  ------------------------------------------------------------------------
                     48: **
                     49: ** The application code sees only a pointer to the allocation.  We have
                     50: ** to back up from the allocation pointer to find the MemBlockHdr.  The
                     51: ** MemBlockHdr tells us the size of the allocation and the number of
                     52: ** backtrace pointers.  There is also a guard word at the end of the
                     53: ** MemBlockHdr.
                     54: */
                     55: struct MemBlockHdr {
                     56:   i64 iSize;                          /* Size of this allocation */
                     57:   struct MemBlockHdr *pNext, *pPrev;  /* Linked list of all unfreed memory */
                     58:   char nBacktrace;                    /* Number of backtraces on this alloc */
                     59:   char nBacktraceSlots;               /* Available backtrace slots */
                     60:   u8 nTitle;                          /* Bytes of title; includes '\0' */
                     61:   u8 eType;                           /* Allocation type code */
                     62:   int iForeGuard;                     /* Guard word for sanity */
                     63: };
                     64: 
                     65: /*
                     66: ** Guard words
                     67: */
                     68: #define FOREGUARD 0x80F5E153
                     69: #define REARGUARD 0xE4676B53
                     70: 
                     71: /*
                     72: ** Number of malloc size increments to track.
                     73: */
                     74: #define NCSIZE  1000
                     75: 
                     76: /*
                     77: ** All of the static variables used by this module are collected
                     78: ** into a single structure named "mem".  This is to keep the
                     79: ** static variables organized and to reduce namespace pollution
                     80: ** when this module is combined with other in the amalgamation.
                     81: */
                     82: static struct {
                     83:   
                     84:   /*
                     85:   ** Mutex to control access to the memory allocation subsystem.
                     86:   */
                     87:   sqlite3_mutex *mutex;
                     88: 
                     89:   /*
                     90:   ** Head and tail of a linked list of all outstanding allocations
                     91:   */
                     92:   struct MemBlockHdr *pFirst;
                     93:   struct MemBlockHdr *pLast;
                     94:   
                     95:   /*
                     96:   ** The number of levels of backtrace to save in new allocations.
                     97:   */
                     98:   int nBacktrace;
                     99:   void (*xBacktrace)(int, int, void **);
                    100: 
                    101:   /*
                    102:   ** Title text to insert in front of each block
                    103:   */
                    104:   int nTitle;        /* Bytes of zTitle to save.  Includes '\0' and padding */
                    105:   char zTitle[100];  /* The title text */
                    106: 
                    107:   /* 
                    108:   ** sqlite3MallocDisallow() increments the following counter.
                    109:   ** sqlite3MallocAllow() decrements it.
                    110:   */
                    111:   int disallow; /* Do not allow memory allocation */
                    112: 
                    113:   /*
                    114:   ** Gather statistics on the sizes of memory allocations.
                    115:   ** nAlloc[i] is the number of allocation attempts of i*8
                    116:   ** bytes.  i==NCSIZE is the number of allocation attempts for
                    117:   ** sizes more than NCSIZE*8 bytes.
                    118:   */
                    119:   int nAlloc[NCSIZE];      /* Total number of allocations */
                    120:   int nCurrent[NCSIZE];    /* Current number of allocations */
                    121:   int mxCurrent[NCSIZE];   /* Highwater mark for nCurrent */
                    122: 
                    123: } mem;
                    124: 
                    125: 
                    126: /*
                    127: ** Adjust memory usage statistics
                    128: */
                    129: static void adjustStats(int iSize, int increment){
                    130:   int i = ROUND8(iSize)/8;
                    131:   if( i>NCSIZE-1 ){
                    132:     i = NCSIZE - 1;
                    133:   }
                    134:   if( increment>0 ){
                    135:     mem.nAlloc[i]++;
                    136:     mem.nCurrent[i]++;
                    137:     if( mem.nCurrent[i]>mem.mxCurrent[i] ){
                    138:       mem.mxCurrent[i] = mem.nCurrent[i];
                    139:     }
                    140:   }else{
                    141:     mem.nCurrent[i]--;
                    142:     assert( mem.nCurrent[i]>=0 );
                    143:   }
                    144: }
                    145: 
                    146: /*
                    147: ** Given an allocation, find the MemBlockHdr for that allocation.
                    148: **
                    149: ** This routine checks the guards at either end of the allocation and
                    150: ** if they are incorrect it asserts.
                    151: */
                    152: static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){
                    153:   struct MemBlockHdr *p;
                    154:   int *pInt;
                    155:   u8 *pU8;
                    156:   int nReserve;
                    157: 
                    158:   p = (struct MemBlockHdr*)pAllocation;
                    159:   p--;
                    160:   assert( p->iForeGuard==(int)FOREGUARD );
                    161:   nReserve = ROUND8(p->iSize);
                    162:   pInt = (int*)pAllocation;
                    163:   pU8 = (u8*)pAllocation;
                    164:   assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD );
                    165:   /* This checks any of the "extra" bytes allocated due
                    166:   ** to rounding up to an 8 byte boundary to ensure 
                    167:   ** they haven't been overwritten.
                    168:   */
                    169:   while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 );
                    170:   return p;
                    171: }
                    172: 
                    173: /*
                    174: ** Return the number of bytes currently allocated at address p.
                    175: */
                    176: static int sqlite3MemSize(void *p){
                    177:   struct MemBlockHdr *pHdr;
                    178:   if( !p ){
                    179:     return 0;
                    180:   }
                    181:   pHdr = sqlite3MemsysGetHeader(p);
                    182:   return pHdr->iSize;
                    183: }
                    184: 
                    185: /*
                    186: ** Initialize the memory allocation subsystem.
                    187: */
                    188: static int sqlite3MemInit(void *NotUsed){
                    189:   UNUSED_PARAMETER(NotUsed);
                    190:   assert( (sizeof(struct MemBlockHdr)&7) == 0 );
                    191:   if( !sqlite3GlobalConfig.bMemstat ){
                    192:     /* If memory status is enabled, then the malloc.c wrapper will already
                    193:     ** hold the STATIC_MEM mutex when the routines here are invoked. */
                    194:     mem.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
                    195:   }
                    196:   return SQLITE_OK;
                    197: }
                    198: 
                    199: /*
                    200: ** Deinitialize the memory allocation subsystem.
                    201: */
                    202: static void sqlite3MemShutdown(void *NotUsed){
                    203:   UNUSED_PARAMETER(NotUsed);
                    204:   mem.mutex = 0;
                    205: }
                    206: 
                    207: /*
                    208: ** Round up a request size to the next valid allocation size.
                    209: */
                    210: static int sqlite3MemRoundup(int n){
                    211:   return ROUND8(n);
                    212: }
                    213: 
                    214: /*
                    215: ** Fill a buffer with pseudo-random bytes.  This is used to preset
                    216: ** the content of a new memory allocation to unpredictable values and
                    217: ** to clear the content of a freed allocation to unpredictable values.
                    218: */
                    219: static void randomFill(char *pBuf, int nByte){
                    220:   unsigned int x, y, r;
                    221:   x = SQLITE_PTR_TO_INT(pBuf);
                    222:   y = nByte | 1;
                    223:   while( nByte >= 4 ){
                    224:     x = (x>>1) ^ (-(x&1) & 0xd0000001);
                    225:     y = y*1103515245 + 12345;
                    226:     r = x ^ y;
                    227:     *(int*)pBuf = r;
                    228:     pBuf += 4;
                    229:     nByte -= 4;
                    230:   }
                    231:   while( nByte-- > 0 ){
                    232:     x = (x>>1) ^ (-(x&1) & 0xd0000001);
                    233:     y = y*1103515245 + 12345;
                    234:     r = x ^ y;
                    235:     *(pBuf++) = r & 0xff;
                    236:   }
                    237: }
                    238: 
                    239: /*
                    240: ** Allocate nByte bytes of memory.
                    241: */
                    242: static void *sqlite3MemMalloc(int nByte){
                    243:   struct MemBlockHdr *pHdr;
                    244:   void **pBt;
                    245:   char *z;
                    246:   int *pInt;
                    247:   void *p = 0;
                    248:   int totalSize;
                    249:   int nReserve;
                    250:   sqlite3_mutex_enter(mem.mutex);
                    251:   assert( mem.disallow==0 );
                    252:   nReserve = ROUND8(nByte);
                    253:   totalSize = nReserve + sizeof(*pHdr) + sizeof(int) +
                    254:                mem.nBacktrace*sizeof(void*) + mem.nTitle;
                    255:   p = malloc(totalSize);
                    256:   if( p ){
                    257:     z = p;
                    258:     pBt = (void**)&z[mem.nTitle];
                    259:     pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace];
                    260:     pHdr->pNext = 0;
                    261:     pHdr->pPrev = mem.pLast;
                    262:     if( mem.pLast ){
                    263:       mem.pLast->pNext = pHdr;
                    264:     }else{
                    265:       mem.pFirst = pHdr;
                    266:     }
                    267:     mem.pLast = pHdr;
                    268:     pHdr->iForeGuard = FOREGUARD;
                    269:     pHdr->eType = MEMTYPE_HEAP;
                    270:     pHdr->nBacktraceSlots = mem.nBacktrace;
                    271:     pHdr->nTitle = mem.nTitle;
                    272:     if( mem.nBacktrace ){
                    273:       void *aAddr[40];
                    274:       pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1;
                    275:       memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*));
                    276:       assert(pBt[0]);
                    277:       if( mem.xBacktrace ){
                    278:         mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]);
                    279:       }
                    280:     }else{
                    281:       pHdr->nBacktrace = 0;
                    282:     }
                    283:     if( mem.nTitle ){
                    284:       memcpy(z, mem.zTitle, mem.nTitle);
                    285:     }
                    286:     pHdr->iSize = nByte;
                    287:     adjustStats(nByte, +1);
                    288:     pInt = (int*)&pHdr[1];
                    289:     pInt[nReserve/sizeof(int)] = REARGUARD;
                    290:     randomFill((char*)pInt, nByte);
                    291:     memset(((char*)pInt)+nByte, 0x65, nReserve-nByte);
                    292:     p = (void*)pInt;
                    293:   }
                    294:   sqlite3_mutex_leave(mem.mutex);
                    295:   return p; 
                    296: }
                    297: 
                    298: /*
                    299: ** Free memory.
                    300: */
                    301: static void sqlite3MemFree(void *pPrior){
                    302:   struct MemBlockHdr *pHdr;
                    303:   void **pBt;
                    304:   char *z;
                    305:   assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0 
                    306:        || mem.mutex!=0 );
                    307:   pHdr = sqlite3MemsysGetHeader(pPrior);
                    308:   pBt = (void**)pHdr;
                    309:   pBt -= pHdr->nBacktraceSlots;
                    310:   sqlite3_mutex_enter(mem.mutex);
                    311:   if( pHdr->pPrev ){
                    312:     assert( pHdr->pPrev->pNext==pHdr );
                    313:     pHdr->pPrev->pNext = pHdr->pNext;
                    314:   }else{
                    315:     assert( mem.pFirst==pHdr );
                    316:     mem.pFirst = pHdr->pNext;
                    317:   }
                    318:   if( pHdr->pNext ){
                    319:     assert( pHdr->pNext->pPrev==pHdr );
                    320:     pHdr->pNext->pPrev = pHdr->pPrev;
                    321:   }else{
                    322:     assert( mem.pLast==pHdr );
                    323:     mem.pLast = pHdr->pPrev;
                    324:   }
                    325:   z = (char*)pBt;
                    326:   z -= pHdr->nTitle;
                    327:   adjustStats(pHdr->iSize, -1);
                    328:   randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) +
                    329:                 pHdr->iSize + sizeof(int) + pHdr->nTitle);
                    330:   free(z);
                    331:   sqlite3_mutex_leave(mem.mutex);  
                    332: }
                    333: 
                    334: /*
                    335: ** Change the size of an existing memory allocation.
                    336: **
                    337: ** For this debugging implementation, we *always* make a copy of the
                    338: ** allocation into a new place in memory.  In this way, if the 
                    339: ** higher level code is using pointer to the old allocation, it is 
                    340: ** much more likely to break and we are much more liking to find
                    341: ** the error.
                    342: */
                    343: static void *sqlite3MemRealloc(void *pPrior, int nByte){
                    344:   struct MemBlockHdr *pOldHdr;
                    345:   void *pNew;
                    346:   assert( mem.disallow==0 );
                    347:   assert( (nByte & 7)==0 );     /* EV: R-46199-30249 */
                    348:   pOldHdr = sqlite3MemsysGetHeader(pPrior);
                    349:   pNew = sqlite3MemMalloc(nByte);
                    350:   if( pNew ){
                    351:     memcpy(pNew, pPrior, nByte<pOldHdr->iSize ? nByte : pOldHdr->iSize);
                    352:     if( nByte>pOldHdr->iSize ){
                    353:       randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - pOldHdr->iSize);
                    354:     }
                    355:     sqlite3MemFree(pPrior);
                    356:   }
                    357:   return pNew;
                    358: }
                    359: 
                    360: /*
                    361: ** Populate the low-level memory allocation function pointers in
                    362: ** sqlite3GlobalConfig.m with pointers to the routines in this file.
                    363: */
                    364: void sqlite3MemSetDefault(void){
                    365:   static const sqlite3_mem_methods defaultMethods = {
                    366:      sqlite3MemMalloc,
                    367:      sqlite3MemFree,
                    368:      sqlite3MemRealloc,
                    369:      sqlite3MemSize,
                    370:      sqlite3MemRoundup,
                    371:      sqlite3MemInit,
                    372:      sqlite3MemShutdown,
                    373:      0
                    374:   };
                    375:   sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
                    376: }
                    377: 
                    378: /*
                    379: ** Set the "type" of an allocation.
                    380: */
                    381: void sqlite3MemdebugSetType(void *p, u8 eType){
                    382:   if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
                    383:     struct MemBlockHdr *pHdr;
                    384:     pHdr = sqlite3MemsysGetHeader(p);
                    385:     assert( pHdr->iForeGuard==FOREGUARD );
                    386:     pHdr->eType = eType;
                    387:   }
                    388: }
                    389: 
                    390: /*
                    391: ** Return TRUE if the mask of type in eType matches the type of the
                    392: ** allocation p.  Also return true if p==NULL.
                    393: **
                    394: ** This routine is designed for use within an assert() statement, to
                    395: ** verify the type of an allocation.  For example:
                    396: **
                    397: **     assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
                    398: */
                    399: int sqlite3MemdebugHasType(void *p, u8 eType){
                    400:   int rc = 1;
                    401:   if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
                    402:     struct MemBlockHdr *pHdr;
                    403:     pHdr = sqlite3MemsysGetHeader(p);
                    404:     assert( pHdr->iForeGuard==FOREGUARD );         /* Allocation is valid */
                    405:     if( (pHdr->eType&eType)==0 ){
                    406:       rc = 0;
                    407:     }
                    408:   }
                    409:   return rc;
                    410: }
                    411: 
                    412: /*
                    413: ** Return TRUE if the mask of type in eType matches no bits of the type of the
                    414: ** allocation p.  Also return true if p==NULL.
                    415: **
                    416: ** This routine is designed for use within an assert() statement, to
                    417: ** verify the type of an allocation.  For example:
                    418: **
                    419: **     assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
                    420: */
                    421: int sqlite3MemdebugNoType(void *p, u8 eType){
                    422:   int rc = 1;
                    423:   if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
                    424:     struct MemBlockHdr *pHdr;
                    425:     pHdr = sqlite3MemsysGetHeader(p);
                    426:     assert( pHdr->iForeGuard==FOREGUARD );         /* Allocation is valid */
                    427:     if( (pHdr->eType&eType)!=0 ){
                    428:       rc = 0;
                    429:     }
                    430:   }
                    431:   return rc;
                    432: }
                    433: 
                    434: /*
                    435: ** Set the number of backtrace levels kept for each allocation.
                    436: ** A value of zero turns off backtracing.  The number is always rounded
                    437: ** up to a multiple of 2.
                    438: */
                    439: void sqlite3MemdebugBacktrace(int depth){
                    440:   if( depth<0 ){ depth = 0; }
                    441:   if( depth>20 ){ depth = 20; }
                    442:   depth = (depth+1)&0xfe;
                    443:   mem.nBacktrace = depth;
                    444: }
                    445: 
                    446: void sqlite3MemdebugBacktraceCallback(void (*xBacktrace)(int, int, void **)){
                    447:   mem.xBacktrace = xBacktrace;
                    448: }
                    449: 
                    450: /*
                    451: ** Set the title string for subsequent allocations.
                    452: */
                    453: void sqlite3MemdebugSettitle(const char *zTitle){
                    454:   unsigned int n = sqlite3Strlen30(zTitle) + 1;
                    455:   sqlite3_mutex_enter(mem.mutex);
                    456:   if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1;
                    457:   memcpy(mem.zTitle, zTitle, n);
                    458:   mem.zTitle[n] = 0;
                    459:   mem.nTitle = ROUND8(n);
                    460:   sqlite3_mutex_leave(mem.mutex);
                    461: }
                    462: 
                    463: void sqlite3MemdebugSync(){
                    464:   struct MemBlockHdr *pHdr;
                    465:   for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){
                    466:     void **pBt = (void**)pHdr;
                    467:     pBt -= pHdr->nBacktraceSlots;
                    468:     mem.xBacktrace(pHdr->iSize, pHdr->nBacktrace-1, &pBt[1]);
                    469:   }
                    470: }
                    471: 
                    472: /*
                    473: ** Open the file indicated and write a log of all unfreed memory 
                    474: ** allocations into that log.
                    475: */
                    476: void sqlite3MemdebugDump(const char *zFilename){
                    477:   FILE *out;
                    478:   struct MemBlockHdr *pHdr;
                    479:   void **pBt;
                    480:   int i;
                    481:   out = fopen(zFilename, "w");
                    482:   if( out==0 ){
                    483:     fprintf(stderr, "** Unable to output memory debug output log: %s **\n",
                    484:                     zFilename);
                    485:     return;
                    486:   }
                    487:   for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){
                    488:     char *z = (char*)pHdr;
                    489:     z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle;
                    490:     fprintf(out, "**** %lld bytes at %p from %s ****\n", 
                    491:             pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???");
                    492:     if( pHdr->nBacktrace ){
                    493:       fflush(out);
                    494:       pBt = (void**)pHdr;
                    495:       pBt -= pHdr->nBacktraceSlots;
                    496:       backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out));
                    497:       fprintf(out, "\n");
                    498:     }
                    499:   }
                    500:   fprintf(out, "COUNTS:\n");
                    501:   for(i=0; i<NCSIZE-1; i++){
                    502:     if( mem.nAlloc[i] ){
                    503:       fprintf(out, "   %5d: %10d %10d %10d\n", 
                    504:             i*8, mem.nAlloc[i], mem.nCurrent[i], mem.mxCurrent[i]);
                    505:     }
                    506:   }
                    507:   if( mem.nAlloc[NCSIZE-1] ){
                    508:     fprintf(out, "   %5d: %10d %10d %10d\n",
                    509:              NCSIZE*8-8, mem.nAlloc[NCSIZE-1],
                    510:              mem.nCurrent[NCSIZE-1], mem.mxCurrent[NCSIZE-1]);
                    511:   }
                    512:   fclose(out);
                    513: }
                    514: 
                    515: /*
                    516: ** Return the number of times sqlite3MemMalloc() has been called.
                    517: */
                    518: int sqlite3MemdebugMallocCount(){
                    519:   int i;
                    520:   int nTotal = 0;
                    521:   for(i=0; i<NCSIZE; i++){
                    522:     nTotal += mem.nAlloc[i];
                    523:   }
                    524:   return nTotal;
                    525: }
                    526: 
                    527: 
                    528: #endif /* SQLITE_MEMDEBUG */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>