Annotation of embedaddon/sqlite3/src/malloc.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2001 September 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: ** Memory allocation functions used throughout sqlite.
        !            14: */
        !            15: #include "sqliteInt.h"
        !            16: #include <stdarg.h>
        !            17: 
        !            18: /*
        !            19: ** Attempt to release up to n bytes of non-essential memory currently
        !            20: ** held by SQLite. An example of non-essential memory is memory used to
        !            21: ** cache database pages that are not currently in use.
        !            22: */
        !            23: int sqlite3_release_memory(int n){
        !            24: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
        !            25:   return sqlite3PcacheReleaseMemory(n);
        !            26: #else
        !            27:   /* IMPLEMENTATION-OF: R-34391-24921 The sqlite3_release_memory() routine
        !            28:   ** is a no-op returning zero if SQLite is not compiled with
        !            29:   ** SQLITE_ENABLE_MEMORY_MANAGEMENT. */
        !            30:   UNUSED_PARAMETER(n);
        !            31:   return 0;
        !            32: #endif
        !            33: }
        !            34: 
        !            35: /*
        !            36: ** An instance of the following object records the location of
        !            37: ** each unused scratch buffer.
        !            38: */
        !            39: typedef struct ScratchFreeslot {
        !            40:   struct ScratchFreeslot *pNext;   /* Next unused scratch buffer */
        !            41: } ScratchFreeslot;
        !            42: 
        !            43: /*
        !            44: ** State information local to the memory allocation subsystem.
        !            45: */
        !            46: static SQLITE_WSD struct Mem0Global {
        !            47:   sqlite3_mutex *mutex;         /* Mutex to serialize access */
        !            48: 
        !            49:   /*
        !            50:   ** The alarm callback and its arguments.  The mem0.mutex lock will
        !            51:   ** be held while the callback is running.  Recursive calls into
        !            52:   ** the memory subsystem are allowed, but no new callbacks will be
        !            53:   ** issued.
        !            54:   */
        !            55:   sqlite3_int64 alarmThreshold;
        !            56:   void (*alarmCallback)(void*, sqlite3_int64,int);
        !            57:   void *alarmArg;
        !            58: 
        !            59:   /*
        !            60:   ** Pointers to the end of sqlite3GlobalConfig.pScratch memory
        !            61:   ** (so that a range test can be used to determine if an allocation
        !            62:   ** being freed came from pScratch) and a pointer to the list of
        !            63:   ** unused scratch allocations.
        !            64:   */
        !            65:   void *pScratchEnd;
        !            66:   ScratchFreeslot *pScratchFree;
        !            67:   u32 nScratchFree;
        !            68: 
        !            69:   /*
        !            70:   ** True if heap is nearly "full" where "full" is defined by the
        !            71:   ** sqlite3_soft_heap_limit() setting.
        !            72:   */
        !            73:   int nearlyFull;
        !            74: } mem0 = { 0, 0, 0, 0, 0, 0, 0, 0 };
        !            75: 
        !            76: #define mem0 GLOBAL(struct Mem0Global, mem0)
        !            77: 
        !            78: /*
        !            79: ** This routine runs when the memory allocator sees that the
        !            80: ** total memory allocation is about to exceed the soft heap
        !            81: ** limit.
        !            82: */
        !            83: static void softHeapLimitEnforcer(
        !            84:   void *NotUsed, 
        !            85:   sqlite3_int64 NotUsed2,
        !            86:   int allocSize
        !            87: ){
        !            88:   UNUSED_PARAMETER2(NotUsed, NotUsed2);
        !            89:   sqlite3_release_memory(allocSize);
        !            90: }
        !            91: 
        !            92: /*
        !            93: ** Change the alarm callback
        !            94: */
        !            95: static int sqlite3MemoryAlarm(
        !            96:   void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
        !            97:   void *pArg,
        !            98:   sqlite3_int64 iThreshold
        !            99: ){
        !           100:   int nUsed;
        !           101:   sqlite3_mutex_enter(mem0.mutex);
        !           102:   mem0.alarmCallback = xCallback;
        !           103:   mem0.alarmArg = pArg;
        !           104:   mem0.alarmThreshold = iThreshold;
        !           105:   nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
        !           106:   mem0.nearlyFull = (iThreshold>0 && iThreshold<=nUsed);
        !           107:   sqlite3_mutex_leave(mem0.mutex);
        !           108:   return SQLITE_OK;
        !           109: }
        !           110: 
        !           111: #ifndef SQLITE_OMIT_DEPRECATED
        !           112: /*
        !           113: ** Deprecated external interface.  Internal/core SQLite code
        !           114: ** should call sqlite3MemoryAlarm.
        !           115: */
        !           116: int sqlite3_memory_alarm(
        !           117:   void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
        !           118:   void *pArg,
        !           119:   sqlite3_int64 iThreshold
        !           120: ){
        !           121:   return sqlite3MemoryAlarm(xCallback, pArg, iThreshold);
        !           122: }
        !           123: #endif
        !           124: 
        !           125: /*
        !           126: ** Set the soft heap-size limit for the library. Passing a zero or 
        !           127: ** negative value indicates no limit.
        !           128: */
        !           129: sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){
        !           130:   sqlite3_int64 priorLimit;
        !           131:   sqlite3_int64 excess;
        !           132: #ifndef SQLITE_OMIT_AUTOINIT
        !           133:   int rc = sqlite3_initialize();
        !           134:   if( rc ) return -1;
        !           135: #endif
        !           136:   sqlite3_mutex_enter(mem0.mutex);
        !           137:   priorLimit = mem0.alarmThreshold;
        !           138:   sqlite3_mutex_leave(mem0.mutex);
        !           139:   if( n<0 ) return priorLimit;
        !           140:   if( n>0 ){
        !           141:     sqlite3MemoryAlarm(softHeapLimitEnforcer, 0, n);
        !           142:   }else{
        !           143:     sqlite3MemoryAlarm(0, 0, 0);
        !           144:   }
        !           145:   excess = sqlite3_memory_used() - n;
        !           146:   if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff));
        !           147:   return priorLimit;
        !           148: }
        !           149: void sqlite3_soft_heap_limit(int n){
        !           150:   if( n<0 ) n = 0;
        !           151:   sqlite3_soft_heap_limit64(n);
        !           152: }
        !           153: 
        !           154: /*
        !           155: ** Initialize the memory allocation subsystem.
        !           156: */
        !           157: int sqlite3MallocInit(void){
        !           158:   if( sqlite3GlobalConfig.m.xMalloc==0 ){
        !           159:     sqlite3MemSetDefault();
        !           160:   }
        !           161:   memset(&mem0, 0, sizeof(mem0));
        !           162:   if( sqlite3GlobalConfig.bCoreMutex ){
        !           163:     mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
        !           164:   }
        !           165:   if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100
        !           166:       && sqlite3GlobalConfig.nScratch>0 ){
        !           167:     int i, n, sz;
        !           168:     ScratchFreeslot *pSlot;
        !           169:     sz = ROUNDDOWN8(sqlite3GlobalConfig.szScratch);
        !           170:     sqlite3GlobalConfig.szScratch = sz;
        !           171:     pSlot = (ScratchFreeslot*)sqlite3GlobalConfig.pScratch;
        !           172:     n = sqlite3GlobalConfig.nScratch;
        !           173:     mem0.pScratchFree = pSlot;
        !           174:     mem0.nScratchFree = n;
        !           175:     for(i=0; i<n-1; i++){
        !           176:       pSlot->pNext = (ScratchFreeslot*)(sz+(char*)pSlot);
        !           177:       pSlot = pSlot->pNext;
        !           178:     }
        !           179:     pSlot->pNext = 0;
        !           180:     mem0.pScratchEnd = (void*)&pSlot[1];
        !           181:   }else{
        !           182:     mem0.pScratchEnd = 0;
        !           183:     sqlite3GlobalConfig.pScratch = 0;
        !           184:     sqlite3GlobalConfig.szScratch = 0;
        !           185:     sqlite3GlobalConfig.nScratch = 0;
        !           186:   }
        !           187:   if( sqlite3GlobalConfig.pPage==0 || sqlite3GlobalConfig.szPage<512
        !           188:       || sqlite3GlobalConfig.nPage<1 ){
        !           189:     sqlite3GlobalConfig.pPage = 0;
        !           190:     sqlite3GlobalConfig.szPage = 0;
        !           191:     sqlite3GlobalConfig.nPage = 0;
        !           192:   }
        !           193:   return sqlite3GlobalConfig.m.xInit(sqlite3GlobalConfig.m.pAppData);
        !           194: }
        !           195: 
        !           196: /*
        !           197: ** Return true if the heap is currently under memory pressure - in other
        !           198: ** words if the amount of heap used is close to the limit set by
        !           199: ** sqlite3_soft_heap_limit().
        !           200: */
        !           201: int sqlite3HeapNearlyFull(void){
        !           202:   return mem0.nearlyFull;
        !           203: }
        !           204: 
        !           205: /*
        !           206: ** Deinitialize the memory allocation subsystem.
        !           207: */
        !           208: void sqlite3MallocEnd(void){
        !           209:   if( sqlite3GlobalConfig.m.xShutdown ){
        !           210:     sqlite3GlobalConfig.m.xShutdown(sqlite3GlobalConfig.m.pAppData);
        !           211:   }
        !           212:   memset(&mem0, 0, sizeof(mem0));
        !           213: }
        !           214: 
        !           215: /*
        !           216: ** Return the amount of memory currently checked out.
        !           217: */
        !           218: sqlite3_int64 sqlite3_memory_used(void){
        !           219:   int n, mx;
        !           220:   sqlite3_int64 res;
        !           221:   sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, 0);
        !           222:   res = (sqlite3_int64)n;  /* Work around bug in Borland C. Ticket #3216 */
        !           223:   return res;
        !           224: }
        !           225: 
        !           226: /*
        !           227: ** Return the maximum amount of memory that has ever been
        !           228: ** checked out since either the beginning of this process
        !           229: ** or since the most recent reset.
        !           230: */
        !           231: sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
        !           232:   int n, mx;
        !           233:   sqlite3_int64 res;
        !           234:   sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, resetFlag);
        !           235:   res = (sqlite3_int64)mx;  /* Work around bug in Borland C. Ticket #3216 */
        !           236:   return res;
        !           237: }
        !           238: 
        !           239: /*
        !           240: ** Trigger the alarm 
        !           241: */
        !           242: static void sqlite3MallocAlarm(int nByte){
        !           243:   void (*xCallback)(void*,sqlite3_int64,int);
        !           244:   sqlite3_int64 nowUsed;
        !           245:   void *pArg;
        !           246:   if( mem0.alarmCallback==0 ) return;
        !           247:   xCallback = mem0.alarmCallback;
        !           248:   nowUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
        !           249:   pArg = mem0.alarmArg;
        !           250:   mem0.alarmCallback = 0;
        !           251:   sqlite3_mutex_leave(mem0.mutex);
        !           252:   xCallback(pArg, nowUsed, nByte);
        !           253:   sqlite3_mutex_enter(mem0.mutex);
        !           254:   mem0.alarmCallback = xCallback;
        !           255:   mem0.alarmArg = pArg;
        !           256: }
        !           257: 
        !           258: /*
        !           259: ** Do a memory allocation with statistics and alarms.  Assume the
        !           260: ** lock is already held.
        !           261: */
        !           262: static int mallocWithAlarm(int n, void **pp){
        !           263:   int nFull;
        !           264:   void *p;
        !           265:   assert( sqlite3_mutex_held(mem0.mutex) );
        !           266:   nFull = sqlite3GlobalConfig.m.xRoundup(n);
        !           267:   sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, n);
        !           268:   if( mem0.alarmCallback!=0 ){
        !           269:     int nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
        !           270:     if( nUsed >= mem0.alarmThreshold - nFull ){
        !           271:       mem0.nearlyFull = 1;
        !           272:       sqlite3MallocAlarm(nFull);
        !           273:     }else{
        !           274:       mem0.nearlyFull = 0;
        !           275:     }
        !           276:   }
        !           277:   p = sqlite3GlobalConfig.m.xMalloc(nFull);
        !           278: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
        !           279:   if( p==0 && mem0.alarmCallback ){
        !           280:     sqlite3MallocAlarm(nFull);
        !           281:     p = sqlite3GlobalConfig.m.xMalloc(nFull);
        !           282:   }
        !           283: #endif
        !           284:   if( p ){
        !           285:     nFull = sqlite3MallocSize(p);
        !           286:     sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nFull);
        !           287:     sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, 1);
        !           288:   }
        !           289:   *pp = p;
        !           290:   return nFull;
        !           291: }
        !           292: 
        !           293: /*
        !           294: ** Allocate memory.  This routine is like sqlite3_malloc() except that it
        !           295: ** assumes the memory subsystem has already been initialized.
        !           296: */
        !           297: void *sqlite3Malloc(int n){
        !           298:   void *p;
        !           299:   if( n<=0               /* IMP: R-65312-04917 */ 
        !           300:    || n>=0x7fffff00
        !           301:   ){
        !           302:     /* A memory allocation of a number of bytes which is near the maximum
        !           303:     ** signed integer value might cause an integer overflow inside of the
        !           304:     ** xMalloc().  Hence we limit the maximum size to 0x7fffff00, giving
        !           305:     ** 255 bytes of overhead.  SQLite itself will never use anything near
        !           306:     ** this amount.  The only way to reach the limit is with sqlite3_malloc() */
        !           307:     p = 0;
        !           308:   }else if( sqlite3GlobalConfig.bMemstat ){
        !           309:     sqlite3_mutex_enter(mem0.mutex);
        !           310:     mallocWithAlarm(n, &p);
        !           311:     sqlite3_mutex_leave(mem0.mutex);
        !           312:   }else{
        !           313:     p = sqlite3GlobalConfig.m.xMalloc(n);
        !           314:   }
        !           315:   assert( EIGHT_BYTE_ALIGNMENT(p) );  /* IMP: R-04675-44850 */
        !           316:   return p;
        !           317: }
        !           318: 
        !           319: /*
        !           320: ** This version of the memory allocation is for use by the application.
        !           321: ** First make sure the memory subsystem is initialized, then do the
        !           322: ** allocation.
        !           323: */
        !           324: void *sqlite3_malloc(int n){
        !           325: #ifndef SQLITE_OMIT_AUTOINIT
        !           326:   if( sqlite3_initialize() ) return 0;
        !           327: #endif
        !           328:   return sqlite3Malloc(n);
        !           329: }
        !           330: 
        !           331: /*
        !           332: ** Each thread may only have a single outstanding allocation from
        !           333: ** xScratchMalloc().  We verify this constraint in the single-threaded
        !           334: ** case by setting scratchAllocOut to 1 when an allocation
        !           335: ** is outstanding clearing it when the allocation is freed.
        !           336: */
        !           337: #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
        !           338: static int scratchAllocOut = 0;
        !           339: #endif
        !           340: 
        !           341: 
        !           342: /*
        !           343: ** Allocate memory that is to be used and released right away.
        !           344: ** This routine is similar to alloca() in that it is not intended
        !           345: ** for situations where the memory might be held long-term.  This
        !           346: ** routine is intended to get memory to old large transient data
        !           347: ** structures that would not normally fit on the stack of an
        !           348: ** embedded processor.
        !           349: */
        !           350: void *sqlite3ScratchMalloc(int n){
        !           351:   void *p;
        !           352:   assert( n>0 );
        !           353: 
        !           354:   sqlite3_mutex_enter(mem0.mutex);
        !           355:   if( mem0.nScratchFree && sqlite3GlobalConfig.szScratch>=n ){
        !           356:     p = mem0.pScratchFree;
        !           357:     mem0.pScratchFree = mem0.pScratchFree->pNext;
        !           358:     mem0.nScratchFree--;
        !           359:     sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, 1);
        !           360:     sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n);
        !           361:     sqlite3_mutex_leave(mem0.mutex);
        !           362:   }else{
        !           363:     if( sqlite3GlobalConfig.bMemstat ){
        !           364:       sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n);
        !           365:       n = mallocWithAlarm(n, &p);
        !           366:       if( p ) sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, n);
        !           367:       sqlite3_mutex_leave(mem0.mutex);
        !           368:     }else{
        !           369:       sqlite3_mutex_leave(mem0.mutex);
        !           370:       p = sqlite3GlobalConfig.m.xMalloc(n);
        !           371:     }
        !           372:     sqlite3MemdebugSetType(p, MEMTYPE_SCRATCH);
        !           373:   }
        !           374:   assert( sqlite3_mutex_notheld(mem0.mutex) );
        !           375: 
        !           376: 
        !           377: #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
        !           378:   /* Verify that no more than two scratch allocations per thread
        !           379:   ** are outstanding at one time.  (This is only checked in the
        !           380:   ** single-threaded case since checking in the multi-threaded case
        !           381:   ** would be much more complicated.) */
        !           382:   assert( scratchAllocOut<=1 );
        !           383:   if( p ) scratchAllocOut++;
        !           384: #endif
        !           385: 
        !           386:   return p;
        !           387: }
        !           388: void sqlite3ScratchFree(void *p){
        !           389:   if( p ){
        !           390: 
        !           391: #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
        !           392:     /* Verify that no more than two scratch allocation per thread
        !           393:     ** is outstanding at one time.  (This is only checked in the
        !           394:     ** single-threaded case since checking in the multi-threaded case
        !           395:     ** would be much more complicated.) */
        !           396:     assert( scratchAllocOut>=1 && scratchAllocOut<=2 );
        !           397:     scratchAllocOut--;
        !           398: #endif
        !           399: 
        !           400:     if( p>=sqlite3GlobalConfig.pScratch && p<mem0.pScratchEnd ){
        !           401:       /* Release memory from the SQLITE_CONFIG_SCRATCH allocation */
        !           402:       ScratchFreeslot *pSlot;
        !           403:       pSlot = (ScratchFreeslot*)p;
        !           404:       sqlite3_mutex_enter(mem0.mutex);
        !           405:       pSlot->pNext = mem0.pScratchFree;
        !           406:       mem0.pScratchFree = pSlot;
        !           407:       mem0.nScratchFree++;
        !           408:       assert( mem0.nScratchFree <= (u32)sqlite3GlobalConfig.nScratch );
        !           409:       sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, -1);
        !           410:       sqlite3_mutex_leave(mem0.mutex);
        !           411:     }else{
        !           412:       /* Release memory back to the heap */
        !           413:       assert( sqlite3MemdebugHasType(p, MEMTYPE_SCRATCH) );
        !           414:       assert( sqlite3MemdebugNoType(p, ~MEMTYPE_SCRATCH) );
        !           415:       sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
        !           416:       if( sqlite3GlobalConfig.bMemstat ){
        !           417:         int iSize = sqlite3MallocSize(p);
        !           418:         sqlite3_mutex_enter(mem0.mutex);
        !           419:         sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, -iSize);
        !           420:         sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -iSize);
        !           421:         sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1);
        !           422:         sqlite3GlobalConfig.m.xFree(p);
        !           423:         sqlite3_mutex_leave(mem0.mutex);
        !           424:       }else{
        !           425:         sqlite3GlobalConfig.m.xFree(p);
        !           426:       }
        !           427:     }
        !           428:   }
        !           429: }
        !           430: 
        !           431: /*
        !           432: ** TRUE if p is a lookaside memory allocation from db
        !           433: */
        !           434: #ifndef SQLITE_OMIT_LOOKASIDE
        !           435: static int isLookaside(sqlite3 *db, void *p){
        !           436:   return p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
        !           437: }
        !           438: #else
        !           439: #define isLookaside(A,B) 0
        !           440: #endif
        !           441: 
        !           442: /*
        !           443: ** Return the size of a memory allocation previously obtained from
        !           444: ** sqlite3Malloc() or sqlite3_malloc().
        !           445: */
        !           446: int sqlite3MallocSize(void *p){
        !           447:   assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
        !           448:   assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
        !           449:   return sqlite3GlobalConfig.m.xSize(p);
        !           450: }
        !           451: int sqlite3DbMallocSize(sqlite3 *db, void *p){
        !           452:   assert( db==0 || sqlite3_mutex_held(db->mutex) );
        !           453:   if( db && isLookaside(db, p) ){
        !           454:     return db->lookaside.sz;
        !           455:   }else{
        !           456:     assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
        !           457:     assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
        !           458:     assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
        !           459:     return sqlite3GlobalConfig.m.xSize(p);
        !           460:   }
        !           461: }
        !           462: 
        !           463: /*
        !           464: ** Free memory previously obtained from sqlite3Malloc().
        !           465: */
        !           466: void sqlite3_free(void *p){
        !           467:   if( p==0 ) return;  /* IMP: R-49053-54554 */
        !           468:   assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
        !           469:   assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
        !           470:   if( sqlite3GlobalConfig.bMemstat ){
        !           471:     sqlite3_mutex_enter(mem0.mutex);
        !           472:     sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -sqlite3MallocSize(p));
        !           473:     sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1);
        !           474:     sqlite3GlobalConfig.m.xFree(p);
        !           475:     sqlite3_mutex_leave(mem0.mutex);
        !           476:   }else{
        !           477:     sqlite3GlobalConfig.m.xFree(p);
        !           478:   }
        !           479: }
        !           480: 
        !           481: /*
        !           482: ** Free memory that might be associated with a particular database
        !           483: ** connection.
        !           484: */
        !           485: void sqlite3DbFree(sqlite3 *db, void *p){
        !           486:   assert( db==0 || sqlite3_mutex_held(db->mutex) );
        !           487:   if( db ){
        !           488:     if( db->pnBytesFreed ){
        !           489:       *db->pnBytesFreed += sqlite3DbMallocSize(db, p);
        !           490:       return;
        !           491:     }
        !           492:     if( isLookaside(db, p) ){
        !           493:       LookasideSlot *pBuf = (LookasideSlot*)p;
        !           494:       pBuf->pNext = db->lookaside.pFree;
        !           495:       db->lookaside.pFree = pBuf;
        !           496:       db->lookaside.nOut--;
        !           497:       return;
        !           498:     }
        !           499:   }
        !           500:   assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
        !           501:   assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
        !           502:   assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
        !           503:   sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
        !           504:   sqlite3_free(p);
        !           505: }
        !           506: 
        !           507: /*
        !           508: ** Change the size of an existing memory allocation
        !           509: */
        !           510: void *sqlite3Realloc(void *pOld, int nBytes){
        !           511:   int nOld, nNew, nDiff;
        !           512:   void *pNew;
        !           513:   if( pOld==0 ){
        !           514:     return sqlite3Malloc(nBytes); /* IMP: R-28354-25769 */
        !           515:   }
        !           516:   if( nBytes<=0 ){
        !           517:     sqlite3_free(pOld); /* IMP: R-31593-10574 */
        !           518:     return 0;
        !           519:   }
        !           520:   if( nBytes>=0x7fffff00 ){
        !           521:     /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */
        !           522:     return 0;
        !           523:   }
        !           524:   nOld = sqlite3MallocSize(pOld);
        !           525:   /* IMPLEMENTATION-OF: R-46199-30249 SQLite guarantees that the second
        !           526:   ** argument to xRealloc is always a value returned by a prior call to
        !           527:   ** xRoundup. */
        !           528:   nNew = sqlite3GlobalConfig.m.xRoundup(nBytes);
        !           529:   if( nOld==nNew ){
        !           530:     pNew = pOld;
        !           531:   }else if( sqlite3GlobalConfig.bMemstat ){
        !           532:     sqlite3_mutex_enter(mem0.mutex);
        !           533:     sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, nBytes);
        !           534:     nDiff = nNew - nOld;
        !           535:     if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= 
        !           536:           mem0.alarmThreshold-nDiff ){
        !           537:       sqlite3MallocAlarm(nDiff);
        !           538:     }
        !           539:     assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) );
        !           540:     assert( sqlite3MemdebugNoType(pOld, ~MEMTYPE_HEAP) );
        !           541:     pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
        !           542:     if( pNew==0 && mem0.alarmCallback ){
        !           543:       sqlite3MallocAlarm(nBytes);
        !           544:       pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
        !           545:     }
        !           546:     if( pNew ){
        !           547:       nNew = sqlite3MallocSize(pNew);
        !           548:       sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nNew-nOld);
        !           549:     }
        !           550:     sqlite3_mutex_leave(mem0.mutex);
        !           551:   }else{
        !           552:     pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
        !           553:   }
        !           554:   assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-04675-44850 */
        !           555:   return pNew;
        !           556: }
        !           557: 
        !           558: /*
        !           559: ** The public interface to sqlite3Realloc.  Make sure that the memory
        !           560: ** subsystem is initialized prior to invoking sqliteRealloc.
        !           561: */
        !           562: void *sqlite3_realloc(void *pOld, int n){
        !           563: #ifndef SQLITE_OMIT_AUTOINIT
        !           564:   if( sqlite3_initialize() ) return 0;
        !           565: #endif
        !           566:   return sqlite3Realloc(pOld, n);
        !           567: }
        !           568: 
        !           569: 
        !           570: /*
        !           571: ** Allocate and zero memory.
        !           572: */ 
        !           573: void *sqlite3MallocZero(int n){
        !           574:   void *p = sqlite3Malloc(n);
        !           575:   if( p ){
        !           576:     memset(p, 0, n);
        !           577:   }
        !           578:   return p;
        !           579: }
        !           580: 
        !           581: /*
        !           582: ** Allocate and zero memory.  If the allocation fails, make
        !           583: ** the mallocFailed flag in the connection pointer.
        !           584: */
        !           585: void *sqlite3DbMallocZero(sqlite3 *db, int n){
        !           586:   void *p = sqlite3DbMallocRaw(db, n);
        !           587:   if( p ){
        !           588:     memset(p, 0, n);
        !           589:   }
        !           590:   return p;
        !           591: }
        !           592: 
        !           593: /*
        !           594: ** Allocate and zero memory.  If the allocation fails, make
        !           595: ** the mallocFailed flag in the connection pointer.
        !           596: **
        !           597: ** If db!=0 and db->mallocFailed is true (indicating a prior malloc
        !           598: ** failure on the same database connection) then always return 0.
        !           599: ** Hence for a particular database connection, once malloc starts
        !           600: ** failing, it fails consistently until mallocFailed is reset.
        !           601: ** This is an important assumption.  There are many places in the
        !           602: ** code that do things like this:
        !           603: **
        !           604: **         int *a = (int*)sqlite3DbMallocRaw(db, 100);
        !           605: **         int *b = (int*)sqlite3DbMallocRaw(db, 200);
        !           606: **         if( b ) a[10] = 9;
        !           607: **
        !           608: ** In other words, if a subsequent malloc (ex: "b") worked, it is assumed
        !           609: ** that all prior mallocs (ex: "a") worked too.
        !           610: */
        !           611: void *sqlite3DbMallocRaw(sqlite3 *db, int n){
        !           612:   void *p;
        !           613:   assert( db==0 || sqlite3_mutex_held(db->mutex) );
        !           614:   assert( db==0 || db->pnBytesFreed==0 );
        !           615: #ifndef SQLITE_OMIT_LOOKASIDE
        !           616:   if( db ){
        !           617:     LookasideSlot *pBuf;
        !           618:     if( db->mallocFailed ){
        !           619:       return 0;
        !           620:     }
        !           621:     if( db->lookaside.bEnabled ){
        !           622:       if( n>db->lookaside.sz ){
        !           623:         db->lookaside.anStat[1]++;
        !           624:       }else if( (pBuf = db->lookaside.pFree)==0 ){
        !           625:         db->lookaside.anStat[2]++;
        !           626:       }else{
        !           627:         db->lookaside.pFree = pBuf->pNext;
        !           628:         db->lookaside.nOut++;
        !           629:         db->lookaside.anStat[0]++;
        !           630:         if( db->lookaside.nOut>db->lookaside.mxOut ){
        !           631:           db->lookaside.mxOut = db->lookaside.nOut;
        !           632:         }
        !           633:         return (void*)pBuf;
        !           634:       }
        !           635:     }
        !           636:   }
        !           637: #else
        !           638:   if( db && db->mallocFailed ){
        !           639:     return 0;
        !           640:   }
        !           641: #endif
        !           642:   p = sqlite3Malloc(n);
        !           643:   if( !p && db ){
        !           644:     db->mallocFailed = 1;
        !           645:   }
        !           646:   sqlite3MemdebugSetType(p, MEMTYPE_DB |
        !           647:          ((db && db->lookaside.bEnabled) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
        !           648:   return p;
        !           649: }
        !           650: 
        !           651: /*
        !           652: ** Resize the block of memory pointed to by p to n bytes. If the
        !           653: ** resize fails, set the mallocFailed flag in the connection object.
        !           654: */
        !           655: void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){
        !           656:   void *pNew = 0;
        !           657:   assert( db!=0 );
        !           658:   assert( sqlite3_mutex_held(db->mutex) );
        !           659:   if( db->mallocFailed==0 ){
        !           660:     if( p==0 ){
        !           661:       return sqlite3DbMallocRaw(db, n);
        !           662:     }
        !           663:     if( isLookaside(db, p) ){
        !           664:       if( n<=db->lookaside.sz ){
        !           665:         return p;
        !           666:       }
        !           667:       pNew = sqlite3DbMallocRaw(db, n);
        !           668:       if( pNew ){
        !           669:         memcpy(pNew, p, db->lookaside.sz);
        !           670:         sqlite3DbFree(db, p);
        !           671:       }
        !           672:     }else{
        !           673:       assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
        !           674:       assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
        !           675:       sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
        !           676:       pNew = sqlite3_realloc(p, n);
        !           677:       if( !pNew ){
        !           678:         sqlite3MemdebugSetType(p, MEMTYPE_DB|MEMTYPE_HEAP);
        !           679:         db->mallocFailed = 1;
        !           680:       }
        !           681:       sqlite3MemdebugSetType(pNew, MEMTYPE_DB | 
        !           682:             (db->lookaside.bEnabled ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
        !           683:     }
        !           684:   }
        !           685:   return pNew;
        !           686: }
        !           687: 
        !           688: /*
        !           689: ** Attempt to reallocate p.  If the reallocation fails, then free p
        !           690: ** and set the mallocFailed flag in the database connection.
        !           691: */
        !           692: void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){
        !           693:   void *pNew;
        !           694:   pNew = sqlite3DbRealloc(db, p, n);
        !           695:   if( !pNew ){
        !           696:     sqlite3DbFree(db, p);
        !           697:   }
        !           698:   return pNew;
        !           699: }
        !           700: 
        !           701: /*
        !           702: ** Make a copy of a string in memory obtained from sqliteMalloc(). These 
        !           703: ** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This
        !           704: ** is because when memory debugging is turned on, these two functions are 
        !           705: ** called via macros that record the current file and line number in the
        !           706: ** ThreadData structure.
        !           707: */
        !           708: char *sqlite3DbStrDup(sqlite3 *db, const char *z){
        !           709:   char *zNew;
        !           710:   size_t n;
        !           711:   if( z==0 ){
        !           712:     return 0;
        !           713:   }
        !           714:   n = sqlite3Strlen30(z) + 1;
        !           715:   assert( (n&0x7fffffff)==n );
        !           716:   zNew = sqlite3DbMallocRaw(db, (int)n);
        !           717:   if( zNew ){
        !           718:     memcpy(zNew, z, n);
        !           719:   }
        !           720:   return zNew;
        !           721: }
        !           722: char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){
        !           723:   char *zNew;
        !           724:   if( z==0 ){
        !           725:     return 0;
        !           726:   }
        !           727:   assert( (n&0x7fffffff)==n );
        !           728:   zNew = sqlite3DbMallocRaw(db, n+1);
        !           729:   if( zNew ){
        !           730:     memcpy(zNew, z, n);
        !           731:     zNew[n] = 0;
        !           732:   }
        !           733:   return zNew;
        !           734: }
        !           735: 
        !           736: /*
        !           737: ** Create a string from the zFromat argument and the va_list that follows.
        !           738: ** Store the string in memory obtained from sqliteMalloc() and make *pz
        !           739: ** point to that string.
        !           740: */
        !           741: void sqlite3SetString(char **pz, sqlite3 *db, const char *zFormat, ...){
        !           742:   va_list ap;
        !           743:   char *z;
        !           744: 
        !           745:   va_start(ap, zFormat);
        !           746:   z = sqlite3VMPrintf(db, zFormat, ap);
        !           747:   va_end(ap);
        !           748:   sqlite3DbFree(db, *pz);
        !           749:   *pz = z;
        !           750: }
        !           751: 
        !           752: 
        !           753: /*
        !           754: ** This function must be called before exiting any API function (i.e. 
        !           755: ** returning control to the user) that has called sqlite3_malloc or
        !           756: ** sqlite3_realloc.
        !           757: **
        !           758: ** The returned value is normally a copy of the second argument to this
        !           759: ** function. However, if a malloc() failure has occurred since the previous
        !           760: ** invocation SQLITE_NOMEM is returned instead. 
        !           761: **
        !           762: ** If the first argument, db, is not NULL and a malloc() error has occurred,
        !           763: ** then the connection error-code (the value returned by sqlite3_errcode())
        !           764: ** is set to SQLITE_NOMEM.
        !           765: */
        !           766: int sqlite3ApiExit(sqlite3* db, int rc){
        !           767:   /* If the db handle is not NULL, then we must hold the connection handle
        !           768:   ** mutex here. Otherwise the read (and possible write) of db->mallocFailed 
        !           769:   ** is unsafe, as is the call to sqlite3Error().
        !           770:   */
        !           771:   assert( !db || sqlite3_mutex_held(db->mutex) );
        !           772:   if( db && (db->mallocFailed || rc==SQLITE_IOERR_NOMEM) ){
        !           773:     sqlite3Error(db, SQLITE_NOMEM, 0);
        !           774:     db->mallocFailed = 0;
        !           775:     rc = SQLITE_NOMEM;
        !           776:   }
        !           777:   return rc & (db ? db->errMask : 0xff);
        !           778: }

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