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>