/ Hex Artifact Content
Login

Artifact 6f46eef2c2cce452ae38f5b98c2632712e858bc9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 15.**.** 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 20 77 68 69 6c 65 20 61 64 64 69 6e 67 20  ds while adding 
0230: 6c 6f 74 73 20 6f 66 20 61 64 64 69 74 69 6f 6e  lots of addition
0240: 61 6c 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  al debugging.** 
0250: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 65  information to e
0260: 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ach allocation i
0270: 6e 20 6f 72 64 65 72 20 74 6f 20 68 65 6c 70 20  n order to help 
0280: 64 65 74 65 63 74 20 61 6e 64 20 66 69 78 20 6d  detect and fix m
0290: 65 6d 6f 72 79 0a 2a 2a 20 6c 65 61 6b 73 20 61  emory.** leaks a
02a0: 6e 64 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 20  nd memory usage 
02b0: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  errors..**.** Th
02c0: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
02d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
02e0: 20 6f 66 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65   of the low-leve
02f0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
0300: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
0310: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
0320: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
0330: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  hods object..**.
0340: 2a 2a 20 24 49 64 3a 20 6d 65 6d 32 2e 63 2c 76  ** $Id: mem2.c,v
0350: 20 31 2e 34 33 20 32 30 30 39 2f 30 32 2f 30 35   1.43 2009/02/05
0360: 20 30 33 3a 30 30 3a 30 36 20 73 68 61 6e 65 20   03:00:06 shane 
0370: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
0380: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0390: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
03a0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ion of the memor
03b0: 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 75  y allocator is u
03c0: 73 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a  sed only if the.
03d0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ** SQLITE_MEMDEB
03e0: 55 47 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  UG macro is defi
03f0: 6e 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ned.*/.#ifdef SQ
0400: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 0a 2f  LITE_MEMDEBUG../
0410: 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 74 72 61  *.** The backtra
0420: 63 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ce functionality
0430: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
0440: 6c 65 20 77 69 74 68 20 47 4c 49 42 43 0a 2a 2f  le with GLIBC.*/
0450: 0a 23 69 66 64 65 66 20 5f 5f 47 4c 49 42 43 5f  .#ifdef __GLIBC_
0460: 5f 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 62  _.  extern int b
0470: 61 63 6b 74 72 61 63 65 28 76 6f 69 64 2a 2a 2c  acktrace(void**,
0480: 69 6e 74 29 3b 0a 20 20 65 78 74 65 72 6e 20 76  int);.  extern v
0490: 6f 69 64 20 62 61 63 6b 74 72 61 63 65 5f 73 79  oid backtrace_sy
04a0: 6d 62 6f 6c 73 5f 66 64 28 76 6f 69 64 2a 63 6f  mbols_fd(void*co
04b0: 6e 73 74 2a 2c 69 6e 74 2c 69 6e 74 29 3b 0a 23  nst*,int,int);.#
04c0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 62 61  else.# define ba
04d0: 63 6b 74 72 61 63 65 28 41 2c 42 29 20 31 0a 23  cktrace(A,B) 1.#
04e0: 20 64 65 66 69 6e 65 20 62 61 63 6b 74 72 61 63   define backtrac
04f0: 65 5f 73 79 6d 62 6f 6c 73 5f 66 64 28 41 2c 42  e_symbols_fd(A,B
0500: 2c 43 29 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  ,C).#endif.#incl
0510: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 2f  ude <stdio.h>../
0520: 2a 0a 2a 2a 20 45 61 63 68 20 6d 65 6d 6f 72 79  *.** Each memory
0530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 6f 6f 6b   allocation look
0540: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
0550: 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **  ------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
05a0: 20 7c 20 54 69 74 6c 65 20 7c 20 20 62 61 63 6b   | Title |  back
05b0: 74 72 61 63 65 20 70 6f 69 6e 74 65 72 73 20 7c  trace pointers |
05c0: 20 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 7c 20    MemBlockHdr | 
05d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 7c 20 20 45   allocation |  E
05e0: 6e 64 47 75 61 72 64 20 7c 0a 2a 2a 20 20 2d 2d  ndGuard |.**  --
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54 68 65  ------.**.** The
0640: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 6f 64   application cod
0650: 65 20 73 65 65 73 20 6f 6e 6c 79 20 61 20 70 6f  e sees only a po
0660: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
0670: 6f 63 61 74 69 6f 6e 2e 20 20 57 65 20 68 61 76  ocation.  We hav
0680: 65 0a 2a 2a 20 74 6f 20 62 61 63 6b 20 75 70 20  e.** to back up 
0690: 66 72 6f 6d 20 74 68 65 20 61 6c 6c 6f 63 61 74  from the allocat
06a0: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 66  ion pointer to f
06b0: 69 6e 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b  ind the MemBlock
06c0: 48 64 72 2e 20 20 54 68 65 0a 2a 2a 20 4d 65 6d  Hdr.  The.** Mem
06d0: 42 6c 6f 63 6b 48 64 72 20 74 65 6c 6c 73 20 75  BlockHdr tells u
06e0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
06f0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64  e allocation and
0700: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
0710: 2a 20 62 61 63 6b 74 72 61 63 65 20 70 6f 69 6e  * backtrace poin
0720: 74 65 72 73 2e 20 20 54 68 65 72 65 20 69 73 20  ters.  There is 
0730: 61 6c 73 6f 20 61 20 67 75 61 72 64 20 77 6f 72  also a guard wor
0740: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
0750: 74 68 65 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48  the.** MemBlockH
0760: 64 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65  dr..*/.struct Me
0770: 6d 42 6c 6f 63 6b 48 64 72 20 7b 0a 20 20 69 36  mBlockHdr {.  i6
0780: 34 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 iSize;        
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69    /* Size of thi
07b0: 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  s allocation */.
07c0: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
07d0: 6b 48 64 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50  kHdr *pNext, *pP
07e0: 72 65 76 3b 20 20 2f 2a 20 4c 69 6e 6b 65 64 20  rev;  /* Linked 
07f0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 66 72  list of all unfr
0800: 65 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  eed memory */.  
0810: 63 68 61 72 20 6e 42 61 63 6b 74 72 61 63 65 3b  char nBacktrace;
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0840: 20 62 61 63 6b 74 72 61 63 65 73 20 6f 6e 20 74   backtraces on t
0850: 68 69 73 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63  his alloc */.  c
0860: 68 61 72 20 6e 42 61 63 6b 74 72 61 63 65 53 6c  har nBacktraceSl
0870: 6f 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ots;            
0880: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
0890: 62 61 63 6b 74 72 61 63 65 20 73 6c 6f 74 73 20  backtrace slots 
08a0: 2a 2f 0a 20 20 73 68 6f 72 74 20 6e 54 69 74 6c  */.  short nTitl
08b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
08c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
08d0: 73 20 6f 66 20 74 69 74 6c 65 3b 20 69 6e 63 6c  s of title; incl
08e0: 75 64 65 73 20 27 5c 30 27 20 2a 2f 0a 20 20 69  udes '\0' */.  i
08f0: 6e 74 20 69 46 6f 72 65 47 75 61 72 64 3b 20 20  nt iForeGuard;  
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 2f 2a 20 47 75 61 72 64 20 77 6f 72 64     /* Guard word
0920: 20 66 6f 72 20 73 61 6e 69 74 79 20 2a 2f 0a 7d   for sanity */.}
0930: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 75 61 72 64 20 77  ;../*.** Guard w
0940: 6f 72 64 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ords.*/.#define 
0950: 46 4f 52 45 47 55 41 52 44 20 30 78 38 30 46 35  FOREGUARD 0x80F5
0960: 45 31 35 33 0a 23 64 65 66 69 6e 65 20 52 45 41  E153.#define REA
0970: 52 47 55 41 52 44 20 30 78 45 34 36 37 36 42 35  RGUARD 0xE4676B5
0980: 33 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20  3../*.** Number 
0990: 6f 66 20 6d 61 6c 6c 6f 63 20 73 69 7a 65 20 69  of malloc size i
09a0: 6e 63 72 65 6d 65 6e 74 73 20 74 6f 20 74 72 61  ncrements to tra
09b0: 63 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ck..*/.#define N
09c0: 43 53 49 5a 45 20 20 31 30 30 30 0a 0a 2f 2a 0a  CSIZE  1000../*.
09d0: 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 73 74  ** All of the st
09e0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
09f0: 73 65 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75  sed by this modu
0a00: 6c 65 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64  le are collected
0a10: 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  .** into a singl
0a20: 65 20 73 74 72 75 63 74 75 72 65 20 6e 61 6d 65  e structure name
0a30: 64 20 22 6d 65 6d 22 2e 20 20 54 68 69 73 20 69  d "mem".  This i
0a40: 73 20 74 6f 20 6b 65 65 70 20 74 68 65 0a 2a 2a  s to keep the.**
0a50: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
0a60: 73 20 6f 72 67 61 6e 69 7a 65 64 20 61 6e 64 20  s organized and 
0a70: 74 6f 20 72 65 64 75 63 65 20 6e 61 6d 65 73 70  to reduce namesp
0a80: 61 63 65 20 70 6f 6c 6c 75 74 69 6f 6e 0a 2a 2a  ace pollution.**
0a90: 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c   when this modul
0aa0: 65 20 69 73 20 63 6f 6d 62 69 6e 65 64 20 77 69  e is combined wi
0ab0: 74 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  th other in the 
0ac0: 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f  amalgamation..*/
0ad0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b  .static struct {
0ae0: 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 75  .  .  /*.  ** Mu
0af0: 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  tex to control a
0b00: 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d 65 6d  ccess to the mem
0b10: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  ory allocation s
0b20: 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  ubsystem..  */. 
0b30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
0b40: 6d 75 74 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  mutex;..  /*.  *
0b50: 2a 20 48 65 61 64 20 61 6e 64 20 74 61 69 6c 20  * Head and tail 
0b60: 6f 66 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  of a linked list
0b70: 20 6f 66 20 61 6c 6c 20 6f 75 74 73 74 61 6e 64   of all outstand
0b80: 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a  ing allocations.
0b90: 20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4d 65    */.  struct Me
0ba0: 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 46 69 72 73  mBlockHdr *pFirs
0bb0: 74 3b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  t;.  struct MemB
0bc0: 6c 6f 63 6b 48 64 72 20 2a 70 4c 61 73 74 3b 0a  lockHdr *pLast;.
0bd0: 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65    .  /*.  ** The
0be0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
0bf0: 73 20 6f 66 20 62 61 63 6b 74 72 61 63 65 20 74  s of backtrace t
0c00: 6f 20 73 61 76 65 20 69 6e 20 6e 65 77 20 61 6c  o save in new al
0c10: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  locations..  */.
0c20: 20 20 69 6e 74 20 6e 42 61 63 6b 74 72 61 63 65    int nBacktrace
0c30: 3b 0a 20 20 76 6f 69 64 20 28 2a 78 42 61 63 6b  ;.  void (*xBack
0c40: 74 72 61 63 65 29 28 69 6e 74 2c 20 69 6e 74 2c  trace)(int, int,
0c50: 20 76 6f 69 64 20 2a 2a 29 3b 0a 0a 20 20 2f 2a   void **);..  /*
0c60: 0a 20 20 2a 2a 20 54 69 74 6c 65 20 74 65 78 74  .  ** Title text
0c70: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 20 66 72   to insert in fr
0c80: 6f 6e 74 20 6f 66 20 65 61 63 68 20 62 6c 6f 63  ont of each bloc
0c90: 6b 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 69  k.  */.  int nTi
0ca0: 74 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  tle;        /* B
0cb0: 79 74 65 73 20 6f 66 20 7a 54 69 74 6c 65 20 74  ytes of zTitle t
0cc0: 6f 20 73 61 76 65 2e 20 20 49 6e 63 6c 75 64 65  o save.  Include
0cd0: 73 20 27 5c 30 27 20 61 6e 64 20 70 61 64 64 69  s '\0' and paddi
0ce0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 69  ng */.  char zTi
0cf0: 74 6c 65 5b 31 30 30 5d 3b 20 20 2f 2a 20 54 68  tle[100];  /* Th
0d00: 65 20 74 69 74 6c 65 20 74 65 78 74 20 2a 2f 0a  e title text */.
0d10: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 73 71 6c 69  .  /* .  ** sqli
0d20: 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
0d30: 77 28 29 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  w() increments t
0d40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75  he following cou
0d50: 6e 74 65 72 2e 0a 20 20 2a 2a 20 73 71 6c 69 74  nter..  ** sqlit
0d60: 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 20  e3MallocAllow() 
0d70: 64 65 63 72 65 6d 65 6e 74 73 20 69 74 2e 0a 20  decrements it.. 
0d80: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61 6c 6c   */.  int disall
0d90: 6f 77 3b 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ow; /* Do not al
0da0: 6c 6f 77 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  low memory alloc
0db0: 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  ation */..  /*. 
0dc0: 20 2a 2a 20 47 61 74 68 65 72 20 73 74 61 74 69   ** Gather stati
0dd0: 73 74 69 63 73 20 6f 6e 20 74 68 65 20 73 69 7a  stics on the siz
0de0: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  es of memory all
0df0: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 6e  ocations..  ** n
0e00: 41 6c 6c 6f 63 5b 69 5d 20 69 73 20 74 68 65 20  Alloc[i] is the 
0e10: 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61  number of alloca
0e20: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 6f 66  tion attempts of
0e30: 20 69 2a 38 0a 20 20 2a 2a 20 62 79 74 65 73 2e   i*8.  ** bytes.
0e40: 20 20 69 3d 3d 4e 43 53 49 5a 45 20 69 73 20 74    i==NCSIZE is t
0e50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c  he number of all
0e60: 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  ocation attempts
0e70: 20 66 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 73 20   for.  ** sizes 
0e80: 6d 6f 72 65 20 74 68 61 6e 20 4e 43 53 49 5a 45  more than NCSIZE
0e90: 2a 38 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20  *8 bytes..  */. 
0ea0: 20 69 6e 74 20 6e 41 6c 6c 6f 63 5b 4e 43 53 49   int nAlloc[NCSI
0eb0: 5a 45 5d 3b 20 20 20 20 20 20 2f 2a 20 54 6f 74  ZE];      /* Tot
0ec0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c  al number of all
0ed0: 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ocations */.  in
0ee0: 74 20 6e 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a  t nCurrent[NCSIZ
0ef0: 45 5d 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  E];    /* Curren
0f00: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f  t number of allo
0f10: 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  cations */.  int
0f20: 20 6d 78 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a   mxCurrent[NCSIZ
0f30: 45 5d 3b 20 20 20 2f 2a 20 48 69 67 68 77 61 74  E];   /* Highwat
0f40: 65 72 20 6d 61 72 6b 20 66 6f 72 20 6e 43 75 72  er mark for nCur
0f50: 72 65 6e 74 20 2a 2f 0a 0a 7d 20 6d 65 6d 3b 0a  rent */..} mem;.
0f60: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 6d  ../*.** Adjust m
0f70: 65 6d 6f 72 79 20 75 73 61 67 65 20 73 74 61 74  emory usage stat
0f80: 69 73 74 69 63 73 0a 2a 2f 0a 73 74 61 74 69 63  istics.*/.static
0f90: 20 76 6f 69 64 20 61 64 6a 75 73 74 53 74 61 74   void adjustStat
0fa0: 73 28 69 6e 74 20 69 53 69 7a 65 2c 20 69 6e 74  s(int iSize, int
0fb0: 20 69 6e 63 72 65 6d 65 6e 74 29 7b 0a 20 20 69   increment){.  i
0fc0: 6e 74 20 69 20 3d 20 28 28 69 53 69 7a 65 2b 37  nt i = ((iSize+7
0fd0: 29 26 7e 37 29 2f 38 3b 0a 20 20 69 66 28 20 69  )&~7)/8;.  if( i
0fe0: 3e 4e 43 53 49 5a 45 2d 31 20 29 7b 0a 20 20 20  >NCSIZE-1 ){.   
0ff0: 20 69 20 3d 20 4e 43 53 49 5a 45 20 2d 20 31 3b   i = NCSIZE - 1;
1000: 0a 20 20 7d 0a 20 20 69 66 28 20 69 6e 63 72 65  .  }.  if( incre
1010: 6d 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 6d 65  ment>0 ){.    me
1020: 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 2b 2b 3b 0a 20  m.nAlloc[i]++;. 
1030: 20 20 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b     mem.nCurrent[
1040: 69 5d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6d 65  i]++;.    if( me
1050: 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 5d 3e 6d 65  m.nCurrent[i]>me
1060: 6d 2e 6d 78 43 75 72 72 65 6e 74 5b 69 5d 20 29  m.mxCurrent[i] )
1070: 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 6d 78 43 75  {.      mem.mxCu
1080: 72 72 65 6e 74 5b 69 5d 20 3d 20 6d 65 6d 2e 6e  rrent[i] = mem.n
1090: 43 75 72 72 65 6e 74 5b 69 5d 3b 0a 20 20 20 20  Current[i];.    
10a0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  }.  }else{.    m
10b0: 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 5d 2d 2d  em.nCurrent[i]--
10c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
10d0: 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 5d 3e 3d 30  m.nCurrent[i]>=0
10e0: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
10f0: 20 47 69 76 65 6e 20 61 6e 20 61 6c 6c 6f 63 61   Given an alloca
1100: 74 69 6f 6e 2c 20 66 69 6e 64 20 74 68 65 20 4d  tion, find the M
1110: 65 6d 42 6c 6f 63 6b 48 64 72 20 66 6f 72 20 74  emBlockHdr for t
1120: 68 61 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  hat allocation..
1130: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1140: 6e 65 20 63 68 65 63 6b 73 20 74 68 65 20 67 75  ne checks the gu
1150: 61 72 64 73 20 61 74 20 65 69 74 68 65 72 20 65  ards at either e
1160: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
1170: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 69 66 20 74  tion and.** if t
1180: 68 65 79 20 61 72 65 20 69 6e 63 6f 72 72 65 63  hey are incorrec
1190: 74 20 69 74 20 61 73 73 65 72 74 73 2e 0a 2a 2f  t it asserts..*/
11a0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4d  .static struct M
11b0: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 73 71 6c 69  emBlockHdr *sqli
11c0: 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64  te3MemsysGetHead
11d0: 65 72 28 76 6f 69 64 20 2a 70 41 6c 6c 6f 63 61  er(void *pAlloca
11e0: 74 69 6f 6e 29 7b 0a 20 20 73 74 72 75 63 74 20  tion){.  struct 
11f0: 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 3b 0a  MemBlockHdr *p;.
1200: 20 20 69 6e 74 20 2a 70 49 6e 74 3b 0a 20 20 75    int *pInt;.  u
1210: 38 20 2a 70 55 38 3b 0a 20 20 69 6e 74 20 6e 52  8 *pU8;.  int nR
1220: 65 73 65 72 76 65 3b 0a 0a 20 20 70 20 3d 20 28  eserve;..  p = (
1230: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
1240: 64 72 2a 29 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b  dr*)pAllocation;
1250: 0a 20 20 70 2d 2d 3b 0a 20 20 61 73 73 65 72 74  .  p--;.  assert
1260: 28 20 70 2d 3e 69 46 6f 72 65 47 75 61 72 64 3d  ( p->iForeGuard=
1270: 3d 28 69 6e 74 29 46 4f 52 45 47 55 41 52 44 20  =(int)FOREGUARD 
1280: 29 3b 0a 20 20 6e 52 65 73 65 72 76 65 20 3d 20  );.  nReserve = 
1290: 28 70 2d 3e 69 53 69 7a 65 2b 37 29 26 7e 37 3b  (p->iSize+7)&~7;
12a0: 0a 20 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29  .  pInt = (int*)
12b0: 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20 20 70  pAllocation;.  p
12c0: 55 38 20 3d 20 28 75 38 2a 29 70 41 6c 6c 6f 63  U8 = (u8*)pAlloc
12d0: 61 74 69 6f 6e 3b 0a 20 20 61 73 73 65 72 74 28  ation;.  assert(
12e0: 20 70 49 6e 74 5b 6e 52 65 73 65 72 76 65 2f 73   pInt[nReserve/s
12f0: 69 7a 65 6f 66 28 69 6e 74 29 5d 3d 3d 28 69 6e  izeof(int)]==(in
1300: 74 29 52 45 41 52 47 55 41 52 44 20 29 3b 0a 20  t)REARGUARD );. 
1310: 20 2f 2a 20 54 68 69 73 20 63 68 65 63 6b 73 20   /* This checks 
1320: 61 6e 79 20 6f 66 20 74 68 65 20 22 65 78 74 72  any of the "extr
1330: 61 22 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  a" bytes allocat
1340: 65 64 20 64 75 65 0a 20 20 2a 2a 20 74 6f 20 72  ed due.  ** to r
1350: 6f 75 6e 64 69 6e 67 20 75 70 20 74 6f 20 61 6e  ounding up to an
1360: 20 38 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8 byte boundary
1370: 20 74 6f 20 65 6e 73 75 72 65 20 0a 20 20 2a 2a   to ensure .  **
1380: 20 74 68 65 79 20 68 61 76 65 6e 27 74 20 62 65   they haven't be
1390: 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  en overwritten..
13a0: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 52    */.  while( nR
13b0: 65 73 65 72 76 65 2d 2d 20 3e 20 70 2d 3e 69 53  eserve-- > p->iS
13c0: 69 7a 65 20 29 20 61 73 73 65 72 74 28 20 70 55  ize ) assert( pU
13d0: 38 5b 6e 52 65 73 65 72 76 65 5d 3d 3d 30 78 36  8[nReserve]==0x6
13e0: 35 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  5 );.  return p;
13f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1400: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1410: 79 74 65 73 20 63 75 72 72 65 6e 74 6c 79 20 61  ytes currently a
1420: 6c 6c 6f 63 61 74 65 64 20 61 74 20 61 64 64 72  llocated at addr
1430: 65 73 73 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  ess p..*/.static
1440: 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 53   int sqlite3MemS
1450: 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20  ize(void *p){.  
1460: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
1470: 64 72 20 2a 70 48 64 72 3b 0a 20 20 69 66 28 20  dr *pHdr;.  if( 
1480: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
1490: 20 30 3b 0a 20 20 7d 0a 20 20 70 48 64 72 20 3d   0;.  }.  pHdr =
14a0: 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65   sqlite3MemsysGe
14b0: 74 48 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65  tHeader(p);.  re
14c0: 74 75 72 6e 20 70 48 64 72 2d 3e 69 53 69 7a 65  turn pHdr->iSize
14d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
14e0: 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
14f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73   allocation subs
1500: 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  ystem..*/.static
1510: 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 49   int sqlite3MemI
1520: 6e 69 74 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65  nit(void *NotUse
1530: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
1540: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
1550: 0a 20 20 61 73 73 65 72 74 28 20 28 73 69 7a 65  .  assert( (size
1560: 6f 66 28 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  of(struct MemBlo
1570: 63 6b 48 64 72 29 26 37 29 20 3d 3d 20 30 20 29  ckHdr)&7) == 0 )
1580: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
1590: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
15a0: 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 2f 2a 20  mstat ){.    /* 
15b0: 49 66 20 6d 65 6d 6f 72 79 20 73 74 61 74 75 73  If memory status
15c0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
15d0: 6e 20 74 68 65 20 6d 61 6c 6c 6f 63 2e 63 20 77  n the malloc.c w
15e0: 72 61 70 70 65 72 20 77 69 6c 6c 20 61 6c 72 65  rapper will alre
15f0: 61 64 79 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 20  ady.    ** hold 
1600: 74 68 65 20 53 54 41 54 49 43 5f 4d 45 4d 20 6d  the STATIC_MEM m
1610: 75 74 65 78 20 77 68 65 6e 20 74 68 65 20 72 6f  utex when the ro
1620: 75 74 69 6e 65 73 20 68 65 72 65 20 61 72 65 20  utines here are 
1630: 69 6e 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 20 20  invoked. */.    
1640: 6d 65 6d 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69  mem.mutex = sqli
1650: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1660: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1670: 43 5f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 72 65  C_MEM);.  }.  re
1680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1690: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
16a0: 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
16b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73   allocation subs
16c0: 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  ystem..*/.static
16d0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d   void sqlite3Mem
16e0: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 4e  Shutdown(void *N
16f0: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
1700: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
1710: 73 65 64 29 3b 0a 20 20 6d 65 6d 2e 6d 75 74 65  sed);.  mem.mute
1720: 78 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = 0;.}../*.** 
1730: 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65  Round up a reque
1740: 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e  st size to the n
1750: 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61  ext valid alloca
1760: 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  tion size..*/.st
1770: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1780: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
1790: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 6e 2b 37  ){.  return (n+7
17a0: 29 20 26 20 7e 37 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ) & ~7;.}../*.**
17b0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
17c0: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e  bytes of memory.
17d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17e0: 2a 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f  *sqlite3MemMallo
17f0: 63 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  c(int nByte){.  
1800: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
1810: 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69 64  dr *pHdr;.  void
1820: 20 2a 2a 70 42 74 3b 0a 20 20 63 68 61 72 20 2a   **pBt;.  char *
1830: 7a 3b 0a 20 20 69 6e 74 20 2a 70 49 6e 74 3b 0a  z;.  int *pInt;.
1840: 20 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20    void *p = 0;. 
1850: 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 0a   int totalSize;.
1860: 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a    int nReserve;.
1870: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1880: 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29  enter(mem.mutex)
1890: 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e  ;.  assert( mem.
18a0: 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a 20  disallow==0 );. 
18b0: 20 6e 52 65 73 65 72 76 65 20 3d 20 28 6e 42 79   nReserve = (nBy
18c0: 74 65 2b 37 29 26 7e 37 3b 0a 20 20 74 6f 74 61  te+7)&~7;.  tota
18d0: 6c 53 69 7a 65 20 3d 20 6e 52 65 73 65 72 76 65  lSize = nReserve
18e0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 64 72 29   + sizeof(*pHdr)
18f0: 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b   + sizeof(int) +
1900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1910: 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2a 73  mem.nBacktrace*s
1920: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 6d  izeof(void*) + m
1930: 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 70 20 3d  em.nTitle;.  p =
1940: 20 6d 61 6c 6c 6f 63 28 74 6f 74 61 6c 53 69 7a   malloc(totalSiz
1950: 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  e);.  if( p ){. 
1960: 20 20 20 7a 20 3d 20 70 3b 0a 20 20 20 20 70 42     z = p;.    pB
1970: 74 20 3d 20 28 76 6f 69 64 2a 2a 29 26 7a 5b 6d  t = (void**)&z[m
1980: 65 6d 2e 6e 54 69 74 6c 65 5d 3b 0a 20 20 20 20  em.nTitle];.    
1990: 70 48 64 72 20 3d 20 28 73 74 72 75 63 74 20 4d  pHdr = (struct M
19a0: 65 6d 42 6c 6f 63 6b 48 64 72 2a 29 26 70 42 74  emBlockHdr*)&pBt
19b0: 5b 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 5d  [mem.nBacktrace]
19c0: 3b 0a 20 20 20 20 70 48 64 72 2d 3e 70 4e 65 78  ;.    pHdr->pNex
19d0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 48 64 72 2d  t = 0;.    pHdr-
19e0: 3e 70 50 72 65 76 20 3d 20 6d 65 6d 2e 70 4c 61  >pPrev = mem.pLa
19f0: 73 74 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e  st;.    if( mem.
1a00: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 6d  pLast ){.      m
1a10: 65 6d 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20  em.pLast->pNext 
1a20: 3d 20 70 48 64 72 3b 0a 20 20 20 20 7d 65 6c 73  = pHdr;.    }els
1a30: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 70 46 69  e{.      mem.pFi
1a40: 72 73 74 20 3d 20 70 48 64 72 3b 0a 20 20 20 20  rst = pHdr;.    
1a50: 7d 0a 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 20  }.    mem.pLast 
1a60: 3d 20 70 48 64 72 3b 0a 20 20 20 20 70 48 64 72  = pHdr;.    pHdr
1a70: 2d 3e 69 46 6f 72 65 47 75 61 72 64 20 3d 20 46  ->iForeGuard = F
1a80: 4f 52 45 47 55 41 52 44 3b 0a 20 20 20 20 70 48  OREGUARD;.    pH
1a90: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c  dr->nBacktraceSl
1aa0: 6f 74 73 20 3d 20 6d 65 6d 2e 6e 42 61 63 6b 74  ots = mem.nBackt
1ab0: 72 61 63 65 3b 0a 20 20 20 20 70 48 64 72 2d 3e  race;.    pHdr->
1ac0: 6e 54 69 74 6c 65 20 3d 20 6d 65 6d 2e 6e 54 69  nTitle = mem.nTi
1ad0: 74 6c 65 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  tle;.    if( mem
1ae0: 2e 6e 42 61 63 6b 74 72 61 63 65 20 29 7b 0a 20  .nBacktrace ){. 
1af0: 20 20 20 20 20 76 6f 69 64 20 2a 61 41 64 64 72       void *aAddr
1b00: 5b 34 30 5d 3b 0a 20 20 20 20 20 20 70 48 64 72  [40];.      pHdr
1b10: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 62  ->nBacktrace = b
1b20: 61 63 6b 74 72 61 63 65 28 61 41 64 64 72 2c 20  acktrace(aAddr, 
1b30: 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2b 31  mem.nBacktrace+1
1b40: 29 2d 31 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  )-1;.      memcp
1b50: 79 28 70 42 74 2c 20 26 61 41 64 64 72 5b 31 5d  y(pBt, &aAddr[1]
1b60: 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  , pHdr->nBacktra
1b70: 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29  ce*sizeof(void*)
1b80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  );.      if( mem
1b90: 2e 78 42 61 63 6b 74 72 61 63 65 20 29 7b 0a 20  .xBacktrace ){. 
1ba0: 20 20 20 20 20 20 20 6d 65 6d 2e 78 42 61 63 6b         mem.xBack
1bb0: 74 72 61 63 65 28 6e 42 79 74 65 2c 20 70 48 64  trace(nByte, pHd
1bc0: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2d 31 2c  r->nBacktrace-1,
1bd0: 20 26 61 41 64 64 72 5b 31 5d 29 3b 0a 20 20 20   &aAddr[1]);.   
1be0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1bf0: 20 20 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63        pHdr->nBac
1c00: 6b 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  ktrace = 0;.    
1c10: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 54  }.    if( mem.nT
1c20: 69 74 6c 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  itle ){.      me
1c30: 6d 63 70 79 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74  mcpy(z, mem.zTit
1c40: 6c 65 2c 20 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b  le, mem.nTitle);
1c50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 64 72 2d  .    }.    pHdr-
1c60: 3e 69 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  >iSize = nByte;.
1c70: 20 20 20 20 61 64 6a 75 73 74 53 74 61 74 73 28      adjustStats(
1c80: 6e 42 79 74 65 2c 20 2b 31 29 3b 0a 20 20 20 20  nByte, +1);.    
1c90: 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29 26 70 48  pInt = (int*)&pH
1ca0: 64 72 5b 31 5d 3b 0a 20 20 20 20 70 49 6e 74 5b  dr[1];.    pInt[
1cb0: 6e 52 65 73 65 72 76 65 2f 73 69 7a 65 6f 66 28  nReserve/sizeof(
1cc0: 69 6e 74 29 5d 20 3d 20 52 45 41 52 47 55 41 52  int)] = REARGUAR
1cd0: 44 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  D;.    memset(pI
1ce0: 6e 74 2c 20 30 78 36 35 2c 20 6e 52 65 73 65 72  nt, 0x65, nReser
1cf0: 76 65 29 3b 0a 20 20 20 20 70 20 3d 20 28 76 6f  ve);.    p = (vo
1d00: 69 64 2a 29 70 49 6e 74 3b 0a 20 20 7d 0a 20 20  id*)pInt;.  }.  
1d10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d20: 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ave(mem.mutex);.
1d30: 20 20 72 65 74 75 72 6e 20 70 3b 20 0a 7d 0a 0a    return p; .}..
1d40: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
1d50: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1d60: 64 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65 65  d sqlite3MemFree
1d70: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a  (void *pPrior){.
1d80: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
1d90: 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f  kHdr *pHdr;.  vo
1da0: 69 64 20 2a 2a 70 42 74 3b 0a 20 20 63 68 61 72  id **pBt;.  char
1db0: 20 2a 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *z;.  assert( s
1dc0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1dd0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 7c 7c 20 6d  ig.bMemstat || m
1de0: 65 6d 2e 6d 75 74 65 78 21 3d 30 20 29 3b 0a 20  em.mutex!=0 );. 
1df0: 20 70 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d   pHdr = sqlite3M
1e00: 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28 70  emsysGetHeader(p
1e10: 50 72 69 6f 72 29 3b 0a 20 20 70 42 74 20 3d 20  Prior);.  pBt = 
1e20: 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20  (void**)pHdr;.  
1e30: 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61  pBt -= pHdr->nBa
1e40: 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20  cktraceSlots;.  
1e50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1e60: 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ter(mem.mutex);.
1e70: 20 20 69 66 28 20 70 48 64 72 2d 3e 70 50 72 65    if( pHdr->pPre
1e80: 76 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  v ){.    assert(
1e90: 20 70 48 64 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pHdr->pPrev->pN
1ea0: 65 78 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20  ext==pHdr );.   
1eb0: 20 70 48 64 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pHdr->pPrev->pN
1ec0: 65 78 74 20 3d 20 70 48 64 72 2d 3e 70 4e 65 78  ext = pHdr->pNex
1ed0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1ee0: 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 46 69 72  assert( mem.pFir
1ef0: 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20  st==pHdr );.    
1f00: 6d 65 6d 2e 70 46 69 72 73 74 20 3d 20 70 48 64  mem.pFirst = pHd
1f10: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  r->pNext;.  }.  
1f20: 69 66 28 20 70 48 64 72 2d 3e 70 4e 65 78 74 20  if( pHdr->pNext 
1f30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f40: 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Hdr->pNext->pPre
1f50: 76 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 70  v==pHdr );.    p
1f60: 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Hdr->pNext->pPre
1f70: 76 20 3d 20 70 48 64 72 2d 3e 70 50 72 65 76 3b  v = pHdr->pPrev;
1f80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1f90: 73 65 72 74 28 20 6d 65 6d 2e 70 4c 61 73 74 3d  sert( mem.pLast=
1fa0: 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 6d 65 6d  =pHdr );.    mem
1fb0: 2e 70 4c 61 73 74 20 3d 20 70 48 64 72 2d 3e 70  .pLast = pHdr->p
1fc0: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  Prev;.  }.  z = 
1fd0: 28 63 68 61 72 2a 29 70 42 74 3b 0a 20 20 7a 20  (char*)pBt;.  z 
1fe0: 2d 3d 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 3b  -= pHdr->nTitle;
1ff0: 0a 20 20 61 64 6a 75 73 74 53 74 61 74 73 28 70  .  adjustStats(p
2000: 48 64 72 2d 3e 69 53 69 7a 65 2c 20 2d 31 29 3b  Hdr->iSize, -1);
2010: 0a 20 20 6d 65 6d 73 65 74 28 7a 2c 20 30 78 32  .  memset(z, 0x2
2020: 62 2c 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29  b, sizeof(void*)
2030: 2a 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63  *pHdr->nBacktrac
2040: 65 53 6c 6f 74 73 20 2b 20 73 69 7a 65 6f 66 28  eSlots + sizeof(
2050: 2a 70 48 64 72 29 20 2b 0a 20 20 20 20 20 20 20  *pHdr) +.       
2060: 20 20 20 20 20 20 20 20 20 20 20 70 48 64 72 2d             pHdr-
2070: 3e 69 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28  >iSize + sizeof(
2080: 69 6e 74 29 20 2b 20 70 48 64 72 2d 3e 6e 54 69  int) + pHdr->nTi
2090: 74 6c 65 29 3b 0a 20 20 66 72 65 65 28 7a 29 3b  tle);.  free(z);
20a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20b0: 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78  _leave(mem.mutex
20c0: 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  );  .}../*.** Ch
20d0: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
20e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
20f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ory allocation..
2100: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 64  **.** For this d
2110: 65 62 75 67 67 69 6e 67 20 69 6d 70 6c 65 6d 65  ebugging impleme
2120: 6e 74 61 74 69 6f 6e 2c 20 77 65 20 2a 61 6c 77  ntation, we *alw
2130: 61 79 73 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79  ays* make a copy
2140: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63   of the.** alloc
2150: 61 74 69 6f 6e 20 69 6e 74 6f 20 61 20 6e 65 77  ation into a new
2160: 20 70 6c 61 63 65 20 69 6e 20 6d 65 6d 6f 72 79   place in memory
2170: 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
2180: 69 66 20 74 68 65 20 0a 2a 2a 20 68 69 67 68 65  if the .** highe
2190: 72 20 6c 65 76 65 6c 20 63 6f 64 65 20 69 73 20  r level code is 
21a0: 75 73 69 6e 67 20 70 6f 69 6e 74 65 72 20 74 6f  using pointer to
21b0: 20 74 68 65 20 6f 6c 64 20 61 6c 6c 6f 63 61 74   the old allocat
21c0: 69 6f 6e 2c 20 69 74 20 69 73 20 0a 2a 2a 20 6d  ion, it is .** m
21d0: 75 63 68 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20  uch more likely 
21e0: 74 6f 20 62 72 65 61 6b 20 61 6e 64 20 77 65 20  to break and we 
21f0: 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 20 6c 69  are much more li
2200: 6b 69 6e 67 20 74 6f 20 66 69 6e 64 0a 2a 2a 20  king to find.** 
2210: 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  the error..*/.st
2220: 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74  atic void *sqlit
2230: 65 33 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  e3MemRealloc(voi
2240: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
2250: 42 79 74 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Byte){.  struct 
2260: 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 4f 6c  MemBlockHdr *pOl
2270: 64 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a 70 4e  dHdr;.  void *pN
2280: 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65  ew;.  assert( me
2290: 6d 2e 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b  m.disallow==0 );
22a0: 0a 20 20 70 4f 6c 64 48 64 72 20 3d 20 73 71 6c  .  pOldHdr = sql
22b0: 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61  ite3MemsysGetHea
22c0: 64 65 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70  der(pPrior);.  p
22d0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  New = sqlite3Mem
22e0: 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  Malloc(nByte);. 
22f0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2300: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 50   memcpy(pNew, pP
2310: 72 69 6f 72 2c 20 6e 42 79 74 65 3c 70 4f 6c 64  rior, nByte<pOld
2320: 48 64 72 2d 3e 69 53 69 7a 65 20 3f 20 6e 42 79  Hdr->iSize ? nBy
2330: 74 65 20 3a 20 70 4f 6c 64 48 64 72 2d 3e 69 53  te : pOldHdr->iS
2340: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  ize);.    if( nB
2350: 79 74 65 3e 70 4f 6c 64 48 64 72 2d 3e 69 53 69  yte>pOldHdr->iSi
2360: 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ze ){.      mems
2370: 65 74 28 26 28 28 63 68 61 72 2a 29 70 4e 65 77  et(&((char*)pNew
2380: 29 5b 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65  )[pOldHdr->iSize
2390: 5d 2c 20 30 78 32 62 2c 20 6e 42 79 74 65 20 2d  ], 0x2b, nByte -
23a0: 20 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 29   pOldHdr->iSize)
23b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23c0: 74 65 33 4d 65 6d 46 72 65 65 28 70 50 72 69 6f  te3MemFree(pPrio
23d0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
23e0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
23f0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
2400: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
2410: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
2420: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
2430: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2440: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
2450: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
2460: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
2470: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2480: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
2490: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
24a0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
24b0: 6d 5f 6d 65 74 68 6f 64 73 20 64 65 66 61 75 6c  m_methods defaul
24c0: 74 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  tMethods = {.   
24d0: 20 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c    sqlite3MemMall
24e0: 6f 63 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33  oc,.     sqlite3
24f0: 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 20 73 71  MemFree,.     sq
2500: 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c 6f 63 2c  lite3MemRealloc,
2510: 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d  .     sqlite3Mem
2520: 53 69 7a 65 2c 0a 20 20 20 20 20 73 71 6c 69 74  Size,.     sqlit
2530: 65 33 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  e3MemRoundup,.  
2540: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 49 6e 69     sqlite3MemIni
2550: 74 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d  t,.     sqlite3M
2560: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
2570: 20 30 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65   0.  };.  sqlite
2580: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
2590: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 26  CONFIG_MALLOC, &
25a0: 64 65 66 61 75 6c 74 4d 65 74 68 6f 64 73 29 3b  defaultMethods);
25b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
25c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 61 63 6b  e number of back
25d0: 74 72 61 63 65 20 6c 65 76 65 6c 73 20 6b 65 70  trace levels kep
25e0: 74 20 66 6f 72 20 65 61 63 68 20 61 6c 6c 6f 63  t for each alloc
25f0: 61 74 69 6f 6e 2e 0a 2a 2a 20 41 20 76 61 6c 75  ation..** A valu
2600: 65 20 6f 66 20 7a 65 72 6f 20 74 75 72 6e 73 20  e of zero turns 
2610: 6f 66 66 20 62 61 63 6b 74 72 61 63 69 6e 67 2e  off backtracing.
2620: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 69 73 20    The number is 
2630: 61 6c 77 61 79 73 20 72 6f 75 6e 64 65 64 0a 2a  always rounded.*
2640: 2a 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69 70  * up to a multip
2650: 6c 65 20 6f 66 20 32 2e 0a 2a 2f 0a 76 6f 69 64  le of 2..*/.void
2660: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
2670: 42 61 63 6b 74 72 61 63 65 28 69 6e 74 20 64 65  Backtrace(int de
2680: 70 74 68 29 7b 0a 20 20 69 66 28 20 64 65 70 74  pth){.  if( dept
2690: 68 3c 30 20 29 7b 20 64 65 70 74 68 20 3d 20 30  h<0 ){ depth = 0
26a0: 3b 20 7d 0a 20 20 69 66 28 20 64 65 70 74 68 3e  ; }.  if( depth>
26b0: 32 30 20 29 7b 20 64 65 70 74 68 20 3d 20 32 30  20 ){ depth = 20
26c0: 3b 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 28 64  ; }.  depth = (d
26d0: 65 70 74 68 2b 31 29 26 30 78 66 65 3b 0a 20 20  epth+1)&0xfe;.  
26e0: 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 20 3d  mem.nBacktrace =
26f0: 20 64 65 70 74 68 3b 0a 7d 0a 0a 76 6f 69 64 20   depth;.}..void 
2700: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42  sqlite3MemdebugB
2710: 61 63 6b 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  acktraceCallback
2720: 28 76 6f 69 64 20 28 2a 78 42 61 63 6b 74 72 61  (void (*xBacktra
2730: 63 65 29 28 69 6e 74 2c 20 69 6e 74 2c 20 76 6f  ce)(int, int, vo
2740: 69 64 20 2a 2a 29 29 7b 0a 20 20 6d 65 6d 2e 78  id **)){.  mem.x
2750: 42 61 63 6b 74 72 61 63 65 20 3d 20 78 42 61 63  Backtrace = xBac
2760: 6b 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ktrace;.}../*.**
2770: 20 53 65 74 20 74 68 65 20 74 69 74 6c 65 20 73   Set the title s
2780: 74 72 69 6e 67 20 66 6f 72 20 73 75 62 73 65 71  tring for subseq
2790: 75 65 6e 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  uent allocations
27a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27b0: 33 4d 65 6d 64 65 62 75 67 53 65 74 74 69 74 6c  3MemdebugSettitl
27c0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
27d0: 69 74 6c 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65  itle){.  unsigne
27e0: 64 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65  d int n = sqlite
27f0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 69 74 6c 65  3Strlen30(zTitle
2800: 29 20 2b 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  ) + 1;.  sqlite3
2810: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
2820: 2e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e  .mutex);.  if( n
2830: 3e 3d 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69  >=sizeof(mem.zTi
2840: 74 6c 65 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  tle) ) n = sizeo
2850: 66 28 6d 65 6d 2e 7a 54 69 74 6c 65 29 2d 31 3b  f(mem.zTitle)-1;
2860: 0a 20 20 6d 65 6d 63 70 79 28 6d 65 6d 2e 7a 54  .  memcpy(mem.zT
2870: 69 74 6c 65 2c 20 7a 54 69 74 6c 65 2c 20 6e 29  itle, zTitle, n)
2880: 3b 0a 20 20 6d 65 6d 2e 7a 54 69 74 6c 65 5b 6e  ;.  mem.zTitle[n
2890: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 2e 6e 54 69  ] = 0;.  mem.nTi
28a0: 74 6c 65 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a  tle = (n+7)&~7;.
28b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
28c0: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
28d0: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
28e0: 33 4d 65 6d 64 65 62 75 67 53 79 6e 63 28 29 7b  3MemdebugSync(){
28f0: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
2900: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 66  ckHdr *pHdr;.  f
2910: 6f 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46 69 72  or(pHdr=mem.pFir
2920: 73 74 3b 20 70 48 64 72 3b 20 70 48 64 72 3d 70  st; pHdr; pHdr=p
2930: 48 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Hdr->pNext){.   
2940: 20 76 6f 69 64 20 2a 2a 70 42 74 20 3d 20 28 76   void **pBt = (v
2950: 6f 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20 20 20  oid**)pHdr;.    
2960: 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61  pBt -= pHdr->nBa
2970: 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20  cktraceSlots;.  
2980: 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63 65    mem.xBacktrace
2990: 28 70 48 64 72 2d 3e 69 53 69 7a 65 2c 20 70 48  (pHdr->iSize, pH
29a0: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2d 31  dr->nBacktrace-1
29b0: 2c 20 26 70 42 74 5b 31 5d 29 3b 0a 20 20 7d 0a  , &pBt[1]);.  }.
29c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
29d0: 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64  e file indicated
29e0: 20 61 6e 64 20 77 72 69 74 65 20 61 20 6c 6f 67   and write a log
29f0: 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65 64 20   of all unfreed 
2a00: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 61 6c 6c 6f 63  memory .** alloc
2a10: 61 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68 61 74  ations into that
2a20: 20 6c 6f 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   log..*/.void sq
2a30: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 44 75 6d  lite3MemdebugDum
2a40: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  p(const char *zF
2a50: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 46 49 4c 45  ilename){.  FILE
2a60: 20 2a 6f 75 74 3b 0a 20 20 73 74 72 75 63 74 20   *out;.  struct 
2a70: 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64  MemBlockHdr *pHd
2a80: 72 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b  r;.  void **pBt;
2a90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 75 74 20  .  int i;.  out 
2aa0: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
2ab0: 65 2c 20 22 77 22 29 3b 0a 20 20 69 66 28 20 6f  e, "w");.  if( o
2ac0: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ut==0 ){.    fpr
2ad0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2a 2a  intf(stderr, "**
2ae0: 20 55 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70 75   Unable to outpu
2af0: 74 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 20 6f  t memory debug o
2b00: 75 74 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a 2a  utput log: %s **
2b10: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2b20: 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
2b30: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
2b40: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 48 64 72 3d  .  }.  for(pHdr=
2b50: 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48 64 72  mem.pFirst; pHdr
2b60: 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65  ; pHdr=pHdr->pNe
2b70: 78 74 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  xt){.    char *z
2b80: 20 3d 20 28 63 68 61 72 2a 29 70 48 64 72 3b 0a   = (char*)pHdr;.
2b90: 20 20 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e      z -= pHdr->n
2ba0: 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 2a 73  BacktraceSlots*s
2bb0: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 70  izeof(void*) + p
2bc0: 48 64 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20 20 20  Hdr->nTitle;.   
2bd0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2a   fprintf(out, "*
2be0: 2a 2a 2a 20 25 6c 6c 64 20 62 79 74 65 73 20 61  *** %lld bytes a
2bf0: 74 20 25 70 20 66 72 6f 6d 20 25 73 20 2a 2a 2a  t %p from %s ***
2c00: 2a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  *\n", .         
2c10: 20 20 20 70 48 64 72 2d 3e 69 53 69 7a 65 2c 20     pHdr->iSize, 
2c20: 26 70 48 64 72 5b 31 5d 2c 20 70 48 64 72 2d 3e  &pHdr[1], pHdr->
2c30: 6e 54 69 74 6c 65 20 3f 20 7a 20 3a 20 22 3f 3f  nTitle ? z : "??
2c40: 3f 22 29 3b 0a 20 20 20 20 69 66 28 20 70 48 64  ?");.    if( pHd
2c50: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20 29 7b  r->nBacktrace ){
2c60: 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28 6f 75  .      fflush(ou
2c70: 74 29 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20  t);.      pBt = 
2c80: 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20  (void**)pHdr;.  
2c90: 20 20 20 20 70 42 74 20 2d 3d 20 70 48 64 72 2d      pBt -= pHdr-
2ca0: 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73  >nBacktraceSlots
2cb0: 3b 0a 20 20 20 20 20 20 62 61 63 6b 74 72 61 63  ;.      backtrac
2cc0: 65 5f 73 79 6d 62 6f 6c 73 5f 66 64 28 70 42 74  e_symbols_fd(pBt
2cd0: 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  , pHdr->nBacktra
2ce0: 63 65 2c 20 66 69 6c 65 6e 6f 28 6f 75 74 29 29  ce, fileno(out))
2cf0: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
2d00: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
2d10: 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
2d20: 6f 75 74 2c 20 22 43 4f 55 4e 54 53 3a 5c 6e 22  out, "COUNTS:\n"
2d30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2d40: 4e 43 53 49 5a 45 2d 31 3b 20 69 2b 2b 29 7b 0a  NCSIZE-1; i++){.
2d50: 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c      if( mem.nAll
2d60: 6f 63 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 66  oc[i] ){.      f
2d70: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
2d80: 25 35 64 3a 20 25 31 30 64 20 25 31 30 64 20 25  %5d: %10d %10d %
2d90: 31 30 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  10d\n", .       
2da0: 20 20 20 20 20 69 2a 38 2c 20 6d 65 6d 2e 6e 41       i*8, mem.nA
2db0: 6c 6c 6f 63 5b 69 5d 2c 20 6d 65 6d 2e 6e 43 75  lloc[i], mem.nCu
2dc0: 72 72 65 6e 74 5b 69 5d 2c 20 6d 65 6d 2e 6d 78  rrent[i], mem.mx
2dd0: 43 75 72 72 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Current[i]);.   
2de0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d   }.  }.  if( mem
2df0: 2e 6e 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 2d 31  .nAlloc[NCSIZE-1
2e00: 5d 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ] ){.    fprintf
2e10: 28 6f 75 74 2c 20 22 20 20 20 25 35 64 3a 20 25  (out, "   %5d: %
2e20: 31 30 64 20 25 31 30 64 20 25 31 30 64 5c 6e 22  10d %10d %10d\n"
2e30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 4e  ,.             N
2e40: 43 53 49 5a 45 2a 38 2d 38 2c 20 6d 65 6d 2e 6e  CSIZE*8-8, mem.n
2e50: 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 2d 31 5d 2c  Alloc[NCSIZE-1],
2e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  .             me
2e70: 6d 2e 6e 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a  m.nCurrent[NCSIZ
2e80: 45 2d 31 5d 2c 20 6d 65 6d 2e 6d 78 43 75 72 72  E-1], mem.mxCurr
2e90: 65 6e 74 5b 4e 43 53 49 5a 45 2d 31 5d 29 3b 0a  ent[NCSIZE-1]);.
2ea0: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74    }.  fclose(out
2eb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2ec0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2ed0: 20 74 69 6d 65 73 20 73 71 6c 69 74 65 33 4d 65   times sqlite3Me
2ee0: 6d 4d 61 6c 6c 6f 63 28 29 20 68 61 73 20 62 65  mMalloc() has be
2ef0: 65 6e 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e  en called..*/.in
2f00: 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  t sqlite3Memdebu
2f10: 67 4d 61 6c 6c 6f 63 43 6f 75 6e 74 28 29 7b 0a  gMallocCount(){.
2f20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
2f30: 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 66 6f 72  Total = 0;.  for
2f40: 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45 3b 20  (i=0; i<NCSIZE; 
2f50: 69 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 74 61 6c  i++){.    nTotal
2f60: 20 2b 3d 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69   += mem.nAlloc[i
2f70: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
2f80: 6e 54 6f 74 61 6c 3b 0a 7d 0a 0a 0a 23 65 6e 64  nTotal;.}...#end
2f90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 45 4d  if /* SQLITE_MEM
2fa0: 44 45 42 55 47 20 2a 2f 0a                       DEBUG */.