| 2 |      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 | ** Memory allocation functions used throughout sqlite.
 | 
|  |     13 | **
 | 
|  |     14 | **
 | 
|  |     15 | ** $Id: malloc.cpp 1282 2008-11-13 09:31:33Z LarsPson $
 | 
|  |     16 | */
 | 
|  |     17 | #include "sqliteInt.h"
 | 
|  |     18 | #include <stdarg.h>
 | 
|  |     19 | #include <ctype.h>
 | 
|  |     20 | 
 | 
|  |     21 | /*
 | 
|  |     22 | ** This routine runs when the memory allocator sees that the
 | 
|  |     23 | ** total memory allocation is about to exceed the soft heap
 | 
|  |     24 | ** limit.
 | 
|  |     25 | */
 | 
|  |     26 | static void softHeapLimitEnforcer(
 | 
|  |     27 |   void *NotUsed, 
 | 
|  |     28 |   sqlite3_int64 inUse,
 | 
|  |     29 |   int allocSize
 | 
|  |     30 | ){
 | 
|  |     31 |   sqlite3_release_memory(allocSize);
 | 
|  |     32 | }
 | 
|  |     33 | 
 | 
|  |     34 | /*
 | 
|  |     35 | ** Set the soft heap-size limit for the current thread. Passing a
 | 
|  |     36 | ** zero or negative value indicates no limit.
 | 
|  |     37 | */
 | 
|  |     38 | EXPORT_C void sqlite3_soft_heap_limit(int n){
 | 
|  |     39 |   sqlite3_uint64 iLimit;
 | 
|  |     40 |   int overage;
 | 
|  |     41 |   if( n<0 ){
 | 
|  |     42 |     iLimit = 0;
 | 
|  |     43 |   }else{
 | 
|  |     44 |     iLimit = n;
 | 
|  |     45 |   }
 | 
|  |     46 |   if( iLimit>0 ){
 | 
|  |     47 |     sqlite3_memory_alarm(softHeapLimitEnforcer, 0, iLimit);
 | 
|  |     48 |   }else{
 | 
|  |     49 |     sqlite3_memory_alarm(0, 0, 0);
 | 
|  |     50 |   }
 | 
|  |     51 |   overage = sqlite3_memory_used() - n;
 | 
|  |     52 |   if( overage>0 ){
 | 
|  |     53 |     sqlite3_release_memory(overage);
 | 
|  |     54 |   }
 | 
|  |     55 | }
 | 
|  |     56 | 
 | 
|  |     57 | /*
 | 
|  |     58 | ** Release memory held by SQLite instances created by the current thread.
 | 
|  |     59 | */
 | 
|  |     60 | EXPORT_C int sqlite3_release_memory(int n){
 | 
|  |     61 | #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
 | 
|  |     62 |   return sqlite3PagerReleaseMemory(n);
 | 
|  |     63 | #else
 | 
|  |     64 |   return SQLITE_OK;
 | 
|  |     65 | #endif
 | 
|  |     66 | }
 | 
|  |     67 | 
 | 
|  |     68 | 
 | 
|  |     69 | /*
 | 
|  |     70 | ** Allocate and zero memory.
 | 
|  |     71 | */ 
 | 
|  |     72 | void *sqlite3MallocZero(unsigned n){
 | 
|  |     73 | 
 | 
|  |     74 |   void *p = sqlite3_malloc(n);
 | 
|  |     75 |   if( p ){
 | 
|  |     76 |     memset(p, 0, n);
 | 
|  |     77 |   }
 | 
|  |     78 |  
 | 
|  |     79 | 	return p;
 | 
|  |     80 | }
 | 
|  |     81 | 
 | 
|  |     82 | /*
 | 
|  |     83 | ** Allocate and zero memory.  If the allocation fails, make
 | 
|  |     84 | ** the mallocFailed flag in the connection pointer.
 | 
|  |     85 | */
 | 
|  |     86 | void *sqlite3DbMallocZero(sqlite3 *db, unsigned n){
 | 
|  |     87 |   void *p = sqlite3DbMallocRaw(db, n);
 | 
|  |     88 |   if( p ){
 | 
|  |     89 |     memset(p, 0, n);
 | 
|  |     90 |   }
 | 
|  |     91 |   return p;
 | 
|  |     92 | }
 | 
