blob: 512ab3747f3922fabcc8a5345fb9f3e93cc9d47f [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
drhc710ccb2012-01-18 12:46:47 +000052#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
drhf1c57262011-12-08 20:41:33 +000053
54/*
drhc710ccb2012-01-18 12:46:47 +000055** Use the zone allocator available on apple products unless the
56** SQLITE_WITHOUT_ZONEMALLOC symbol is defined.
drhf1c57262011-12-08 20:41:33 +000057*/
58#include <sys/sysctl.h>
59#include <malloc/malloc.h>
drha80e1602017-03-18 13:59:46 +000060#ifdef SQLITE_MIGHT_BE_SINGLE_CORE
drhf1c57262011-12-08 20:41:33 +000061#include <libkern/OSAtomic.h>
drha80e1602017-03-18 13:59:46 +000062#endif /* SQLITE_MIGHT_BE_SINGLE_CORE */
drhf1c57262011-12-08 20:41:33 +000063static 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))
69
70#else /* if not __APPLE__ */
71
72/*
drhc710ccb2012-01-18 12:46:47 +000073** Use standard C library malloc and free on non-Apple systems.
74** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined.
drhf1c57262011-12-08 20:41:33 +000075*/
mistachkin015a3042013-11-12 21:37:04 +000076#define SQLITE_MALLOC(x) malloc(x)
77#define SQLITE_FREE(x) free(x)
78#define SQLITE_REALLOC(x,y) realloc((x),(y))
drhf1c57262011-12-08 20:41:33 +000079
mistachkin015a3042013-11-12 21:37:04 +000080/*
81** The malloc.h header file is needed for malloc_usable_size() function
82** on some systems (e.g. Linux).
83*/
drh0ede9eb2015-01-10 16:49:23 +000084#if HAVE_MALLOC_H && HAVE_MALLOC_USABLE_SIZE
85# define SQLITE_USE_MALLOC_H 1
86# define SQLITE_USE_MALLOC_USABLE_SIZE 1
mistachkin015a3042013-11-12 21:37:04 +000087/*
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.
92*/
93#elif defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE)
94# define SQLITE_USE_MALLOC_H
95# define SQLITE_USE_MSIZE
drh86c5a932012-02-08 12:13:28 +000096#endif
mistachkin015a3042013-11-12 21:37:04 +000097
98/*
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.
104*/
105#if defined(SQLITE_USE_MALLOC_H)
106# include <malloc.h>
107# if defined(SQLITE_USE_MALLOC_USABLE_SIZE)
108# if !defined(SQLITE_MALLOCSIZE)
109# define SQLITE_MALLOCSIZE(x) malloc_usable_size(x)
110# endif
111# elif defined(SQLITE_USE_MSIZE)
112# if !defined(SQLITE_MALLOCSIZE)
113# define SQLITE_MALLOCSIZE _msize
114# endif
115# endif
116#endif /* defined(SQLITE_USE_MALLOC_H) */
drh6a8ab6d2011-11-09 01:53:25 +0000117
drhf1c57262011-12-08 20:41:33 +0000118#endif /* __APPLE__ or not __APPLE__ */
119
drh90f6a5b2007-08-15 13:04:54 +0000120/*
drhfec00ea2008-06-14 16:56:21 +0000121** Like malloc(), but remember the size of the allocation
122** so that we can find it later using sqlite3MemSize().
123**
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
126** routines.
drh90f6a5b2007-08-15 13:04:54 +0000127*/
drhfec00ea2008-06-14 16:56:21 +0000128static void *sqlite3MemMalloc(int nByte){
drhf1c57262011-12-08 20:41:33 +0000129#ifdef SQLITE_MALLOCSIZE
drh087a29c2017-02-08 16:01:57 +0000130 void *p;
131 testcase( ROUND8(nByte)==nByte );
132 p = SQLITE_MALLOC( nByte );
drh6a8ab6d2011-11-09 01:53:25 +0000133 if( p==0 ){
134 testcase( sqlite3GlobalConfig.xLog!=0 );
135 sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
136 }
137 return p;
138#else
drh153c62c2007-08-24 03:51:33 +0000139 sqlite3_int64 *p;
drhfec00ea2008-06-14 16:56:21 +0000140 assert( nByte>0 );
drh087a29c2017-02-08 16:01:57 +0000141 testcase( ROUND8(nByte)!=nByte );
drhf1c57262011-12-08 20:41:33 +0000142 p = SQLITE_MALLOC( nByte+8 );
danielk1977950292f2008-06-23 15:10:24 +0000143 if( p ){
144 p[0] = nByte;
145 p++;
drh413c3d32010-02-23 20:11:56 +0000146 }else{
drhaf46dc12010-02-24 21:44:07 +0000147 testcase( sqlite3GlobalConfig.xLog!=0 );
drh413c3d32010-02-23 20:11:56 +0000148 sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
danielk1977950292f2008-06-23 15:10:24 +0000149 }
150 return (void *)p;
drh6a8ab6d2011-11-09 01:53:25 +0000151#endif
drhfec00ea2008-06-14 16:56:21 +0000152}
153
154/*
155** Like free() but works for allocations obtained from sqlite3MemMalloc()
156** or sqlite3MemRealloc().
157**
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.
161*/
162static void sqlite3MemFree(void *pPrior){
drhf1c57262011-12-08 20:41:33 +0000163#ifdef SQLITE_MALLOCSIZE
164 SQLITE_FREE(pPrior);
drh6a8ab6d2011-11-09 01:53:25 +0000165#else
drhfec00ea2008-06-14 16:56:21 +0000166 sqlite3_int64 *p = (sqlite3_int64*)pPrior;
danielk1977834a5aa2008-06-23 14:40:18 +0000167 assert( pPrior!=0 );
drh90f6a5b2007-08-15 13:04:54 +0000168 p--;
drhf1c57262011-12-08 20:41:33 +0000169 SQLITE_FREE(p);
drh6a8ab6d2011-11-09 01:53:25 +0000170#endif
drh90f6a5b2007-08-15 13:04:54 +0000171}
172
173/*
drh413c3d32010-02-23 20:11:56 +0000174** Report the allocated size of a prior return from xMalloc()
175** or xRealloc().
176*/
177static int sqlite3MemSize(void *pPrior){
drhf1c57262011-12-08 20:41:33 +0000178#ifdef SQLITE_MALLOCSIZE
drh4dd83a22015-10-26 14:54:32 +0000179 assert( pPrior!=0 );
drh039ca6a2015-10-15 16:20:57 +0000180 return (int)SQLITE_MALLOCSIZE(pPrior);
drh6a8ab6d2011-11-09 01:53:25 +0000181#else
drh413c3d32010-02-23 20:11:56 +0000182 sqlite3_int64 *p;
drh4dd83a22015-10-26 14:54:32 +0000183 assert( pPrior!=0 );
drh413c3d32010-02-23 20:11:56 +0000184 p = (sqlite3_int64*)pPrior;
185 p--;
186 return (int)p[0];
drh6a8ab6d2011-11-09 01:53:25 +0000187#endif
drh413c3d32010-02-23 20:11:56 +0000188}
189
190/*
drhfec00ea2008-06-14 16:56:21 +0000191** Like realloc(). Resize an allocation previously obtained from
192** sqlite3MemMalloc().
193**
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
peter.d.reid60ec9142014-09-06 16:39:46 +0000196** redirected to xMalloc. Similarly, we know that nByte>0 because
drhfec00ea2008-06-14 16:56:21 +0000197** cases where nByte<=0 will have been intercepted by higher-level
198** routines and redirected to xFree.
danielk1977a7a8e142008-02-13 18:25:27 +0000199*/
drhfec00ea2008-06-14 16:56:21 +0000200static void *sqlite3MemRealloc(void *pPrior, int nByte){
drhf1c57262011-12-08 20:41:33 +0000201#ifdef SQLITE_MALLOCSIZE
202 void *p = SQLITE_REALLOC(pPrior, nByte);
drh6a8ab6d2011-11-09 01:53:25 +0000203 if( p==0 ){
204 testcase( sqlite3GlobalConfig.xLog!=0 );
205 sqlite3_log(SQLITE_NOMEM,
206 "failed memory resize %u to %u bytes",
drhf1c57262011-12-08 20:41:33 +0000207 SQLITE_MALLOCSIZE(pPrior), nByte);
drh6a8ab6d2011-11-09 01:53:25 +0000208 }
209 return p;
210#else
drhfec00ea2008-06-14 16:56:21 +0000211 sqlite3_int64 *p = (sqlite3_int64*)pPrior;
212 assert( pPrior!=0 && nByte>0 );
drh9f129f42010-08-31 15:27:32 +0000213 assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */
drhfec00ea2008-06-14 16:56:21 +0000214 p--;
drhf1c57262011-12-08 20:41:33 +0000215 p = SQLITE_REALLOC(p, nByte+8 );
drhfec00ea2008-06-14 16:56:21 +0000216 if( p ){
217 p[0] = nByte;
218 p++;
drh413c3d32010-02-23 20:11:56 +0000219 }else{
drhaf46dc12010-02-24 21:44:07 +0000220 testcase( sqlite3GlobalConfig.xLog!=0 );
drh413c3d32010-02-23 20:11:56 +0000221 sqlite3_log(SQLITE_NOMEM,
222 "failed memory resize %u to %u bytes",
223 sqlite3MemSize(pPrior), nByte);
drhfec00ea2008-06-14 16:56:21 +0000224 }
225 return (void*)p;
drh6a8ab6d2011-11-09 01:53:25 +0000226#endif
danielk1977a7a8e142008-02-13 18:25:27 +0000227}
228
229/*
drhfec00ea2008-06-14 16:56:21 +0000230** Round up a request size to the next valid allocation size.
231*/
232static int sqlite3MemRoundup(int n){
danielk1977bc739712009-03-23 04:33:32 +0000233 return ROUND8(n);
drhfec00ea2008-06-14 16:56:21 +0000234}
235
236/*
237** Initialize this module.
238*/
239static int sqlite3MemInit(void *NotUsed){
drhc710ccb2012-01-18 12:46:47 +0000240#if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
drh918938f2017-03-21 20:17:24 +0000241 int cpuCount;
242 size_t len;
drhf1c57262011-12-08 20:41:33 +0000243 if( _sqliteZone_ ){
244 return SQLITE_OK;
245 }
drh918938f2017-03-21 20:17:24 +0000246 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);
249 if( cpuCount>1 ){
250 /* defer MT decisions to system malloc */
251 _sqliteZone_ = malloc_default_zone();
252 }else{
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");
drhf1c57262011-12-08 20:41:33 +0000257 }
drha80e1602017-03-18 13:59:46 +0000258#endif /* defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) */
danielk197762c14b32008-11-19 09:05:26 +0000259 UNUSED_PARAMETER(NotUsed);
drh40257ff2008-06-13 18:24:27 +0000260 return SQLITE_OK;
261}
262
263/*
drhfec00ea2008-06-14 16:56:21 +0000264** Deinitialize this module.
drh90f6a5b2007-08-15 13:04:54 +0000265*/
drhfec00ea2008-06-14 16:56:21 +0000266static void sqlite3MemShutdown(void *NotUsed){
danielk197762c14b32008-11-19 09:05:26 +0000267 UNUSED_PARAMETER(NotUsed);
drhfec00ea2008-06-14 16:56:21 +0000268 return;
269}
270
drhd1370b62008-10-28 18:58:20 +0000271/*
272** This routine is the only routine in this file with external linkage.
273**
274** Populate the low-level memory allocation function pointers in
275** sqlite3GlobalConfig.m with pointers to the routines in this file.
276*/
277void sqlite3MemSetDefault(void){
drhfec00ea2008-06-14 16:56:21 +0000278 static const sqlite3_mem_methods defaultMethods = {
279 sqlite3MemMalloc,
280 sqlite3MemFree,
281 sqlite3MemRealloc,
282 sqlite3MemSize,
283 sqlite3MemRoundup,
284 sqlite3MemInit,
285 sqlite3MemShutdown,
286 0
287 };
drhd1370b62008-10-28 18:58:20 +0000288 sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
drh90f6a5b2007-08-15 13:04:54 +0000289}
drh4c3645c2007-08-15 17:07:57 +0000290
drh0d180202008-02-14 23:26:56 +0000291#endif /* SQLITE_SYSTEM_MALLOC */