malloc.c.svn-base
上传用户:sunhongbo
上传日期:2022-01-25
资源大小:3010k
文件大小:6k
源码类别:

数据库系统

开发平台:

C/C++

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