|  |     93 | 
 | 
|  |     94 | /*
 | 
|  |     95 | ** Allocate and zero memory.  If the allocation fails, make
 | 
|  |     96 | ** the mallocFailed flag in the connection pointer.
 | 
|  |     97 | */
 | 
|  |     98 | void *sqlite3DbMallocRaw(sqlite3 *db, unsigned n){
 | 
|  |     99 |   void *p = 0;
 | 
|  |    100 |   if( !db || db->mallocFailed==0 ){
 | 
|  |    101 |     p = sqlite3_malloc(n);
 | 
|  |    102 |     if( !p && db ){
 | 
|  |    103 |       db->mallocFailed = 1;
 | 
|  |    104 |     }
 | 
|  |    105 |   }
 | 
|  |    106 |   return p;
 | 
|  |    107 | }
 | 
|  |    108 | 
 | 
|  |    109 | /*
 | 
|  |    110 | ** Resize the block of memory pointed to by p to n bytes. If the
 | 
|  |    111 | ** resize fails, set the mallocFailed flag inthe connection object.
 | 
|  |    112 | */
 | 
|  |    113 | void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){
 | 
|  |    114 |   void *pNew = 0;
 | 
|  |    115 |   if( db->mallocFailed==0 ){
 | 
|  |    116 |     pNew = sqlite3_realloc(p, n);
 | 
|  |    117 |     if( !pNew ){
 | 
|  |    118 |       db->mallocFailed = 1;
 | 
|  |    119 |     }
 | 
|  |    120 |   }
 | 
|  |    121 |   return pNew;
 | 
|  |    122 | }
 | 
|  |    123 | 
 | 
|  |    124 | /*
 | 
|  |    125 | ** Attempt to reallocate p.  If the reallocation fails, then free p
 | 
|  |    126 | ** and set the mallocFailed flag in the database connection.
 | 
|  |    127 | */
 | 
|  |    128 | void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){
 | 
|  |    129 |   void *pNew;
 | 
|  |    130 |   pNew = sqlite3DbRealloc(db, p, n);
 | 
|  |    131 |   if( !pNew ){
 | 
|  |    132 |     sqlite3_free(p);
 | 
|  |    133 |   }
 | 
|  |    134 |   return pNew;
 | 
|  |    135 | }
 | 
|  |    136 | 
 | 
|  |    137 | /*
 | 
|  |    138 | ** Make a copy of a string in memory obtained from sqliteMalloc(). These 
 | 
|  |    139 | ** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This
 | 
|  |    140 | ** is because when memory debugging is turned on, these two functions are 
 | 
|  |    141 | ** called via macros that record the current file and line number in the
 | 
|  |    142 | ** ThreadData structure.
 | 
|  |    143 | */
 | 
|  |    144 | char *sqlite3StrDup(const char *z){
 | 
|  |    145 |   char *zNew;
 | 
|  |    146 |   int n;
 | 
|  |    147 |   if( z==0 ) return 0;
 | 
|  |    148 |   n = strlen(z)+1;
 | 
|  |    149 |   zNew = (char*)sqlite3_malloc(n);
 | 
|  |    150 |   if( zNew ) memcpy(zNew, z, n);
 | 
|  |    151 |   return zNew;
 | 
|  |    152 | }
 | 
|  |    153 | char *sqlite3StrNDup(const char *z, int n){
 | 
|  |    154 |   char *zNew;
 | 
|  |    155 |   if( z==0 ) return 0;
 | 
|  |    156 |   zNew = (char*)sqlite3_malloc(n+1);
 | 
|  |    157 |   if( zNew ){
 | 
|  |    158 |     memcpy(zNew, z, n);
 | 
|  |    159 |     zNew[n] = 0;
 | 
|  |    160 |   }
 | 
|  |    161 |   return zNew;
 | 
|  |    162 | }
 | 
|  |    163 | 
 | 
|  |    164 | char *sqlite3DbStrDup(sqlite3 *db, const char *z){
 | 
|  |    165 |   char *zNew = sqlite3StrDup(z);
 | 
|  |    166 |   if( z && !zNew ){
 | 
|  |    167 |     db->mallocFailed = 1;
 | 
|  |    168 |   }
 | 
|  |    169 |   return zNew;
 | 
|  |    170 | }
 | 
