1a3152895Sdrh /* 2a3152895Sdrh ** 2001 September 15 3a3152895Sdrh ** 4a3152895Sdrh ** The author disclaims copyright to this source code. In place of 5a3152895Sdrh ** a legal notice, here is a blessing: 6a3152895Sdrh ** 7a3152895Sdrh ** May you do good and not evil. 8a3152895Sdrh ** May you find forgiveness for yourself and forgive others. 9a3152895Sdrh ** May you share freely, never taking more than you give. 10a3152895Sdrh ** 11a3152895Sdrh ************************************************************************* 12*fec00eabSdrh ** 13a3152895Sdrh ** Memory allocation functions used throughout sqlite. 14a3152895Sdrh ** 15*fec00eabSdrh ** $Id: malloc.c,v 1.16 2008/06/14 16:56:22 drh Exp $ 16a3152895Sdrh */ 17a3152895Sdrh #include "sqliteInt.h" 18a3152895Sdrh #include <stdarg.h> 19a3152895Sdrh #include <ctype.h> 20a3152895Sdrh 21a3152895Sdrh /* 22b21c8cd4Sdrh ** This routine runs when the memory allocator sees that the 23b21c8cd4Sdrh ** total memory allocation is about to exceed the soft heap 24b21c8cd4Sdrh ** limit. 25b21c8cd4Sdrh */ 26b21c8cd4Sdrh static void softHeapLimitEnforcer( 27b21c8cd4Sdrh void *NotUsed, 28153c62c4Sdrh sqlite3_int64 inUse, 29153c62c4Sdrh int allocSize 30b21c8cd4Sdrh ){ 31b21c8cd4Sdrh sqlite3_release_memory(allocSize); 32b21c8cd4Sdrh } 33b21c8cd4Sdrh 34b21c8cd4Sdrh /* 35b21c8cd4Sdrh ** Set the soft heap-size limit for the current thread. Passing a 36b21c8cd4Sdrh ** zero or negative value indicates no limit. 37a3152895Sdrh */ 38a3152895Sdrh void sqlite3_soft_heap_limit(int n){ 39b21c8cd4Sdrh sqlite3_uint64 iLimit; 40b21c8cd4Sdrh int overage; 41b21c8cd4Sdrh if( n<0 ){ 42b21c8cd4Sdrh iLimit = 0; 43b21c8cd4Sdrh }else{ 44b21c8cd4Sdrh iLimit = n; 45a3152895Sdrh } 46b21c8cd4Sdrh if( iLimit>0 ){ 47b21c8cd4Sdrh sqlite3_memory_alarm(softHeapLimitEnforcer, 0, iLimit); 48b21c8cd4Sdrh }else{ 49b21c8cd4Sdrh sqlite3_memory_alarm(0, 0, 0); 50b21c8cd4Sdrh } 51b21c8cd4Sdrh overage = sqlite3_memory_used() - n; 52b21c8cd4Sdrh if( overage>0 ){ 53b21c8cd4Sdrh sqlite3_release_memory(overage); 54b21c8cd4Sdrh } 55a3152895Sdrh } 56a3152895Sdrh 57a3152895Sdrh /* 58a3152895Sdrh ** Release memory held by SQLite instances created by the current thread. 59a3152895Sdrh */ 60a3152895Sdrh int sqlite3_release_memory(int n){ 6186f8c197Sdrh #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT 62dfb316d4Sdanielk1977 int nRet = sqlite3VdbeReleaseMemory(n); 63dfb316d4Sdanielk1977 nRet += sqlite3PagerReleaseMemory(n-nRet); 64dfb316d4Sdanielk1977 return nRet; 651e536953Sdanielk1977 #else 661e536953Sdanielk1977 return SQLITE_OK; 671e536953Sdanielk1977 #endif 68a3152895Sdrh } 69a3152895Sdrh 70*fec00eabSdrh /* 71*fec00eabSdrh ** State information local to the memory allocation subsystem. 72*fec00eabSdrh */ 73*fec00eabSdrh static struct { 74*fec00eabSdrh sqlite3_mutex *mutex; /* Mutex to serialize access */ 75*fec00eabSdrh 76*fec00eabSdrh /* 77*fec00eabSdrh ** The alarm callback and its arguments. The mem0.mutex lock will 78*fec00eabSdrh ** be held while the callback is running. Recursive calls into 79*fec00eabSdrh ** the memory subsystem are allowed, but no new callbacks will be 80*fec00eabSdrh ** issued. The alarmBusy variable is set to prevent recursive 81*fec00eabSdrh ** callbacks. 82*fec00eabSdrh */ 83*fec00eabSdrh sqlite3_int64 alarmThreshold; 84*fec00eabSdrh void (*alarmCallback)(void*, sqlite3_int64,int); 85*fec00eabSdrh void *alarmArg; 86*fec00eabSdrh int alarmBusy; 87*fec00eabSdrh 88*fec00eabSdrh /* 89*fec00eabSdrh ** Performance statistics 90*fec00eabSdrh */ 91*fec00eabSdrh sqlite3_int64 nowUsed; /* Main memory currently in use */ 92*fec00eabSdrh sqlite3_int64 mxUsed; /* Highwater mark for nowUsed */ 93*fec00eabSdrh int mxReq; /* maximum request size for main or page-cache mem */ 94*fec00eabSdrh } mem0; 95*fec00eabSdrh 96*fec00eabSdrh /* 97*fec00eabSdrh ** Initialize the memory allocation subsystem. 98*fec00eabSdrh */ 99*fec00eabSdrh int sqlite3MallocInit(void){ 100*fec00eabSdrh if( sqlite3Config.m.xMalloc==0 ){ 101*fec00eabSdrh sqlite3MemSetDefault(); 102*fec00eabSdrh } 103*fec00eabSdrh memset(&mem0, 0, sizeof(mem0)); 104*fec00eabSdrh if( sqlite3Config.bMemstat && sqlite3Config.bCoreMutex ){ 105*fec00eabSdrh mem0.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); 106*fec00eabSdrh } 107*fec00eabSdrh return sqlite3Config.m.xInit(sqlite3Config.m.pAppData); 108*fec00eabSdrh } 109*fec00eabSdrh 110*fec00eabSdrh /* 111*fec00eabSdrh ** Deinitialize the memory allocation subsystem. 112*fec00eabSdrh */ 113*fec00eabSdrh void sqlite3MallocEnd(void){ 114*fec00eabSdrh sqlite3Config.m.xShutdown(sqlite3Config.m.pAppData); 115*fec00eabSdrh } 116*fec00eabSdrh 117*fec00eabSdrh /* 118*fec00eabSdrh ** Return the amount of memory currently checked out. 119*fec00eabSdrh */ 120*fec00eabSdrh sqlite3_int64 sqlite3_memory_used(void){ 121*fec00eabSdrh sqlite3_int64 n; 122*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 123*fec00eabSdrh n = mem0.nowUsed; 124*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 125*fec00eabSdrh return n; 126*fec00eabSdrh } 127*fec00eabSdrh 128*fec00eabSdrh /* 129*fec00eabSdrh ** Return the maximum amount of memory that has ever been 130*fec00eabSdrh ** checked out since either the beginning of this process 131*fec00eabSdrh ** or since the most recent reset. 132*fec00eabSdrh */ 133*fec00eabSdrh sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ 134*fec00eabSdrh sqlite3_int64 n; 135*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 136*fec00eabSdrh n = mem0.mxUsed; 137*fec00eabSdrh if( resetFlag ){ 138*fec00eabSdrh mem0.mxUsed = mem0.nowUsed; 139*fec00eabSdrh } 140*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 141*fec00eabSdrh return n; 142*fec00eabSdrh } 143*fec00eabSdrh 144*fec00eabSdrh /* 145*fec00eabSdrh ** Change the alarm callback 146*fec00eabSdrh */ 147*fec00eabSdrh int sqlite3_memory_alarm( 148*fec00eabSdrh void(*xCallback)(void *pArg, sqlite3_int64 used,int N), 149*fec00eabSdrh void *pArg, 150*fec00eabSdrh sqlite3_int64 iThreshold 151*fec00eabSdrh ){ 152*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 153*fec00eabSdrh mem0.alarmCallback = xCallback; 154*fec00eabSdrh mem0.alarmArg = pArg; 155*fec00eabSdrh mem0.alarmThreshold = iThreshold; 156*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 157*fec00eabSdrh return SQLITE_OK; 158*fec00eabSdrh } 159*fec00eabSdrh 160*fec00eabSdrh /* 161*fec00eabSdrh ** Trigger the alarm 162*fec00eabSdrh */ 163*fec00eabSdrh static void sqlite3MallocAlarm(int nByte){ 164*fec00eabSdrh void (*xCallback)(void*,sqlite3_int64,int); 165*fec00eabSdrh sqlite3_int64 nowUsed; 166*fec00eabSdrh void *pArg; 167*fec00eabSdrh if( mem0.alarmCallback==0 || mem0.alarmBusy ) return; 168*fec00eabSdrh mem0.alarmBusy = 1; 169*fec00eabSdrh xCallback = mem0.alarmCallback; 170*fec00eabSdrh nowUsed = mem0.nowUsed; 171*fec00eabSdrh pArg = mem0.alarmArg; 172*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 173*fec00eabSdrh xCallback(pArg, nowUsed, nByte); 174*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 175*fec00eabSdrh mem0.alarmBusy = 0; 176*fec00eabSdrh } 177*fec00eabSdrh 178*fec00eabSdrh 179*fec00eabSdrh /* 180*fec00eabSdrh ** Allocate memory. This routine is like sqlite3_malloc() except that it 181*fec00eabSdrh ** assumes the memory subsystem has already been initialized. 182*fec00eabSdrh */ 183*fec00eabSdrh void *sqlite3Malloc(int n){ 184*fec00eabSdrh void *p; 185*fec00eabSdrh int nFull; 186*fec00eabSdrh if( n<=0 ){ 187*fec00eabSdrh return 0; 188*fec00eabSdrh }else if( sqlite3Config.bMemstat ){ 189*fec00eabSdrh nFull = sqlite3Config.m.xRoundup(n); 190*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 191*fec00eabSdrh if( n>mem0.mxReq ) mem0.mxReq = n; 192*fec00eabSdrh if( mem0.alarmCallback!=0 && mem0.nowUsed+nFull>=mem0.alarmThreshold ){ 193*fec00eabSdrh sqlite3MallocAlarm(nFull); 194*fec00eabSdrh } 195*fec00eabSdrh if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){ 196*fec00eabSdrh p = 0; 197*fec00eabSdrh }else{ 198*fec00eabSdrh p = sqlite3Config.m.xMalloc(nFull); 199*fec00eabSdrh if( p==0 ){ 200*fec00eabSdrh sqlite3MallocAlarm(nFull); 201*fec00eabSdrh p = malloc(nFull); 202*fec00eabSdrh } 203*fec00eabSdrh } 204*fec00eabSdrh if( p ){ 205*fec00eabSdrh mem0.nowUsed += nFull; 206*fec00eabSdrh if( mem0.nowUsed>mem0.mxUsed ){ 207*fec00eabSdrh mem0.mxUsed = mem0.nowUsed; 208*fec00eabSdrh } 209*fec00eabSdrh } 210*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 211*fec00eabSdrh }else{ 212*fec00eabSdrh p = sqlite3Config.m.xMalloc(n); 213*fec00eabSdrh } 214*fec00eabSdrh return p; 215*fec00eabSdrh } 216*fec00eabSdrh 217*fec00eabSdrh /* 218*fec00eabSdrh ** This version of the memory allocation is for use by the application. 219*fec00eabSdrh ** First make sure the memory subsystem is initialized, then do the 220*fec00eabSdrh ** allocation. 221*fec00eabSdrh */ 222*fec00eabSdrh void *sqlite3_malloc(int n){ 223*fec00eabSdrh #ifndef SQLITE_OMIT_AUTOINIT 224*fec00eabSdrh if( sqlite3_initialize() ) return 0; 225*fec00eabSdrh #endif 226*fec00eabSdrh return sqlite3Malloc(n); 227*fec00eabSdrh } 228*fec00eabSdrh 229*fec00eabSdrh /* 230*fec00eabSdrh ** Return the size of a memory allocation previously obtained from 231*fec00eabSdrh ** sqlite3Malloc() or sqlite3_malloc(). 232*fec00eabSdrh */ 233*fec00eabSdrh int sqlite3MallocSize(void *p){ 234*fec00eabSdrh return sqlite3Config.m.xSize(p); 235*fec00eabSdrh } 236*fec00eabSdrh 237*fec00eabSdrh /* 238*fec00eabSdrh ** Free memory previously obtained from sqlite3Malloc(). 239*fec00eabSdrh */ 240*fec00eabSdrh void sqlite3_free(void *p){ 241*fec00eabSdrh if( p==0 ) return; 242*fec00eabSdrh if( sqlite3Config.bMemstat ){ 243*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 244*fec00eabSdrh mem0.nowUsed -= sqlite3MallocSize(p); 245*fec00eabSdrh sqlite3Config.m.xFree(p); 246*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 247*fec00eabSdrh }else{ 248*fec00eabSdrh sqlite3Config.m.xFree(p); 249*fec00eabSdrh } 250*fec00eabSdrh } 251*fec00eabSdrh 252*fec00eabSdrh /* 253*fec00eabSdrh ** Change the size of an existing memory allocation 254*fec00eabSdrh */ 255*fec00eabSdrh void *sqlite3Realloc(void *pOld, int nBytes){ 256*fec00eabSdrh int nOld, nNew; 257*fec00eabSdrh void *pNew; 258*fec00eabSdrh if( pOld==0 ){ 259*fec00eabSdrh return sqlite3Malloc(nBytes); 260*fec00eabSdrh } 261*fec00eabSdrh if( nBytes<=0 ){ 262*fec00eabSdrh sqlite3_free(pOld); 263*fec00eabSdrh return 0; 264*fec00eabSdrh } 265*fec00eabSdrh nOld = sqlite3MallocSize(pOld); 266*fec00eabSdrh if( sqlite3Config.bMemstat ){ 267*fec00eabSdrh sqlite3_mutex_enter(mem0.mutex); 268*fec00eabSdrh if( nBytes>mem0.mxReq ) mem0.mxReq = nBytes; 269*fec00eabSdrh nNew = sqlite3Config.m.xRoundup(nBytes); 270*fec00eabSdrh if( nOld==nNew ){ 271*fec00eabSdrh pNew = pOld; 272*fec00eabSdrh }else{ 273*fec00eabSdrh if( mem0.nowUsed+nNew-nOld>=mem0.alarmThreshold ){ 274*fec00eabSdrh sqlite3MallocAlarm(nNew-nOld); 275*fec00eabSdrh } 276*fec00eabSdrh if( sqlite3FaultStep(SQLITE_FAULTINJECTOR_MALLOC) ){ 277*fec00eabSdrh pNew = 0; 278*fec00eabSdrh }else{ 279*fec00eabSdrh pNew = sqlite3Config.m.xRealloc(pOld, nNew); 280*fec00eabSdrh if( pNew==0 ){ 281*fec00eabSdrh sqlite3MallocAlarm(nBytes); 282*fec00eabSdrh pNew = sqlite3Config.m.xRealloc(pOld, nNew); 283*fec00eabSdrh } 284*fec00eabSdrh } 285*fec00eabSdrh if( pNew ){ 286*fec00eabSdrh mem0.nowUsed += nNew-nOld; 287*fec00eabSdrh if( mem0.nowUsed>mem0.mxUsed ){ 288*fec00eabSdrh mem0.mxUsed = mem0.nowUsed; 289*fec00eabSdrh } 290*fec00eabSdrh } 291*fec00eabSdrh } 292*fec00eabSdrh sqlite3_mutex_leave(mem0.mutex); 293*fec00eabSdrh }else{ 294*fec00eabSdrh pNew = sqlite3Config.m.xRealloc(pOld, nBytes); 295*fec00eabSdrh } 296*fec00eabSdrh return pNew; 297*fec00eabSdrh } 298*fec00eabSdrh 299*fec00eabSdrh /* 300*fec00eabSdrh ** The public interface to sqlite3Realloc. Make sure that the memory 301*fec00eabSdrh ** subsystem is initialized prior to invoking sqliteRealloc. 302*fec00eabSdrh */ 303*fec00eabSdrh void *sqlite3_realloc(void *pOld, int n){ 304*fec00eabSdrh #ifndef SQLITE_OMIT_AUTOINIT 305*fec00eabSdrh if( sqlite3_initialize() ) return 0; 306*fec00eabSdrh #endif 307*fec00eabSdrh return sqlite3Realloc(pOld, n); 308*fec00eabSdrh } 309*fec00eabSdrh 310a3152895Sdrh 311a3152895Sdrh /* 31217435752Sdrh ** Allocate and zero memory. 313a3152895Sdrh */ 314*fec00eabSdrh void *sqlite3MallocZero(int n){ 315*fec00eabSdrh void *p = sqlite3Malloc(n); 316a3152895Sdrh if( p ){ 317a3152895Sdrh memset(p, 0, n); 318a3152895Sdrh } 319a3152895Sdrh return p; 320a3152895Sdrh } 32117435752Sdrh 32217435752Sdrh /* 32317435752Sdrh ** Allocate and zero memory. If the allocation fails, make 32417435752Sdrh ** the mallocFailed flag in the connection pointer. 32517435752Sdrh */ 326*fec00eabSdrh void *sqlite3DbMallocZero(sqlite3 *db, int n){ 327a1644fd8Sdanielk1977 void *p = sqlite3DbMallocRaw(db, n); 32817435752Sdrh if( p ){ 32917435752Sdrh memset(p, 0, n); 33017435752Sdrh } 33117435752Sdrh return p; 33217435752Sdrh } 33317435752Sdrh 33417435752Sdrh /* 33517435752Sdrh ** Allocate and zero memory. If the allocation fails, make 33617435752Sdrh ** the mallocFailed flag in the connection pointer. 33717435752Sdrh */ 338*fec00eabSdrh void *sqlite3DbMallocRaw(sqlite3 *db, int n){ 339a1644fd8Sdanielk1977 void *p = 0; 340a1644fd8Sdanielk1977 if( !db || db->mallocFailed==0 ){ 341*fec00eabSdrh p = sqlite3Malloc(n); 342f3a65f7eSdrh if( !p && db ){ 34317435752Sdrh db->mallocFailed = 1; 34417435752Sdrh } 345a1644fd8Sdanielk1977 } 34617435752Sdrh return p; 34717435752Sdrh } 34817435752Sdrh 34926783a58Sdanielk1977 /* 35026783a58Sdanielk1977 ** Resize the block of memory pointed to by p to n bytes. If the 35126783a58Sdanielk1977 ** resize fails, set the mallocFailed flag inthe connection object. 35226783a58Sdanielk1977 */ 353a1644fd8Sdanielk1977 void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){ 354a1644fd8Sdanielk1977 void *pNew = 0; 355a1644fd8Sdanielk1977 if( db->mallocFailed==0 ){ 356a1644fd8Sdanielk1977 pNew = sqlite3_realloc(p, n); 357a1644fd8Sdanielk1977 if( !pNew ){ 358a1644fd8Sdanielk1977 db->mallocFailed = 1; 359a1644fd8Sdanielk1977 } 360a1644fd8Sdanielk1977 } 361a1644fd8Sdanielk1977 return pNew; 362a1644fd8Sdanielk1977 } 363a1644fd8Sdanielk1977 36417435752Sdrh /* 36517435752Sdrh ** Attempt to reallocate p. If the reallocation fails, then free p 36617435752Sdrh ** and set the mallocFailed flag in the database connection. 36717435752Sdrh */ 36817435752Sdrh void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){ 369a3152895Sdrh void *pNew; 370a1644fd8Sdanielk1977 pNew = sqlite3DbRealloc(db, p, n); 371a3152895Sdrh if( !pNew ){ 3721e536953Sdanielk1977 sqlite3_free(p); 373a3152895Sdrh } 374a3152895Sdrh return pNew; 375a3152895Sdrh } 376a3152895Sdrh 377a3152895Sdrh /* 378a3152895Sdrh ** Make a copy of a string in memory obtained from sqliteMalloc(). These 379a3152895Sdrh ** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This 380a3152895Sdrh ** is because when memory debugging is turned on, these two functions are 381a3152895Sdrh ** called via macros that record the current file and line number in the 382a3152895Sdrh ** ThreadData structure. 383a3152895Sdrh */ 384a3152895Sdrh char *sqlite3StrDup(const char *z){ 385a3152895Sdrh char *zNew; 386a3152895Sdrh int n; 387a3152895Sdrh if( z==0 ) return 0; 388a3152895Sdrh n = strlen(z)+1; 3891e536953Sdanielk1977 zNew = sqlite3_malloc(n); 390a3152895Sdrh if( zNew ) memcpy(zNew, z, n); 391a3152895Sdrh return zNew; 392a3152895Sdrh } 393a3152895Sdrh char *sqlite3StrNDup(const char *z, int n){ 394a3152895Sdrh char *zNew; 395a3152895Sdrh if( z==0 ) return 0; 3961e536953Sdanielk1977 zNew = sqlite3_malloc(n+1); 397a3152895Sdrh if( zNew ){ 398a3152895Sdrh memcpy(zNew, z, n); 399a3152895Sdrh zNew[n] = 0; 400a3152895Sdrh } 401a3152895Sdrh return zNew; 402a3152895Sdrh } 403a3152895Sdrh 4041e536953Sdanielk1977 char *sqlite3DbStrDup(sqlite3 *db, const char *z){ 4051e536953Sdanielk1977 char *zNew = sqlite3StrDup(z); 4061e536953Sdanielk1977 if( z && !zNew ){ 4071e536953Sdanielk1977 db->mallocFailed = 1; 4081e536953Sdanielk1977 } 4091e536953Sdanielk1977 return zNew; 4101e536953Sdanielk1977 } 4111e536953Sdanielk1977 char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){ 4121e536953Sdanielk1977 char *zNew = sqlite3StrNDup(z, n); 4131e536953Sdanielk1977 if( z && !zNew ){ 4141e536953Sdanielk1977 db->mallocFailed = 1; 4151e536953Sdanielk1977 } 4161e536953Sdanielk1977 return zNew; 4171e536953Sdanielk1977 } 4181e536953Sdanielk1977 419a3152895Sdrh /* 420a3152895Sdrh ** Create a string from the 2nd and subsequent arguments (up to the 421a3152895Sdrh ** first NULL argument), store the string in memory obtained from 422a3152895Sdrh ** sqliteMalloc() and make the pointer indicated by the 1st argument 423a3152895Sdrh ** point to that string. The 1st argument must either be NULL or 424a3152895Sdrh ** point to memory obtained from sqliteMalloc(). 425a3152895Sdrh */ 426a3152895Sdrh void sqlite3SetString(char **pz, ...){ 427a3152895Sdrh va_list ap; 428a3152895Sdrh int nByte; 429a3152895Sdrh const char *z; 430a3152895Sdrh char *zResult; 431a3152895Sdrh 432a3152895Sdrh assert( pz!=0 ); 433a3152895Sdrh nByte = 1; 434a3152895Sdrh va_start(ap, pz); 435a3152895Sdrh while( (z = va_arg(ap, const char*))!=0 ){ 436a3152895Sdrh nByte += strlen(z); 437a3152895Sdrh } 438a3152895Sdrh va_end(ap); 4391e536953Sdanielk1977 sqlite3_free(*pz); 4401e536953Sdanielk1977 *pz = zResult = sqlite3_malloc(nByte); 441a3152895Sdrh if( zResult==0 ){ 442a3152895Sdrh return; 443a3152895Sdrh } 444a3152895Sdrh *zResult = 0; 445a3152895Sdrh va_start(ap, pz); 446a3152895Sdrh while( (z = va_arg(ap, const char*))!=0 ){ 447a3152895Sdrh int n = strlen(z); 448a3152895Sdrh memcpy(zResult, z, n); 449a3152895Sdrh zResult += n; 450a3152895Sdrh } 451a3152895Sdrh zResult[0] = 0; 452a3152895Sdrh va_end(ap); 453a3152895Sdrh } 454a3152895Sdrh 455a3152895Sdrh 456a3152895Sdrh /* 457a3152895Sdrh ** This function must be called before exiting any API function (i.e. 45817435752Sdrh ** returning control to the user) that has called sqlite3_malloc or 45917435752Sdrh ** sqlite3_realloc. 460a3152895Sdrh ** 461a3152895Sdrh ** The returned value is normally a copy of the second argument to this 462a3152895Sdrh ** function. However, if a malloc() failure has occured since the previous 463a3152895Sdrh ** invocation SQLITE_NOMEM is returned instead. 464a3152895Sdrh ** 465a3152895Sdrh ** If the first argument, db, is not NULL and a malloc() error has occured, 466a3152895Sdrh ** then the connection error-code (the value returned by sqlite3_errcode()) 467a3152895Sdrh ** is set to SQLITE_NOMEM. 468a3152895Sdrh */ 469a3152895Sdrh int sqlite3ApiExit(sqlite3* db, int rc){ 470a1644fd8Sdanielk1977 /* If the db handle is not NULL, then we must hold the connection handle 471a1644fd8Sdanielk1977 ** mutex here. Otherwise the read (and possible write) of db->mallocFailed 472a1644fd8Sdanielk1977 ** is unsafe, as is the call to sqlite3Error(). 473a1644fd8Sdanielk1977 */ 474a1644fd8Sdanielk1977 assert( !db || sqlite3_mutex_held(db->mutex) ); 4751e536953Sdanielk1977 if( db && db->mallocFailed ){ 476a3152895Sdrh sqlite3Error(db, SQLITE_NOMEM, 0); 47717435752Sdrh db->mallocFailed = 0; 478a3152895Sdrh rc = SQLITE_NOMEM; 479a3152895Sdrh } 480a3152895Sdrh return rc & (db ? db->errMask : 0xff); 481a3152895Sdrh } 482