/ Hex Artifact Content
Login

Artifact c390a8fce10912a770ebe6fa031f5f463649e7ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 14.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 77  ile contains low
0190: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
01a0: 6c 6f 63 61 74 69 6f 6e 20 64 72 69 76 65 72 73  location drivers
01b0: 20 66 6f 72 20 77 68 65 6e 0a 2a 2a 20 53 51 4c   for when.** SQL
01c0: 69 74 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ite will use the
01d0: 20 73 74 61 6e 64 61 72 64 20 43 2d 6c 69 62 72   standard C-libr
01e0: 61 72 79 20 6d 61 6c 6c 6f 63 2f 72 65 61 6c 6c  ary malloc/reall
01f0: 6f 63 2f 66 72 65 65 20 69 6e 74 65 72 66 61 63  oc/free interfac
0200: 65 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74  e.** to obtain t
0210: 68 65 20 6d 65 6d 6f 72 79 20 69 74 20 6e 65 65  he memory it nee
0220: 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ds..**.** This f
0230: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ile contains imp
0240: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
0250: 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65  the low-level me
0260: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
0270: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 73 70 65 63  ** routines spec
0280: 69 66 69 65 64 20 69 6e 20 74 68 65 20 73 71 6c  ified in the sql
0290: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
02a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 23 69 6e 63   object..*/.#inc
02b0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
02c0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  h"../*.** This v
02d0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65  ersion of the me
02e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69  mory allocator i
02f0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
0300: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 77 68  It is.** used wh
0310: 65 6e 20 6e 6f 20 6f 74 68 65 72 20 6d 65 6d 6f  en no other memo
0320: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  ry allocator is 
0330: 73 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20  specified using 
0340: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20  compile-time.** 
0350: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 69 66 64 65  macros..*/.#ifde
0360: 66 20 53 51 4c 49 54 45 5f 53 59 53 54 45 4d 5f  f SQLITE_SYSTEM_
0370: 4d 41 4c 4c 4f 43 0a 0a 23 69 66 20 28 21 64 65  MALLOC..#if (!de
0380: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0390: 29 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  )..#define SQLIT
03a0: 45 5f 4d 41 4c 4c 4f 43 28 78 29 20 6d 61 6c 6c  E_MALLOC(x) mall
03b0: 6f 63 28 78 29 0a 23 64 65 66 69 6e 65 20 53 51  oc(x).#define SQ
03c0: 4c 49 54 45 5f 46 52 45 45 28 78 29 20 66 72 65  LITE_FREE(x) fre
03d0: 65 28 78 29 0a 23 64 65 66 69 6e 65 20 53 51 4c  e(x).#define SQL
03e0: 49 54 45 5f 52 45 41 4c 4c 4f 43 28 78 2c 79 29  ITE_REALLOC(x,y)
03f0: 20 72 65 61 6c 6c 6f 63 28 28 78 29 2c 28 79 29   realloc((x),(y)
0400: 29 0a 0a 23 65 6c 73 65 0a 0a 0a 23 69 6e 63 6c  )..#else...#incl
0410: 75 64 65 20 3c 73 79 73 2f 73 79 73 63 74 6c 2e  ude <sys/sysctl.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 6c  h>.#include <mal
0430: 6c 6f 63 2f 6d 61 6c 6c 6f 63 2e 68 3e 0a 23 69  loc/malloc.h>.#i
0440: 6e 63 6c 75 64 65 20 3c 6c 69 62 6b 65 72 6e 2f  nclude <libkern/
0450: 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 0a 73 74 61  OSAtomic.h>..sta
0460: 74 69 63 20 6d 61 6c 6c 6f 63 5f 7a 6f 6e 65 5f  tic malloc_zone_
0470: 74 2a 20 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f 3b  t* _sqliteZone_;
0480: 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  ..#define SQLITE
0490: 5f 4d 41 4c 4c 4f 43 28 78 29 20 6d 61 6c 6c 6f  _MALLOC(x) mallo
04a0: 63 5f 7a 6f 6e 65 5f 6d 61 6c 6c 6f 63 28 5f 73  c_zone_malloc(_s
04b0: 71 6c 69 74 65 5a 6f 6e 65 5f 2c 20 28 78 29 29  qliteZone_, (x))
04c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
04d0: 46 52 45 45 28 78 29 20 6d 61 6c 6c 6f 63 5f 7a  FREE(x) malloc_z
04e0: 6f 6e 65 5f 66 72 65 65 28 5f 73 71 6c 69 74 65  one_free(_sqlite
04f0: 5a 6f 6e 65 5f 2c 20 28 78 29 29 3b 0a 23 64 65  Zone_, (x));.#de
0500: 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 41 4c  fine SQLITE_REAL
0510: 4c 4f 43 28 78 2c 79 29 20 6d 61 6c 6c 6f 63 5f  LOC(x,y) malloc_
0520: 7a 6f 6e 65 5f 72 65 61 6c 6c 6f 63 28 5f 73 71  zone_realloc(_sq
0530: 6c 69 74 65 5a 6f 6e 65 5f 2c 20 28 78 29 2c 20  liteZone_, (x), 
0540: 28 79 29 29 0a 23 64 65 66 69 6e 65 20 53 51 4c  (y)).#define SQL
0550: 49 54 45 5f 4d 41 4c 4c 4f 43 53 49 5a 45 28 78  ITE_MALLOCSIZE(x
0560: 29 20 28 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f 20  ) (_sqliteZone_ 
0570: 3f 20 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f 2d 3e  ? _sqliteZone_->
0580: 73 69 7a 65 28 5f 73 71 6c 69 74 65 5a 6f 6e 65  size(_sqliteZone
0590: 5f 2c 78 29 20 3a 20 6d 61 6c 6c 6f 63 5f 73 69  _,x) : malloc_si
05a0: 7a 65 28 78 29 29 0a 0a 23 65 6e 64 69 66 0a 0a  ze(x))..#endif..
05b0: 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 6d 61 6c 6c 6f  /*.** Like mallo
05c0: 63 28 29 2c 20 62 75 74 20 72 65 6d 65 6d 62 65  c(), but remembe
05d0: 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
05e0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  e allocation.** 
05f0: 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
0600: 69 6e 64 20 69 74 20 6c 61 74 65 72 20 75 73 69  ind it later usi
0610: 6e 67 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a  ng sqlite3MemSiz
0620: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  e()..**.** For t
0630: 68 69 73 20 6c 6f 77 2d 6c 65 76 65 6c 20 72 6f  his low-level ro
0640: 75 74 69 6e 65 2c 20 77 65 20 61 72 65 20 67 75  utine, we are gu
0650: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 42  aranteed that nB
0660: 79 74 65 3e 30 20 62 65 63 61 75 73 65 0a 2a 2a  yte>0 because.**
0670: 20 63 61 73 65 73 20 6f 66 20 6e 42 79 74 65 3c   cases of nByte<
0680: 3d 30 20 77 69 6c 6c 20 62 65 20 69 6e 74 65 72  =0 will be inter
0690: 63 65 70 74 65 64 20 61 6e 64 20 64 65 61 6c 74  cepted and dealt
06a0: 20 77 69 74 68 20 62 79 20 68 69 67 68 65 72 20   with by higher 
06b0: 6c 65 76 65 6c 0a 2a 2a 20 72 6f 75 74 69 6e 65  level.** routine
06c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
06d0: 64 20 2a 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c  d *sqlite3MemMal
06e0: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a  loc(int nByte){.
06f0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0700: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  *p;.  assert( nB
0710: 79 74 65 3e 30 20 29 3b 0a 20 20 6e 42 79 74 65  yte>0 );.  nByte
0720: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
0730: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
0740: 5f 4d 41 4c 4c 4f 43 53 49 5a 45 0a 20 20 70 20  _MALLOCSIZE.  p 
0750: 3d 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 28  = SQLITE_MALLOC(
0760: 20 6e 42 79 74 65 20 2b 20 38 20 29 3b 0a 20 20   nByte + 8 );.  
0770: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 5b 30  if( p ){.    p[0
0780: 5d 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 70  ] = nByte;.    p
0790: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
07a0: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
07b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
07c0: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  Log!=0 );.    sq
07d0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
07e0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
07f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 75 20 62  to allocate %u b
0800: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  ytes of memory",
0810: 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 23 65 6c   nByte);.  }.#el
0820: 73 65 0a 20 20 70 20 3d 20 53 51 4c 49 54 45 5f  se.  p = SQLITE_
0830: 4d 41 4c 4c 4f 43 28 20 6e 42 79 74 65 20 29 3b  MALLOC( nByte );
0840: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
0850: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
0860: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
0870: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73 71  Log!=0 );.    sq
0880: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
0890: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
08a0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 75 20 62  to allocate %u b
08b0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  ytes of memory",
08c0: 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 23 65 6e   nByte);.  }.#en
08d0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  dif.  return (vo
08e0: 69 64 20 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  id *)p;.}../*.**
08f0: 20 4c 69 6b 65 20 66 72 65 65 28 29 20 62 75 74   Like free() but
0900: 20 77 6f 72 6b 73 20 66 6f 72 20 61 6c 6c 6f 63   works for alloc
0910: 61 74 69 6f 6e 73 20 6f 62 74 61 69 6e 65 64 20  ations obtained 
0920: 66 72 6f 6d 20 73 71 6c 69 74 65 33 4d 65 6d 4d  from sqlite3MemM
0930: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 6f 72 20 73 71  alloc().** or sq
0940: 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c 6f 63 28  lite3MemRealloc(
0950: 29 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 69  )..**.** For thi
0960: 73 20 6c 6f 77 2d 6c 65 76 65 6c 20 72 6f 75 74  s low-level rout
0970: 69 6e 65 2c 20 77 65 20 61 6c 72 65 61 64 79 20  ine, we already 
0980: 6b 6e 6f 77 20 74 68 61 74 20 70 50 72 69 6f 72  know that pPrior
0990: 21 3d 30 20 73 69 6e 63 65 0a 2a 2a 20 63 61 73  !=0 since.** cas
09a0: 65 73 20 77 68 65 72 65 20 70 50 72 69 6f 72 3d  es where pPrior=
09b0: 3d 30 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  =0 will have bee
09c0: 6e 20 69 6e 74 65 63 65 70 74 65 64 20 61 6e 64  n intecepted and
09d0: 20 64 65 61 6c 74 20 77 69 74 68 0a 2a 2a 20 62   dealt with.** b
09e0: 79 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  y higher-level r
09f0: 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 73 74 61 74  outines..*/.stat
0a00: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  ic void sqlite3M
0a10: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
0a20: 69 6f 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ior){.  sqlite3_
0a30: 69 6e 74 36 34 20 2a 70 20 3d 20 28 73 71 6c 69  int64 *p = (sqli
0a40: 74 65 33 5f 69 6e 74 36 34 2a 29 70 50 72 69 6f  te3_int64*)pPrio
0a50: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
0a60: 69 6f 72 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65  ior!=0 );.#ifnde
0a70: 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 53  f SQLITE_MALLOCS
0a80: 49 5a 45 0a 20 20 70 2d 2d 3b 0a 23 65 6e 64 69  IZE.  p--;.#endi
0a90: 66 0a 20 20 53 51 4c 49 54 45 5f 46 52 45 45 28  f.  SQLITE_FREE(
0aa0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  p);.}../*.** Rep
0ab0: 6f 72 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ort the allocate
0ac0: 64 20 73 69 7a 65 20 6f 66 20 61 20 70 72 69 6f  d size of a prio
0ad0: 72 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 78 4d  r return from xM
0ae0: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 6f 72 20 78 52  alloc().** or xR
0af0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  ealloc()..*/.sta
0b00: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4d  tic int sqlite3M
0b10: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 50 72  emSize(void *pPr
0b20: 69 6f 72 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ior){.#ifndef SQ
0b30: 4c 49 54 45 5f 4d 41 4c 4c 4f 43 53 49 5a 45 0a  LITE_MALLOCSIZE.
0b40: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0b50: 2a 70 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  *p;.  if( pPrior
0b60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
0b70: 20 20 70 20 3d 20 28 73 71 6c 69 74 65 33 5f 69    p = (sqlite3_i
0b80: 6e 74 36 34 2a 29 70 50 72 69 6f 72 3b 0a 20 20  nt64*)pPrior;.  
0b90: 70 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  p--;.  return (i
0ba0: 6e 74 29 70 5b 30 5d 3b 0a 23 65 6c 73 65 0a 20  nt)p[0];.#else. 
0bb0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 53 51 4c   return (int)SQL
0bc0: 49 54 45 5f 4d 41 4c 4c 4f 43 53 49 5a 45 28 70  ITE_MALLOCSIZE(p
0bd0: 50 72 69 6f 72 29 3b 0a 23 65 6e 64 69 66 0a 7d  Prior);.#endif.}
0be0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 72 65 61  ../*.** Like rea
0bf0: 6c 6c 6f 63 28 29 2e 20 20 52 65 73 69 7a 65 20  lloc().  Resize 
0c00: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 72  an allocation pr
0c10: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
0c20: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
0c30: 33 4d 65 6d 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  3MemMalloc()..**
0c40: 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 6c 6f 77  .** For this low
0c50: 2d 6c 65 76 65 6c 20 69 6e 74 65 72 66 61 63 65  -level interface
0c60: 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 70  , we know that p
0c70: 50 72 69 6f 72 21 3d 30 2e 20 20 43 61 73 65 73  Prior!=0.  Cases
0c80: 20 77 68 65 72 65 0a 2a 2a 20 70 50 72 69 6f 72   where.** pPrior
0c90: 3d 3d 30 20 77 68 69 6c 65 20 68 61 76 65 20 62  ==0 while have b
0ca0: 65 65 6e 20 69 6e 74 65 72 63 65 70 74 65 64 20  een intercepted 
0cb0: 62 79 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  by higher-level 
0cc0: 72 6f 75 74 69 6e 65 20 61 6e 64 0a 2a 2a 20 72  routine and.** r
0cd0: 65 64 69 72 65 63 74 65 64 20 74 6f 20 78 4d 61  edirected to xMa
0ce0: 6c 6c 6f 63 2e 20 20 53 69 6d 69 6c 61 72 6c 79  lloc.  Similarly
0cf0: 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 6e  , we know that n
0d00: 42 79 74 65 3e 30 20 62 65 63 61 75 73 65 73 0a  Byte>0 becauses.
0d10: 2a 2a 20 63 61 73 65 73 20 77 68 65 72 65 20 6e  ** cases where n
0d20: 42 79 74 65 3c 3d 30 20 77 69 6c 6c 20 68 61 76  Byte<=0 will hav
0d30: 65 20 62 65 65 6e 20 69 6e 74 65 72 63 65 70 74  e been intercept
0d40: 65 64 20 62 79 20 68 69 67 68 65 72 2d 6c 65 76  ed by higher-lev
0d50: 65 6c 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 61  el.** routines a
0d60: 6e 64 20 72 65 64 69 72 65 63 74 65 64 20 74 6f  nd redirected to
0d70: 20 78 46 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   xFree..*/.stati
0d80: 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d  c void *sqlite3M
0d90: 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  emRealloc(void *
0da0: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
0db0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  e){.  sqlite3_in
0dc0: 74 36 34 20 2a 70 20 3d 20 28 73 71 6c 69 74 65  t64 *p = (sqlite
0dd0: 33 5f 69 6e 74 36 34 2a 29 70 50 72 69 6f 72 3b  3_int64*)pPrior;
0de0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
0df0: 72 21 3d 30 20 26 26 20 6e 42 79 74 65 3e 30 20  r!=0 && nByte>0 
0e00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
0e10: 74 65 3d 3d 52 4f 55 4e 44 38 28 6e 42 79 74 65  te==ROUND8(nByte
0e20: 29 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 34 36  ) ); /* EV: R-46
0e30: 31 39 39 2d 33 30 32 34 39 20 2a 2f 0a 23 69 66  199-30249 */.#if
0e40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c  ndef SQLITE_MALL
0e50: 4f 43 53 49 5a 45 0a 20 20 70 2d 2d 3b 0a 20 20  OCSIZE.  p--;.  
0e60: 70 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 4c 4c  p = SQLITE_REALL
0e70: 4f 43 28 70 2c 20 6e 42 79 74 65 2b 38 20 29 3b  OC(p, nByte+8 );
0e80: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0e90: 70 5b 30 5d 20 3d 20 6e 42 79 74 65 3b 0a 20 20  p[0] = nByte;.  
0ea0: 20 20 70 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a    p++;.  }else{.
0eb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
0ec0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
0ed0: 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
0ee0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
0ef0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20  QLITE_NOMEM,.   
0f00: 20 20 20 20 22 66 61 69 6c 65 64 20 6d 65 6d 6f      "failed memo
0f10: 72 79 20 72 65 73 69 7a 65 20 25 75 20 74 6f 20  ry resize %u to 
0f20: 25 75 20 62 79 74 65 73 22 2c 0a 20 20 20 20 20  %u bytes",.     
0f30: 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65    sqlite3MemSize
0f40: 28 70 50 72 69 6f 72 29 2c 20 6e 42 79 74 65 29  (pPrior), nByte)
0f50: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 20  ;.  }.#else.  p 
0f60: 3d 20 53 51 4c 49 54 45 5f 52 45 41 4c 4c 4f 43  = SQLITE_REALLOC
0f70: 28 70 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  (p, nByte );.  i
0f80: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 74 65 73  f( !p ){.    tes
0f90: 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
0fa0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
0fb0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
0fc0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
0fd0: 45 4d 2c 0a 20 20 20 20 20 20 22 66 61 69 6c 65  EM,.      "faile
0fe0: 64 20 6d 65 6d 6f 72 79 20 72 65 73 69 7a 65 20  d memory resize 
0ff0: 25 75 20 74 6f 20 25 75 20 62 79 74 65 73 22 2c  %u to %u bytes",
1000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
1010: 6d 53 69 7a 65 28 70 50 72 69 6f 72 29 2c 20 6e  mSize(pPrior), n
1020: 42 79 74 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Byte);.  }.#endi
1030: 66 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  f.  return (void
1040: 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  *)p;.}../*.** Ro
1050: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
1060: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
1070: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
1080: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
1090: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  ic int sqlite3Me
10a0: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b  mRoundup(int n){
10b0: 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
10c0: 28 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (n);.}../*.** In
10d0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
10e0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
10f0: 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 49 6e  int sqlite3MemIn
1100: 69 74 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  it(void *NotUsed
1110: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
1120: 5f 41 50 50 4c 45 5f 5f 29 0a 09 69 66 20 28 5f  _APPLE__)..if (_
1130: 73 71 6c 69 74 65 5a 6f 6e 65 5f 29 20 7b 0a 09  sqliteZone_) {..
1140: 09 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f  .return SQLITE_O
1150: 4b 3b 0a 09 7d 0a 09 69 6e 74 20 63 70 75 43 6f  K;..}..int cpuCo
1160: 75 6e 74 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  unt;.    size_t 
1170: 6c 65 6e 3b 0a 20 20 20 20 0a 20 20 20 20 6c 65  len;.    .    le
1180: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 70 75 43 6f  n = sizeof(cpuCo
1190: 75 6e 74 29 3b 0a 20 20 20 20 73 79 73 63 74 6c  unt);.    sysctl
11a0: 62 79 6e 61 6d 65 28 22 68 77 2e 6e 63 70 75 22  byname("hw.ncpu"
11b0: 2c 20 26 63 70 75 43 6f 75 6e 74 2c 20 26 6c 65  , &cpuCount, &le
11c0: 6e 2c 20 4e 55 4c 4c 2c 20 30 29 3b 20 20 2f 2f  n, NULL, 0);  //
11d0: 20 20 6f 6e 65 20 61 6c 6d 6f 73 74 20 61 6c 77    one almost alw
11e0: 61 79 73 20 77 61 6e 74 73 20 74 6f 20 75 73 65  ays wants to use
11f0: 20 22 68 77 2e 61 63 74 69 76 65 63 70 75 22 20   "hw.activecpu" 
1200: 66 6f 72 20 4d 54 20 64 65 63 69 73 69 6f 6e 73  for MT decisions
1210: 2c 20 62 75 74 20 6e 6f 74 20 68 65 72 65 2e 0a  , but not here..
1220: 09 0a 09 69 66 20 28 63 70 75 43 6f 75 6e 74 20  ...if (cpuCount 
1230: 3e 20 31 29 20 7b 0a 09 09 2f 2f 20 64 65 66 65  > 1) {...// defe
1240: 72 20 4d 54 20 64 65 63 69 73 69 6f 6e 73 20 74  r MT decisions t
1250: 6f 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 0a  o system malloc.
1260: 09 09 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f 20 3d  .._sqliteZone_ =
1270: 20 6d 61 6c 6c 6f 63 5f 64 65 66 61 75 6c 74 5f   malloc_default_
1280: 7a 6f 6e 65 28 29 3b 0a 09 7d 20 65 6c 73 65 20  zone();..} else 
1290: 7b 0a 09 09 2f 2f 20 6f 6e 6c 79 20 31 20 63 6f  {...// only 1 co
12a0: 72 65 2c 20 75 73 65 20 6f 75 72 20 6f 77 6e 20  re, use our own 
12b0: 7a 6f 6e 65 20 74 6f 20 63 6f 6e 74 65 6e 74 69  zone to contenti
12c0: 6f 6e 20 6f 76 65 72 20 67 6c 6f 62 61 6c 20 6c  on over global l
12d0: 6f 63 6b 73 2c 20 0a 09 09 2f 2f 20 65 2e 67 2e  ocks, ...// e.g.
12e0: 20 77 65 20 68 61 76 65 20 6f 75 72 20 6f 77 6e   we have our own
12f0: 20 64 65 64 69 63 61 74 65 64 20 6c 6f 63 6b 73   dedicated locks
1300: 0a 09 09 6d 61 6c 6c 6f 63 5f 7a 6f 6e 65 5f 74  ...malloc_zone_t
1310: 2a 20 6e 65 77 7a 6f 6e 65 20 3d 20 6d 61 6c 6c  * newzone = mall
1320: 6f 63 5f 63 72 65 61 74 65 5f 7a 6f 6e 65 28 34  oc_create_zone(4
1330: 30 39 36 2c 20 30 29 3b 0a 09 09 6d 61 6c 6c 6f  096, 0);...mallo
1340: 63 5f 73 65 74 5f 7a 6f 6e 65 5f 6e 61 6d 65 28  c_set_zone_name(
1350: 6e 65 77 7a 6f 6e 65 2c 20 22 53 71 6c 69 74 65  newzone, "Sqlite
1360: 5f 48 65 61 70 22 29 3b 0a 0a 09 09 62 6f 6f 6c  _Heap");....bool
1370: 20 73 75 63 63 65 73 73 3b 09 09 0a 09 09 64 6f   success;.....do
1380: 20 7b 0a 09 09 09 73 75 63 63 65 73 73 20 3d 20   {....success = 
1390: 4f 53 41 74 6f 6d 69 63 43 6f 6d 70 61 72 65 41  OSAtomicCompareA
13a0: 6e 64 53 77 61 70 50 74 72 42 61 72 72 69 65 72  ndSwapPtrBarrier
13b0: 28 4e 55 4c 4c 2c 20 6e 65 77 7a 6f 6e 65 2c 20  (NULL, newzone, 
13c0: 28 76 6f 69 64 20 2a 20 76 6f 6c 61 74 69 6c 65  (void * volatile
13d0: 20 2a 29 26 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f   *)&_sqliteZone_
13e0: 29 3b 0a 09 09 7d 20 77 68 69 6c 65 20 28 21 5f  );...} while (!_
13f0: 73 71 6c 69 74 65 5a 6f 6e 65 5f 29 3b 0a 09 09  sqliteZone_);...
1400: 0a 09 09 69 66 20 28 21 73 75 63 63 65 73 73 29  ...if (!success)
1410: 20 7b 0a 09 09 09 2f 2f 20 73 6f 6d 65 62 6f 64   {....// somebod
1420: 79 20 72 65 67 69 73 74 65 72 65 64 20 61 20 7a  y registered a z
1430: 6f 6e 65 20 66 69 72 73 74 0a 09 09 09 6d 61 6c  one first....mal
1440: 6c 6f 63 5f 64 65 73 74 72 6f 79 5f 7a 6f 6e 65  loc_destroy_zone
1450: 28 6e 65 77 7a 6f 6e 65 29 3b 0a 09 09 7d 0a 09  (newzone);...}..
1460: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 55 4e 55 53  }.#endif..  UNUS
1470: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1480: 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14a0: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
14b0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
14c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
14d0: 69 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 6e 28  ite3MemShutdown(
14e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  void *NotUsed){.
14f0: 23 69 66 20 28 30 20 26 26 20 64 65 66 69 6e 65  #if (0 && define
1500: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 09 69  d(__APPLE__))..i
1510: 66 20 28 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f 20  f (_sqliteZone_ 
1520: 26 26 20 28 5f 73 71 6c 69 74 65 5a 6f 6e 65 5f  && (_sqliteZone_
1530: 20 21 3d 20 6d 61 6c 6c 6f 63 5f 64 65 66 61 75   != malloc_defau
1540: 6c 74 5f 7a 6f 6e 65 28 29 29 29 20 7b 0a 09 09  lt_zone())) {...
1550: 6d 61 6c 6c 6f 63 5f 7a 6f 6e 65 5f 74 2a 20 6f  malloc_zone_t* o
1560: 6c 64 7a 6f 6e 65 20 3d 20 5f 73 71 6c 69 74 65  ldzone = _sqlite
1570: 5a 6f 6e 65 5f 3b 0a 0a 09 09 62 6f 6f 6c 20 73  Zone_;....bool s
1580: 75 63 63 65 73 73 20 3d 20 4f 53 41 74 6f 6d 69  uccess = OSAtomi
1590: 63 43 6f 6d 70 61 72 65 41 6e 64 53 77 61 70 50  cCompareAndSwapP
15a0: 74 72 42 61 72 72 69 65 72 28 6f 6c 64 7a 6f 6e  trBarrier(oldzon
15b0: 65 2c 20 4e 55 4c 4c 2c 20 28 76 6f 69 64 20 2a  e, NULL, (void *
15c0: 20 76 6f 6c 61 74 69 6c 65 20 2a 29 26 5f 73 71   volatile *)&_sq
15d0: 6c 69 74 65 5a 6f 6e 65 5f 29 3b 0a 09 09 69 66  liteZone_);...if
15e0: 20 28 73 75 63 63 65 73 73 29 20 7b 0a 09 09 09   (success) {....
15f0: 6d 61 6c 6c 6f 63 5f 64 65 73 74 72 6f 79 5f 7a  malloc_destroy_z
1600: 6f 6e 65 28 6f 6c 64 7a 6f 6e 65 29 3b 0a 09 09  one(oldzone);...
1610: 7d 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 0a 20 20  }..}.#endif...  
1620: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1630: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
1640: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
1650: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
1660: 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69  e only routine i
1670: 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69 74 68  n this file with
1680: 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67   external linkag
1690: 65 2e 0a 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  e..**.** Populat
16a0: 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20  e the low-level 
16b0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
16c0: 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  n function point
16d0: 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65  ers in.** sqlite
16e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
16f0: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
1700: 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e   the routines in
1710: 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a 76   this file..*/.v
1720: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
1730: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
1740: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1750: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
1760: 64 73 20 64 65 66 61 75 6c 74 4d 65 74 68 6f 64  ds defaultMethod
1770: 73 20 3d 20 7b 0a 20 20 20 20 20 73 71 6c 69 74  s = {.     sqlit
1780: 65 33 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20  e3MemMalloc,.   
1790: 20 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65 65    sqlite3MemFree
17a0: 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  ,.     sqlite3Me
17b0: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 20 73  mRealloc,.     s
17c0: 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65 2c 0a 20  qlite3MemSize,. 
17d0: 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 52 6f      sqlite3MemRo
17e0: 75 6e 64 75 70 2c 0a 20 20 20 20 20 73 71 6c 69  undup,.     sqli
17f0: 74 65 33 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20  te3MemInit,.    
1800: 20 73 71 6c 69 74 65 33 4d 65 6d 53 68 75 74 64   sqlite3MemShutd
1810: 6f 77 6e 2c 0a 20 20 20 20 20 30 0a 20 20 7d 3b  own,.     0.  };
1820: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
1830: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
1840: 4d 41 4c 4c 4f 43 2c 20 26 64 65 66 61 75 6c 74  MALLOC, &default
1850: 4d 65 74 68 6f 64 73 29 3b 0a 7d 0a 0a 23 75 6e  Methods);.}..#un
1860: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  def SQLITE_MALLO
1870: 43 0a 23 75 6e 64 65 66 20 53 51 4c 49 54 45 5f  C.#undef SQLITE_
1880: 46 52 45 45 0a 23 75 6e 64 65 66 20 53 51 4c 49  FREE.#undef SQLI
1890: 54 45 5f 52 45 41 4c 4c 4f 43 0a 0a 23 65 6e 64  TE_REALLOC..#end
18a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 59 53  if /* SQLITE_SYS
18b0: 54 45 4d 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a        TEM_MALLOC */.