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. The content of
19 ** this file is only used if SQLITE_SYSTEM_MALLOC is defined. The
20 ** SQLITE_SYSTEM_MALLOC macro is defined automatically if neither the
21 ** SQLITE_MEMDEBUG nor the SQLITE_WIN32_MALLOC macros are defined. The
22 ** default configuration is to use memory allocation routines in this
25 ** C-preprocessor macro summary:
27 ** HAVE_MALLOC_USABLE_SIZE The configure script sets this symbol if
28 ** the malloc_usable_size() interface exists
29 ** on the target platform. Or, this symbol
30 ** can be set manually, if desired.
31 ** If an equivalent interface exists by
32 ** a different name, using a separate -D
33 ** option to rename it.
35 ** SQLITE_WITHOUT_ZONEMALLOC Some older macs lack support for the zone
36 ** memory allocator. Set this symbol to enable
37 ** building on older macs.
39 ** SQLITE_WITHOUT_MSIZE Set this symbol to disable the use of
40 ** _msize() on windows systems. This might
41 ** be necessary when compiling for Delphi,
44 #include "sqliteInt.h"
47 ** This version of the memory allocator is the default. It is
48 ** used when no other memory allocator is specified using compile-time
51 #ifdef SQLITE_SYSTEM_MALLOC
52 #if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
55 ** Use the zone allocator available on apple products unless the
56 ** SQLITE_WITHOUT_ZONEMALLOC symbol is defined.
58 #include <sys/sysctl.h>
59 #include <malloc/malloc.h>
60 #ifdef SQLITE_MIGHT_BE_SINGLE_CORE
61 #include <libkern/OSAtomic.h>
62 #endif /* SQLITE_MIGHT_BE_SINGLE_CORE */
63 static malloc_zone_t
* _sqliteZone_
;
64 #define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x))
65 #define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x));
66 #define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y))
67 #define SQLITE_MALLOCSIZE(x) \
68 (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x))
70 #else /* if not __APPLE__ */
73 ** Use standard C library malloc and free on non-Apple systems.
74 ** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined.
76 #define SQLITE_MALLOC(x) malloc(x)
77 #define SQLITE_FREE(x) free(x)
78 #define SQLITE_REALLOC(x,y) realloc((x),(y))
81 ** The malloc.h header file is needed for malloc_usable_size() function
82 ** on some systems (e.g. Linux).
84 #if HAVE_MALLOC_H && HAVE_MALLOC_USABLE_SIZE
85 # define SQLITE_USE_MALLOC_H 1
86 # define SQLITE_USE_MALLOC_USABLE_SIZE 1
88 ** The MSVCRT has malloc_usable_size(), but it is called _msize(). The
89 ** use of _msize() is automatic, but can be disabled by compiling with
90 ** -DSQLITE_WITHOUT_MSIZE. Using the _msize() function also requires
91 ** the malloc.h header file.
93 #elif defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE)
94 # define SQLITE_USE_MALLOC_H
95 # define SQLITE_USE_MSIZE
99 ** Include the malloc.h header file, if necessary. Also set define macro
100 ** SQLITE_MALLOCSIZE to the appropriate function name, which is _msize()
101 ** for MSVC and malloc_usable_size() for most other systems (e.g. Linux).
102 ** The memory size function can always be overridden manually by defining
103 ** the macro SQLITE_MALLOCSIZE to the desired function name.
105 #if defined(SQLITE_USE_MALLOC_H)
107 # if defined(SQLITE_USE_MALLOC_USABLE_SIZE)
108 # if !defined(SQLITE_MALLOCSIZE)
109 # define SQLITE_MALLOCSIZE(x) malloc_usable_size(x)
111 # elif defined(SQLITE_USE_MSIZE)
112 # if !defined(SQLITE_MALLOCSIZE)
113 # define SQLITE_MALLOCSIZE _msize
116 #endif /* defined(SQLITE_USE_MALLOC_H) */
118 #endif /* __APPLE__ or not __APPLE__ */
121 ** Like malloc(), but remember the size of the allocation
122 ** so that we can find it later using sqlite3MemSize().
124 ** For this low-level routine, we are guaranteed that nByte>0 because
125 ** cases of nByte<=0 will be intercepted and dealt with by higher level
128 static void *sqlite3MemMalloc(int nByte
){
129 #ifdef SQLITE_MALLOCSIZE
131 testcase( ROUND8(nByte
)==nByte
);
132 p
= SQLITE_MALLOC( nByte
);
134 testcase( sqlite3GlobalConfig
.xLog
!=0 );
135 sqlite3_log(SQLITE_NOMEM
, "failed to allocate %u bytes of memory", nByte
);
141 testcase( ROUND8(nByte
)!=nByte
);
142 p
= SQLITE_MALLOC( nByte
+8 );
147 testcase( sqlite3GlobalConfig
.xLog
!=0 );
148 sqlite3_log(SQLITE_NOMEM
, "failed to allocate %u bytes of memory", nByte
);
155 ** Like free() but works for allocations obtained from sqlite3MemMalloc()
156 ** or sqlite3MemRealloc().
158 ** For this low-level routine, we already know that pPrior!=0 since
159 ** cases where pPrior==0 will have been intecepted and dealt with
160 ** by higher-level routines.
162 static void sqlite3MemFree(void *pPrior
){
163 #ifdef SQLITE_MALLOCSIZE
166 sqlite3_int64
*p
= (sqlite3_int64
*)pPrior
;
174 ** Report the allocated size of a prior return from xMalloc()
177 static int sqlite3MemSize(void *pPrior
){
178 #ifdef SQLITE_MALLOCSIZE
180 return (int)SQLITE_MALLOCSIZE(pPrior
);
184 p
= (sqlite3_int64
*)pPrior
;
191 ** Like realloc(). Resize an allocation previously obtained from
192 ** sqlite3MemMalloc().
194 ** For this low-level interface, we know that pPrior!=0. Cases where
195 ** pPrior==0 while have been intercepted by higher-level routine and
196 ** redirected to xMalloc. Similarly, we know that nByte>0 because
197 ** cases where nByte<=0 will have been intercepted by higher-level
198 ** routines and redirected to xFree.
200 static void *sqlite3MemRealloc(void *pPrior
, int nByte
){
201 #ifdef SQLITE_MALLOCSIZE
202 void *p
= SQLITE_REALLOC(pPrior
, nByte
);
204 testcase( sqlite3GlobalConfig
.xLog
!=0 );
205 sqlite3_log(SQLITE_NOMEM
,
206 "failed memory resize %u to %u bytes",
207 SQLITE_MALLOCSIZE(pPrior
), nByte
);
211 sqlite3_int64
*p
= (sqlite3_int64
*)pPrior
;
212 assert( pPrior
!=0 && nByte
>0 );
213 assert( nByte
==ROUND8(nByte
) ); /* EV: R-46199-30249 */
215 p
= SQLITE_REALLOC(p
, nByte
+8 );
220 testcase( sqlite3GlobalConfig
.xLog
!=0 );
221 sqlite3_log(SQLITE_NOMEM
,
222 "failed memory resize %u to %u bytes",
223 sqlite3MemSize(pPrior
), nByte
);
230 ** Round up a request size to the next valid allocation size.
232 static int sqlite3MemRoundup(int n
){
237 ** Initialize this module.
239 static int sqlite3MemInit(void *NotUsed
){
240 #if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
246 len
= sizeof(cpuCount
);
247 /* One usually wants to use hw.acctivecpu for MT decisions, but not here */
248 sysctlbyname("hw.ncpu", &cpuCount
, &len
, NULL
, 0);
250 /* defer MT decisions to system malloc */
251 _sqliteZone_
= malloc_default_zone();
253 /* only 1 core, use our own zone to contention over global locks,
254 ** e.g. we have our own dedicated locks */
255 _sqliteZone_
= malloc_create_zone(4096, 0);
256 malloc_set_zone_name(_sqliteZone_
, "Sqlite_Heap");
258 #endif /* defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) */
259 UNUSED_PARAMETER(NotUsed
);
264 ** Deinitialize this module.
266 static void sqlite3MemShutdown(void *NotUsed
){
267 UNUSED_PARAMETER(NotUsed
);
272 ** This routine is the only routine in this file with external linkage.
274 ** Populate the low-level memory allocation function pointers in
275 ** sqlite3GlobalConfig.m with pointers to the routines in this file.
277 void sqlite3MemSetDefault(void){
278 static const sqlite3_mem_methods defaultMethods
= {
288 sqlite3_config(SQLITE_CONFIG_MALLOC
, &defaultMethods
);
291 #endif /* SQLITE_SYSTEM_MALLOC */