4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
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.
11 *************************************************************************
13 ** This file contains low-level memory allocation drivers for when
14 ** SQLite will use the standard C-library malloc/realloc/free interface
15 ** to obtain the memory it needs.
17 ** This file contains implementations of the low-level memory allocation
18 ** routines specified in the sqlite3_mem_methods object.
20 #include "sqliteInt.h"
23 ** This version of the memory allocator is the default. It is
24 ** used when no other memory allocator is specified using compile-time
27 #ifdef SQLITE_SYSTEM_MALLOC
30 ** Like malloc(), but remember the size of the allocation
31 ** so that we can find it later using sqlite3MemSize().
33 ** For this low-level routine, we are guaranteed that nByte>0 because
34 ** cases of nByte<=0 will be intercepted and dealt with by higher level
37 static void *sqlite3MemMalloc(int nByte){
40 nByte = ROUND8(nByte);
41 p = malloc( nByte+8 );
46 testcase( sqlite3GlobalConfig.xLog!=0 );
47 sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
53 ** Like free() but works for allocations obtained from sqlite3MemMalloc()
54 ** or sqlite3MemRealloc().
56 ** For this low-level routine, we already know that pPrior!=0 since
57 ** cases where pPrior==0 will have been intecepted and dealt with
58 ** by higher-level routines.
60 static void sqlite3MemFree(void *pPrior){
61 sqlite3_int64 *p = (sqlite3_int64*)pPrior;
68 ** Report the allocated size of a prior return from xMalloc()
71 static int sqlite3MemSize(void *pPrior){
73 if( pPrior==0 ) return 0;
74 p = (sqlite3_int64*)pPrior;
80 ** Like realloc(). Resize an allocation previously obtained from
81 ** sqlite3MemMalloc().
83 ** For this low-level interface, we know that pPrior!=0. Cases where
84 ** pPrior==0 while have been intercepted by higher-level routine and
85 ** redirected to xMalloc. Similarly, we know that nByte>0 becauses
86 ** cases where nByte<=0 will have been intercepted by higher-level
87 ** routines and redirected to xFree.
89 static void *sqlite3MemRealloc(void *pPrior, int nByte){
90 sqlite3_int64 *p = (sqlite3_int64*)pPrior;
91 assert( pPrior!=0 && nByte>0 );
92 assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */
94 p = realloc(p, nByte+8 );
99 testcase( sqlite3GlobalConfig.xLog!=0 );
100 sqlite3_log(SQLITE_NOMEM,
101 "failed memory resize %u to %u bytes",
102 sqlite3MemSize(pPrior), nByte);
108 ** Round up a request size to the next valid allocation size.
110 static int sqlite3MemRoundup(int n){
115 ** Initialize this module.
117 static int sqlite3MemInit(void *NotUsed){
118 UNUSED_PARAMETER(NotUsed);
123 ** Deinitialize this module.
125 static void sqlite3MemShutdown(void *NotUsed){
126 UNUSED_PARAMETER(NotUsed);
131 ** This routine is the only routine in this file with external linkage.
133 ** Populate the low-level memory allocation function pointers in
134 ** sqlite3GlobalConfig.m with pointers to the routines in this file.
136 void sqlite3MemSetDefault(void){
137 static const sqlite3_mem_methods defaultMethods = {
147 sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
150 #endif /* SQLITE_SYSTEM_MALLOC */