|  |    171 | char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){
 | 
|  |    172 |   char *zNew = sqlite3StrNDup(z, n);
 | 
|  |    173 |   if( z && !zNew ){
 | 
|  |    174 |     db->mallocFailed = 1;
 | 
|  |    175 |   }
 | 
|  |    176 |   return zNew;
 | 
|  |    177 | }
 | 
|  |    178 | 
 | 
|  |    179 | /*
 | 
|  |    180 | ** Create a string from the 2nd and subsequent arguments (up to the
 | 
|  |    181 | ** first NULL argument), store the string in memory obtained from
 | 
|  |    182 | ** sqliteMalloc() and make the pointer indicated by the 1st argument
 | 
|  |    183 | ** point to that string.  The 1st argument must either be NULL or 
 | 
|  |    184 | ** point to memory obtained from sqliteMalloc().
 | 
|  |    185 | */
 | 
|  |    186 | void sqlite3SetString(char **pz, ...){
 | 
|  |    187 |   va_list ap;
 | 
|  |    188 |   int nByte;
 | 
|  |    189 |   const char *z;
 | 
|  |    190 |   char *zResult;
 | 
|  |    191 | 
 | 
|  |    192 |   assert( pz!=0 );
 | 
|  |    193 |   nByte = 1;
 | 
|  |    194 |   va_start(ap, pz);
 | 
|  |    195 |   while( (z = va_arg(ap, const char*))!=0 ){
 | 
|  |    196 |     nByte += strlen(z);
 | 
|  |    197 |   }
 | 
|  |    198 |   va_end(ap);
 | 
|  |    199 |   sqlite3_free(*pz);
 | 
|  |    200 |   *pz = zResult = (char*)sqlite3_malloc(nByte);
 | 
|  |    201 |   if( zResult==0 ){
 | 
|  |    202 |     return;
 | 
|  |    203 |   }
 | 
|  |    204 |   *zResult = 0;
 | 
|  |    205 |   va_start(ap, pz);
 | 
|  |    206 |   while( (z = va_arg(ap, const char*))!=0 ){
 | 
|  |    207 |     int n = strlen(z);
 | 
|  |    208 |     memcpy(zResult, z, n);
 | 
|  |    209 |     zResult += n;
 | 
|  |    210 |   }
 | 
|  |    211 |   zResult[0] = 0;
 | 
|  |    212 |   va_end(ap);
 | 
|  |    213 | }
 | 
|  |    214 | 
 | 
|  |    215 | 
 | 
|  |    216 | /*
 | 
|  |    217 | ** This function must be called before exiting any API function (i.e. 
 | 
|  |    218 | ** returning control to the user) that has called sqlite3_malloc or
 | 
|  |    219 | ** sqlite3_realloc.
 | 
|  |    220 | **
 | 
|  |    221 | ** The returned value is normally a copy of the second argument to this
 | 
|  |    222 | ** function. However, if a malloc() failure has occured since the previous
 | 
|  |    223 | ** invocation SQLITE_NOMEM is returned instead. 
 | 
|  |    224 | **
 | 
|  |    225 | ** If the first argument, db, is not NULL and a malloc() error has occured,
 | 
|  |    226 | ** then the connection error-code (the value returned by sqlite3_errcode())
 | 
|  |    227 | ** is set to SQLITE_NOMEM.
 | 
|  |    228 | */
 | 
|  |    229 | int sqlite3ApiExit(sqlite3* db, int rc){
 | 
|  |    230 |   /* If the db handle is not NULL, then we must hold the connection handle
 | 
|  |    231 |   ** mutex here. Otherwise the read (and possible write) of db->mallocFailed 
 | 
|  |    232 |   ** is unsafe, as is the call to sqlite3Error().
 | 
|  |    233 |   */
 | 
|  |    234 |   assert( !db || sqlite3_mutex_held(db->mutex) );
 | 
|  |    235 |   if( db && db->mallocFailed ){
 | 
|  |    236 |     sqlite3Error(db, SQLITE_NOMEM, 0);
 | 
|  |    237 |     db->mallocFailed = 0;
 | 
|  |    238 |     rc = SQLITE_NOMEM;
 | 
|  |    239 |   }
 | 
|  |    240 |   return rc & (db ? db->errMask : 0xff);
 | 
|  |    241 | }
 |