blob: 3578496f330307b231dfb53c0c2e1c6b323d791e [file] [log] [blame]
drh90f6a5b2007-08-15 13:04:54 +00001/*
2** 2007 August 14
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*************************************************************************
drh90f6a5b2007-08-15 13:04:54 +000012**
drhfec00ea2008-06-14 16:56:21 +000013** 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.
16**
17** This file contains implementations of the low-level memory allocation
drhc710ccb2012-01-18 12:46:47 +000018** 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
23** file.
24**
25** C-preprocessor macro summary:
26**
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
mistachkina844f512012-02-11 21:56:59 +000033** option to rename it.
34**
drhc710ccb2012-01-18 12:46:47 +000035** SQLITE_WITHOUT_ZONEMALLOC Some older macs lack support for the zone
36** memory allocator. Set this symbol to enable
37** building on older macs.
38**
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,
42** for example.
drh90f6a5b2007-08-15 13:04:54 +000043*/
drh0d180202008-02-14 23:26:56 +000044#include "sqliteInt.h"
drh90f6a5b2007-08-15 13:04:54 +000045
46/*
drh4c3645c2007-08-15 17:07:57 +000047** This version of the memory allocator is the default. It is
48** used when no other memory allocator is specified using compile-time
49** macros.
50*/
drh0d180202008-02-14 23:26:56 +000051#ifdef SQLITE_SYSTEM_MALLOC
drh90f6a5b2007-08-15 13:04:54 +000052
drh3a0c9c02011-12-10 13:49:44 +000053/*
mistachkina844f512012-02-11 21:56:59 +000054** The MSVCRT has malloc_usable_size() but it is called _msize().
drhc710ccb2012-01-18 12:46:47 +000055** The use of _msize() is automatic, but can be disabled by compiling
56** with -DSQLITE_WITHOUT_MSIZE
drh3a0c9c02011-12-10 13:49:44 +000057*/
mistachkina844f512012-02-11 21:56:59 +000058#if defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE)
drh0541b3d2012-01-18 18:22:44 +000059# define SQLITE_MALLOCSIZE _msize
drh3a0c9c02011-12-10 13:49:44 +000060#endif
drhf1c57262011-12-08 20:41:33 +000061
drhc710ccb2012-01-18 12:46:47 +000062#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
drhf1c57262011-12-08 20:41:33 +000063
64/*
drhc710ccb2012-01-18 12:46:47 +000065** Use the zone allocator available on apple products unless the
66** SQLITE_WITHOUT_ZONEMALLOC symbol is defined.
drhf1c57262011-12-08 20:41:33 +000067*/
68#include <sys/sysctl.h>
69#include <malloc/malloc.h>
70#include <libkern/OSAtomic.h>
71static malloc_zone_t* _sqliteZone_;
72#define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x))
73#define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x));
74#define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y))
75#define SQLITE_MALLOCSIZE(x) \
76 (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x))
77
78#else /* if not __APPLE__ */
79
80/*
drhc710ccb2012-01-18 12:46:47 +000081** Use standard C library malloc and free on non-Apple systems.
82** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined.
drhf1c57262011-12-08 20:41:33 +000083*/
84#define SQLITE_MALLOC(x) malloc(x)
85#define SQLITE_FREE(x) free(x)
86#define SQLITE_REALLOC(x,y) realloc((x),(y))
87
mistachkina844f512012-02-11 21:56:59 +000088#if (defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE)) \
89 || (defined(HAVE_MALLOC_H) && defined(HAVE_MALLOC_USABLE_SIZE))
drh86c5a932012-02-08 12:13:28 +000090# include <malloc.h> /* Needed for malloc_usable_size on linux */
91#endif
drh6a8ab6d2011-11-09 01:53:25 +000092#ifdef HAVE_MALLOC_USABLE_SIZE
drh0541b3d2012-01-18 18:22:44 +000093# ifndef SQLITE_MALLOCSIZE
drh0541b3d2012-01-18 18:22:44 +000094# define SQLITE_MALLOCSIZE(x) malloc_usable_size(x)
95# endif
drhf1c57262011-12-08 20:41:33 +000096#else
drh0541b3d2012-01-18 18:22:44 +000097# undef SQLITE_MALLOCSIZE
drh6a8ab6d2011-11-09 01:53:25 +000098#endif
99
drhf1c57262011-12-08 20:41:33 +0000100#endif /* __APPLE__ or not __APPLE__ */
101
drh90f6a5b2007-08-15 13:04:54 +0000102/*
drhfec00ea2008-06-14 16:56:21 +0000103** Like malloc(), but remember the size of the allocation
104** so that we can find it later using sqlite3MemSize().
105**
106** For this low-level routine, we are guaranteed that nByte>0 because
107** cases of nByte<=0 will be intercepted and dealt with by higher level
108** routines.
drh90f6a5b2007-08-15 13:04:54 +0000109*/
drhfec00ea2008-06-14 16:56:21 +0000110static void *sqlite3MemMalloc(int nByte){
drhf1c57262011-12-08 20:41:33 +0000111#ifdef SQLITE_MALLOCSIZE
112 void *p = SQLITE_MALLOC( nByte );
drh6a8ab6d2011-11-09 01:53:25 +0000113 if( p==0 ){
114 testcase( sqlite3GlobalConfig.xLog!=0 );
115 sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
116 }
117 return p;
118#else
drh153c62c2007-08-24 03:51:33 +0000119 sqlite3_int64 *p;
drhfec00ea2008-06-14 16:56:21 +0000120 assert( nByte>0 );
danielk1977bc739712009-03-23 04:33:32 +0000121 nByte = ROUND8(nByte);
drhf1c57262011-12-08 20:41:33 +0000122 p = SQLITE_MALLOC( nByte+8 );
danielk1977950292f2008-06-23 15:10:24 +0000123 if( p ){
124 p[0] = nByte;
125 p++;
drh413c3d32010-02-23 20:11:56 +0000126 }else{
drhaf46dc12010-02-24 21:44:07 +0000127 testcase( sqlite3GlobalConfig.xLog!=0 );
drh413c3d32010-02-23 20:11:56 +0000128 sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
danielk1977950292f2008-06-23 15:10:24 +0000129 }
130 return (void *)p;
drh6a8ab6d2011-11-09 01:53:25 +0000131#endif
drhfec00ea2008-06-14 16:56:21 +0000132}
133
134/*
135** Like free() but works for allocations obtained from sqlite3MemMalloc()
136** or sqlite3MemRealloc().
137**
138** For this low-level routine, we already know that pPrior!=0 since
139** cases where pPrior==0 will have been intecepted and dealt with
140** by higher-level routines.
141*/
142static void sqlite3MemFree(void *pPrior){
drhf1c57262011-12-08 20:41:33 +0000143#ifdef SQLITE_MALLOCSIZE
144 SQLITE_FREE(pPrior);
drh6a8ab6d2011-11-09 01:53:25 +0000145#else
drhfec00ea2008-06-14 16:56:21 +0000146 sqlite3_int64 *p = (sqlite3_int64*)pPrior;
danielk1977834a5aa2008-06-23 14:40:18 +0000147 assert( pPrior!=0 );
drh90f6a5b2007-08-15 13:04:54 +0000148 p--;
drhf1c57262011-12-08 20:41:33 +0000149 SQLITE_FREE(p);
drh6a8ab6d2011-11-09 01:53:25 +0000150#endif
drh90f6a5b2007-08-15 13:04:54 +0000151}
152
153/*
drh413c3d32010-02-23 20:11:56 +0000154** Report the allocated size of a prior return from xMalloc()
155** or xRealloc().
156*/
157static int sqlite3MemSize(void *pPrior){
drhf1c57262011-12-08 20:41:33 +0000158#ifdef SQLITE_MALLOCSIZE
159 return pPrior ? (int)SQLITE_MALLOCSIZE(pPrior) : 0;
drh6a8ab6d2011-11-09 01:53:25 +0000160#else
drh413c3d32010-02-23 20:11:56 +0000161 sqlite3_int64 *p;
162 if( pPrior==0 ) return 0;
163 p = (sqlite3_int64*)pPrior;
164 p--;
165 return (int)p[0];
drh6a8ab6d2011-11-09 01:53:25 +0000166#endif
drh413c3d32010-02-23 20:11:56 +0000167}
168
169/*
drhfec00ea2008-06-14 16:56:21 +0000170** Like realloc(). Resize an allocation previously obtained from
171** sqlite3MemMalloc().
172**
173** For this low-level interface, we know that pPrior!=0. Cases where
174** pPrior==0 while have been intercepted by higher-level routine and
175** redirected to xMalloc. Similarly, we know that nByte>0 becauses
176** cases where nByte<=0 will have been intercepted by higher-level
177** routines and redirected to xFree.
danielk1977a7a8e142008-02-13 18:25:27 +0000178*/
drhfec00ea2008-06-14 16:56:21 +0000179static void *sqlite3MemRealloc(void *pPrior, int nByte){
drhf1c57262011-12-08 20:41:33 +0000180#ifdef SQLITE_MALLOCSIZE
181 void *p = SQLITE_REALLOC(pPrior, nByte);
drh6a8ab6d2011-11-09 01:53:25 +0000182 if( p==0 ){
183 testcase( sqlite3GlobalConfig.xLog!=0 );
184 sqlite3_log(SQLITE_NOMEM,
185 "failed memory resize %u to %u bytes",
drhf1c57262011-12-08 20:41:33 +0000186 SQLITE_MALLOCSIZE(pPrior), nByte);
drh6a8ab6d2011-11-09 01:53:25 +0000187 }
188 return p;
189#else
drhfec00ea2008-06-14 16:56:21 +0000190 sqlite3_int64 *p = (sqlite3_int64*)pPrior;
191 assert( pPrior!=0 && nByte>0 );
drh9f129f42010-08-31 15:27:32 +0000192 assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */
drhfec00ea2008-06-14 16:56:21 +0000193 p--;
drhf1c57262011-12-08 20:41:33 +0000194 p = SQLITE_REALLOC(p, nByte+8 );
drhfec00ea2008-06-14 16:56:21 +0000195 if( p ){
196 p[0] = nByte;
197 p++;
drh413c3d32010-02-23 20:11:56 +0000198 }else{
drhaf46dc12010-02-24 21:44:07 +0000199 testcase( sqlite3GlobalConfig.xLog!=0 );
drh413c3d32010-02-23 20:11:56 +0000200 sqlite3_log(SQLITE_NOMEM,
201 "failed memory resize %u to %u bytes",
202 sqlite3MemSize(pPrior), nByte);
drhfec00ea2008-06-14 16:56:21 +0000203 }
204 return (void*)p;
drh6a8ab6d2011-11-09 01:53:25 +0000205#endif
danielk1977a7a8e142008-02-13 18:25:27 +0000206}
207
208/*
drhfec00ea2008-06-14 16:56:21 +0000209** Round up a request size to the next valid allocation size.
210*/
211static int sqlite3MemRoundup(int n){
danielk1977bc739712009-03-23 04:33:32 +0000212 return ROUND8(n);
drhfec00ea2008-06-14 16:56:21 +0000213}
214
215/*
216** Initialize this module.
217*/
218static int sqlite3MemInit(void *NotUsed){
drhc710ccb2012-01-18 12:46:47 +0000219#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
drhf1c57262011-12-08 20:41:33 +0000220 int cpuCount;
221 size_t len;
222 if( _sqliteZone_ ){
223 return SQLITE_OK;
224 }
225 len = sizeof(cpuCount);
226 /* One usually wants to use hw.acctivecpu for MT decisions, but not here */
227 sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0);
228 if( cpuCount>1 ){
229 /* defer MT decisions to system malloc */
230 _sqliteZone_ = malloc_default_zone();
231 }else{
232 /* only 1 core, use our own zone to contention over global locks,
233 ** e.g. we have our own dedicated locks */
drhf2f105d2012-08-20 15:53:54 +0000234 bool success;
drhf1c57262011-12-08 20:41:33 +0000235 malloc_zone_t* newzone = malloc_create_zone(4096, 0);
236 malloc_set_zone_name(newzone, "Sqlite_Heap");
237 do{
238 success = OSAtomicCompareAndSwapPtrBarrier(NULL, newzone,
239 (void * volatile *)&_sqliteZone_);
240 }while(!_sqliteZone_);
drhf2f105d2012-08-20 15:53:54 +0000241 if( !success ){
drhf1c57262011-12-08 20:41:33 +0000242 /* somebody registered a zone first */
243 malloc_destroy_zone(newzone);
244 }
245 }
246#endif
danielk197762c14b32008-11-19 09:05:26 +0000247 UNUSED_PARAMETER(NotUsed);
drh40257ff2008-06-13 18:24:27 +0000248 return SQLITE_OK;
249}
250
251/*
drhfec00ea2008-06-14 16:56:21 +0000252** Deinitialize this module.
drh90f6a5b2007-08-15 13:04:54 +0000253*/
drhfec00ea2008-06-14 16:56:21 +0000254static void sqlite3MemShutdown(void *NotUsed){
danielk197762c14b32008-11-19 09:05:26 +0000255 UNUSED_PARAMETER(NotUsed);
drhfec00ea2008-06-14 16:56:21 +0000256 return;
257}
258
drhd1370b62008-10-28 18:58:20 +0000259/*
260** This routine is the only routine in this file with external linkage.
261**
262** Populate the low-level memory allocation function pointers in
263** sqlite3GlobalConfig.m with pointers to the routines in this file.
264*/
265void sqlite3MemSetDefault(void){
drhfec00ea2008-06-14 16:56:21 +0000266 static const sqlite3_mem_methods defaultMethods = {
267 sqlite3MemMalloc,
268 sqlite3MemFree,
269 sqlite3MemRealloc,
270 sqlite3MemSize,
271 sqlite3MemRoundup,
272 sqlite3MemInit,
273 sqlite3MemShutdown,
274 0
275 };
drhd1370b62008-10-28 18:58:20 +0000276 sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
drh90f6a5b2007-08-15 13:04:54 +0000277}
drh4c3645c2007-08-15 17:07:57 +0000278
drh0d180202008-02-14 23:26:56 +0000279#endif /* SQLITE_SYSTEM_MALLOC */