/ Hex Artifact Content
Login

Artifact 23f9538f35fbcd5665afe7056a56be0c7ed65aa7:


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 33 33 20 32 30 30 38 2f 30 36 2f 31 39   1.33 2008/06/19
0360: 20 30 31 3a 30 33 3a 31 38 20 64 72 68 20 45 78   01:03:18 drh Ex
0370: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0380: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0390: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
03a0: 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  n of the memory 
03b0: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 75 73 65  allocator is use
03c0: 64 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a 2a  d only if the.**
03d0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
03e0: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
03f0: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
0400: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 0a 2f 2a 0a  TE_MEMDEBUG../*.
0410: 2a 2a 20 54 68 65 20 62 61 63 6b 74 72 61 63 65  ** The backtrace
0420: 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 69   functionality i
0430: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
0440: 20 77 69 74 68 20 47 4c 49 42 43 0a 2a 2f 0a 23   with GLIBC.*/.#
0450: 69 66 64 65 66 20 5f 5f 47 4c 49 42 43 5f 5f 0a  ifdef __GLIBC__.
0460: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 62 61 63    extern int bac
0470: 6b 74 72 61 63 65 28 76 6f 69 64 2a 2a 2c 69 6e  ktrace(void**,in
0480: 74 29 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69  t);.  extern voi
0490: 64 20 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62  d backtrace_symb
04a0: 6f 6c 73 5f 66 64 28 76 6f 69 64 2a 63 6f 6e 73  ols_fd(void*cons
04b0: 74 2a 2c 69 6e 74 2c 69 6e 74 29 3b 0a 23 65 6c  t*,int,int);.#el
04c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 62 61 63 6b  se.# define back
04d0: 74 72 61 63 65 28 41 2c 42 29 20 30 0a 23 20 64  trace(A,B) 0.# d
04e0: 65 66 69 6e 65 20 62 61 63 6b 74 72 61 63 65 5f  efine backtrace_
04f0: 73 79 6d 62 6f 6c 73 5f 66 64 28 41 2c 42 2c 43  symbols_fd(A,B,C
0500: 29 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64  ).#endif.#includ
0510: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 2f 2a 0a  e <stdio.h>../*.
0520: 2a 2a 20 45 61 63 68 20 6d 65 6d 6f 72 79 20 61  ** Each memory a
0530: 6c 6c 6f 63 61 74 69 6f 6e 20 6c 6f 6f 6b 73 20  llocation looks 
0540: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
0550: 20 20 2d 2d 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 0a 2a 2a 20 20 7c  ----------.**  |
05a0: 20 54 69 74 6c 65 20 7c 20 20 62 61 63 6b 74 72   Title |  backtr
05b0: 61 63 65 20 70 6f 69 6e 74 65 72 73 20 7c 20 20  ace pointers |  
05c0: 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 7c 20 20 61  MemBlockHdr |  a
05d0: 6c 6c 6f 63 61 74 69 6f 6e 20 7c 20 20 45 6e 64  llocation |  End
05e0: 47 75 61 72 64 20 7c 0a 2a 2a 20 20 2d 2d 2d 2d  Guard |.**  ----
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 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ----.**.** The a
0640: 70 70 6c 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  pplication code 
0650: 73 65 65 73 20 6f 6e 6c 79 20 61 20 70 6f 69 6e  sees only a poin
0660: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
0670: 61 74 69 6f 6e 2e 20 20 57 65 20 68 61 76 65 0a  ation.  We have.
0680: 2a 2a 20 74 6f 20 62 61 63 6b 20 75 70 20 66 72  ** to back up fr
0690: 6f 6d 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  om the allocatio
06a0: 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 66 69 6e  n pointer to fin
06b0: 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b 48 64  d the MemBlockHd
06c0: 72 2e 20 20 54 68 65 0a 2a 2a 20 4d 65 6d 42 6c  r.  The.** MemBl
06d0: 6f 63 6b 48 64 72 20 74 65 6c 6c 73 20 75 73 20  ockHdr tells us 
06e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
06f0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 74  allocation and t
0700: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
0710: 62 61 63 6b 74 72 61 63 65 20 70 6f 69 6e 74 65  backtrace pointe
0720: 72 73 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  rs.  There is al
0730: 73 6f 20 61 20 67 75 61 72 64 20 77 6f 72 64 20  so a guard word 
0740: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
0750: 65 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  e.** MemBlockHdr
0760: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65 6d 42  ..*/.struct MemB
0770: 6c 6f 63 6b 48 64 72 20 7b 0a 20 20 69 36 34 20  lockHdr {.  i64 
0780: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69 73 20  /* Size of this 
07b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
07c0: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
07d0: 64 72 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65  dr *pNext, *pPre
07e0: 76 3b 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69  v;  /* Linked li
07f0: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65  st of all unfree
0800: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 63 68  d memory */.  ch
0810: 61 72 20 6e 42 61 63 6b 74 72 61 63 65 3b 20 20  ar nBacktrace;  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
0840: 61 63 6b 74 72 61 63 65 73 20 6f 6e 20 74 68 69  acktraces on thi
0850: 73 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61  s alloc */.  cha
0860: 72 20 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74  r nBacktraceSlot
0870: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
0880: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 62 61   /* Available ba
0890: 63 6b 74 72 61 63 65 20 73 6c 6f 74 73 20 2a 2f  cktrace slots */
08a0: 0a 20 20 73 68 6f 72 74 20 6e 54 69 74 6c 65 3b  .  short nTitle;
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
08d0: 6f 66 20 74 69 74 6c 65 3b 20 69 6e 63 6c 75 64  of title; includ
08e0: 65 73 20 27 5c 30 27 20 2a 2f 0a 20 20 69 6e 74  es '\0' */.  int
08f0: 20 69 46 6f 72 65 47 75 61 72 64 3b 20 20 20 20   iForeGuard;    
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 2f 2a 20 47 75 61 72 64 20 77 6f 72 64 20 66   /* Guard word f
0920: 6f 72 20 73 61 6e 69 74 79 20 2a 2f 0a 7d 3b 0a  or sanity */.};.
0930: 0a 2f 2a 0a 2a 2a 20 47 75 61 72 64 20 77 6f 72  ./*.** Guard wor
0940: 64 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  ds.*/.#define FO
0950: 52 45 47 55 41 52 44 20 30 78 38 30 46 35 45 31  REGUARD 0x80F5E1
0960: 35 33 0a 23 64 65 66 69 6e 65 20 52 45 41 52 47  53.#define REARG
0970: 55 41 52 44 20 30 78 45 34 36 37 36 42 35 33 0a  UARD 0xE4676B53.
0980: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
0990: 20 6d 61 6c 6c 6f 63 20 73 69 7a 65 20 69 6e 63   malloc size inc
09a0: 72 65 6d 65 6e 74 73 20 74 6f 20 74 72 61 63 6b  rements to track
09b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 43 53  ..*/.#define NCS
09c0: 49 5a 45 20 20 31 30 30 30 0a 0a 2f 2a 0a 2a 2a  IZE  1000../*.**
09d0: 20 41 6c 6c 20 6f 66 20 74 68 65 20 73 74 61 74   All of the stat
09e0: 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73 65  ic variables use
09f0: 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
0a00: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 0a 2a   are collected.*
0a10: 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  * into a single 
0a20: 73 74 72 75 63 74 75 72 65 20 6e 61 6d 65 64 20  structure named 
0a30: 22 6d 65 6d 22 2e 20 20 54 68 69 73 20 69 73 20  "mem".  This is 
0a40: 74 6f 20 6b 65 65 70 20 74 68 65 0a 2a 2a 20 73  to keep the.** s
0a50: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20  tatic variables 
0a60: 6f 72 67 61 6e 69 7a 65 64 20 61 6e 64 20 74 6f  organized and to
0a70: 20 72 65 64 75 63 65 20 6e 61 6d 65 73 70 61 63   reduce namespac
0a80: 65 20 70 6f 6c 6c 75 74 69 6f 6e 0a 2a 2a 20 77  e pollution.** w
0a90: 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  hen this module 
0aa0: 69 73 20 63 6f 6d 62 69 6e 65 64 20 77 69 74 68  is combined with
0ab0: 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 61 6d   other in the am
0ac0: 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  algamation..*/.s
0ad0: 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
0ae0: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 75 74 65   .  /*.  ** Mute
0af0: 78 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  x to control acc
0b00: 65 73 73 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ess to the memor
0b10: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62  y allocation sub
0b20: 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 73  system..  */.  s
0b30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
0b40: 74 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  tex;..  /*.  ** 
0b50: 48 65 61 64 20 61 6e 64 20 74 61 69 6c 20 6f 66  Head and tail of
0b60: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
0b70: 66 20 61 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e  f all outstandin
0b80: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 20 20  g allocations.  
0b90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  */.  struct MemB
0ba0: 6c 6f 63 6b 48 64 72 20 2a 70 46 69 72 73 74 3b  lockHdr *pFirst;
0bb0: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
0bc0: 63 6b 48 64 72 20 2a 70 4c 61 73 74 3b 0a 20 20  ckHdr *pLast;.  
0bd0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6e  .  /*.  ** The n
0be0: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
0bf0: 6f 66 20 62 61 63 6b 74 72 61 63 65 20 74 6f 20  of backtrace to 
0c00: 73 61 76 65 20 69 6e 20 6e 65 77 20 61 6c 6c 6f  save in new allo
0c10: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
0c20: 69 6e 74 20 6e 42 61 63 6b 74 72 61 63 65 3b 0a  int nBacktrace;.
0c30: 20 20 76 6f 69 64 20 28 2a 78 42 61 63 6b 74 72    void (*xBacktr
0c40: 61 63 65 29 28 69 6e 74 2c 20 69 6e 74 2c 20 76  ace)(int, int, v
0c50: 6f 69 64 20 2a 2a 29 3b 0a 0a 20 20 2f 2a 0a 20  oid **);..  /*. 
0c60: 20 2a 2a 20 54 69 74 6c 65 20 74 65 78 74 20 74   ** Title text t
0c70: 6f 20 69 6e 73 65 72 74 20 69 6e 20 66 72 6f 6e  o insert in fron
0c80: 74 20 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 0a  t of each block.
0c90: 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 69 74 6c    */.  int nTitl
0ca0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74  e;        /* Byt
0cb0: 65 73 20 6f 66 20 7a 54 69 74 6c 65 20 74 6f 20  es of zTitle to 
0cc0: 73 61 76 65 2e 20 20 49 6e 63 6c 75 64 65 73 20  save.  Includes 
0cd0: 27 5c 30 27 20 61 6e 64 20 70 61 64 64 69 6e 67  '\0' and padding
0ce0: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 69 74 6c   */.  char zTitl
0cf0: 65 5b 31 30 30 5d 3b 20 20 2f 2a 20 54 68 65 20  e[100];  /* The 
0d00: 74 69 74 6c 65 20 74 65 78 74 20 2a 2f 0a 0a 20  title text */.. 
0d10: 20 2f 2a 20 0a 20 20 2a 2a 20 73 71 6c 69 74 65   /* .  ** sqlite
0d20: 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f 77 28  3MallocDisallow(
0d30: 29 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  ) increments the
0d40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6e 74   following count
0d50: 65 72 2e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  er..  ** sqlite3
0d60: 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 20 64 65  MallocAllow() de
0d70: 63 72 65 6d 65 6e 74 73 20 69 74 2e 0a 20 20 2a  crements it..  *
0d80: 2f 0a 20 20 69 6e 74 20 64 69 73 61 6c 6c 6f 77  /.  int disallow
0d90: 3b 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f  ; /* Do not allo
0da0: 77 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  w memory allocat
0db0: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ion */..  /*.  *
0dc0: 2a 20 47 61 74 68 65 72 20 73 74 61 74 69 73 74  * Gather statist
0dd0: 69 63 73 20 6f 6e 20 74 68 65 20 73 69 7a 65 73  ics on the sizes
0de0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   of memory alloc
0df0: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 73 69 7a  ations..  ** siz
0e00: 65 43 6e 74 5b 69 5d 20 69 73 20 74 68 65 20 6e  eCnt[i] is the n
0e10: 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74  umber of allocat
0e20: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 6f 66 20  ion attempts of 
0e30: 69 2a 38 0a 20 20 2a 2a 20 62 79 74 65 73 2e 20  i*8.  ** bytes. 
0e40: 20 69 3d 3d 4e 43 53 49 5a 45 20 69 73 20 74 68   i==NCSIZE is th
0e50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f  e number of allo
0e60: 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  cation attempts 
0e70: 66 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 73 20 6d  for.  ** sizes m
0e80: 6f 72 65 20 74 68 61 6e 20 4e 43 53 49 5a 45 2a  ore than NCSIZE*
0e90: 38 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20  8 bytes..  */.  
0ea0: 69 6e 74 20 73 69 7a 65 43 6e 74 5b 4e 43 53 49  int sizeCnt[NCSI
0eb0: 5a 45 5d 3b 0a 0a 7d 20 6d 65 6d 3b 0a 0a 2f 2a  ZE];..} mem;../*
0ec0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 61 6c 6c  .** Given an all
0ed0: 6f 63 61 74 69 6f 6e 2c 20 66 69 6e 64 20 74 68  ocation, find th
0ee0: 65 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 66 6f  e MemBlockHdr fo
0ef0: 72 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 69 6f  r that allocatio
0f00: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
0f10: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 65  utine checks the
0f20: 20 67 75 61 72 64 73 20 61 74 20 65 69 74 68 65   guards at eithe
0f30: 72 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c  r end of the all
0f40: 6f 63 61 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 69  ocation and.** i
0f50: 66 20 74 68 65 79 20 61 72 65 20 69 6e 63 6f 72  f they are incor
0f60: 72 65 63 74 20 69 74 20 61 73 73 65 72 74 73 2e  rect it asserts.
0f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
0f80: 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 73  t MemBlockHdr *s
0f90: 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48  qlite3MemsysGetH
0fa0: 65 61 64 65 72 28 76 6f 69 64 20 2a 70 41 6c 6c  eader(void *pAll
0fb0: 6f 63 61 74 69 6f 6e 29 7b 0a 20 20 73 74 72 75  ocation){.  stru
0fc0: 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a  ct MemBlockHdr *
0fd0: 70 3b 0a 20 20 69 6e 74 20 2a 70 49 6e 74 3b 0a  p;.  int *pInt;.
0fe0: 20 20 75 38 20 2a 70 55 38 3b 0a 20 20 69 6e 74    u8 *pU8;.  int
0ff0: 20 6e 52 65 73 65 72 76 65 3b 0a 0a 20 20 70 20   nReserve;..  p 
1000: 3d 20 28 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  = (struct MemBlo
1010: 63 6b 48 64 72 2a 29 70 41 6c 6c 6f 63 61 74 69  ckHdr*)pAllocati
1020: 6f 6e 3b 0a 20 20 70 2d 2d 3b 0a 20 20 61 73 73  on;.  p--;.  ass
1030: 65 72 74 28 20 70 2d 3e 69 46 6f 72 65 47 75 61  ert( p->iForeGua
1040: 72 64 3d 3d 46 4f 52 45 47 55 41 52 44 20 29 3b  rd==FOREGUARD );
1050: 0a 20 20 6e 52 65 73 65 72 76 65 20 3d 20 28 70  .  nReserve = (p
1060: 2d 3e 69 53 69 7a 65 2b 37 29 26 7e 37 3b 0a 20  ->iSize+7)&~7;. 
1070: 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29 70 41   pInt = (int*)pA
1080: 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20 20 70 55 38  llocation;.  pU8
1090: 20 3d 20 28 75 38 2a 29 70 41 6c 6c 6f 63 61 74   = (u8*)pAllocat
10a0: 69 6f 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ion;.  assert( p
10b0: 49 6e 74 5b 6e 52 65 73 65 72 76 65 2f 73 69 7a  Int[nReserve/siz
10c0: 65 6f 66 28 69 6e 74 29 5d 3d 3d 52 45 41 52 47  eof(int)]==REARG
10d0: 55 41 52 44 20 29 3b 0a 20 20 61 73 73 65 72 74  UARD );.  assert
10e0: 28 20 28 6e 52 65 73 65 72 76 65 2d 30 29 3c 3d  ( (nReserve-0)<=
10f0: 70 2d 3e 69 53 69 7a 65 20 7c 7c 20 70 55 38 5b  p->iSize || pU8[
1100: 6e 52 65 73 65 72 76 65 2d 31 5d 3d 3d 30 78 36  nReserve-1]==0x6
1110: 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  5 );.  assert( (
1120: 6e 52 65 73 65 72 76 65 2d 31 29 3c 3d 70 2d 3e  nReserve-1)<=p->
1130: 69 53 69 7a 65 20 7c 7c 20 70 55 38 5b 6e 52 65  iSize || pU8[nRe
1140: 73 65 72 76 65 2d 32 5d 3d 3d 30 78 36 35 20 29  serve-2]==0x65 )
1150: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 52 65  ;.  assert( (nRe
1160: 73 65 72 76 65 2d 32 29 3c 3d 70 2d 3e 69 53 69  serve-2)<=p->iSi
1170: 7a 65 20 7c 7c 20 70 55 38 5b 6e 52 65 73 65 72  ze || pU8[nReser
1180: 76 65 2d 33 5d 3d 3d 30 78 36 35 20 29 3b 0a 20  ve-3]==0x65 );. 
1190: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
11a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
11b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
11c0: 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74  urrently allocat
11d0: 65 64 20 61 74 20 61 64 64 72 65 73 73 20 70 2e  ed at address p.
11e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11f0: 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65 28 76 6f  qlite3MemSize(vo
1200: 69 64 20 2a 70 29 7b 0a 20 20 73 74 72 75 63 74  id *p){.  struct
1210: 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48   MemBlockHdr *pH
1220: 64 72 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  dr;.  if( !p ){.
1230: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1240: 7d 0a 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74  }.  pHdr = sqlit
1250: 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65  e3MemsysGetHeade
1260: 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  r(p);.  return p
1270: 48 64 72 2d 3e 69 53 69 7a 65 3b 0a 7d 0a 0a 2f  Hdr->iSize;.}../
1280: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1290: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
12a0: 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e  ation subsystem.
12b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12c0: 71 6c 69 74 65 33 4d 65 6d 49 6e 69 74 28 76 6f  qlite3MemInit(vo
12d0: 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  id *NotUsed){.  
12e0: 69 66 28 20 21 73 71 6c 69 74 65 33 43 6f 6e 66  if( !sqlite3Conf
12f0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20  ig.bMemstat ){. 
1300: 20 20 20 2f 2a 20 49 66 20 6d 65 6d 6f 72 79 20     /* If memory 
1310: 73 74 61 74 75 73 20 69 73 20 65 6e 61 62 6c 65  status is enable
1320: 64 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 6c 6c  d, then the mall
1330: 6f 63 2e 63 20 77 72 61 70 70 65 72 20 77 69 6c  oc.c wrapper wil
1340: 6c 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  l already.    **
1350: 20 68 6f 6c 64 20 74 68 65 20 53 54 41 54 49 43   hold the STATIC
1360: 5f 4d 45 4d 20 6d 75 74 65 78 20 77 68 65 6e 20  _MEM mutex when 
1370: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 68 65 72  the routines her
1380: 65 20 61 72 65 20 69 6e 76 6f 6b 65 64 2e 20 2a  e are invoked. *
1390: 2f 0a 20 20 20 20 6d 65 6d 2e 6d 75 74 65 78 20  /.    mem.mutex 
13a0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13c0: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20  _STATIC_MEM);.  
13d0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
13f0: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
1400: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1410: 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a  n subsystem..*/.
1420: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1430: 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  te3MemShutdown(v
1440: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  oid *NotUsed){. 
1450: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1460: 72 65 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ree(mem.mutex);.
1470: 20 20 6d 65 6d 2e 6d 75 74 65 78 20 3d 20 30 3b    mem.mutex = 0;
1480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20  .}../*.** Round 
1490: 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69 7a  up a request siz
14a0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  e to the next va
14b0: 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  lid allocation s
14c0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
14d0: 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 52 6f 75  nt sqlite3MemRou
14e0: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
14f0: 65 74 75 72 6e 20 28 6e 2b 37 29 20 26 20 7e 37  eturn (n+7) & ~7
1500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1510: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
1520: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  of memory..*/.st
1530: 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74  atic void *sqlit
1540: 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  e3MemMalloc(int 
1550: 6e 42 79 74 65 29 7b 0a 20 20 73 74 72 75 63 74  nByte){.  struct
1560: 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48   MemBlockHdr *pH
1570: 64 72 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74  dr;.  void **pBt
1580: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
1590: 6e 74 20 2a 70 49 6e 74 3b 0a 20 20 76 6f 69 64  nt *pInt;.  void
15a0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74   *p = 0;.  int t
15b0: 6f 74 61 6c 53 69 7a 65 3b 0a 20 20 69 6e 74 20  otalSize;.  int 
15c0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69  nReserve;.  sqli
15d0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15e0: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 61 73  mem.mutex);.  as
15f0: 73 65 72 74 28 20 6d 65 6d 2e 64 69 73 61 6c 6c  sert( mem.disall
1600: 6f 77 3d 3d 30 20 29 3b 0a 20 20 6e 52 65 73 65  ow==0 );.  nRese
1610: 72 76 65 20 3d 20 28 6e 42 79 74 65 2b 37 29 26  rve = (nByte+7)&
1620: 7e 37 3b 0a 20 20 69 66 28 20 6e 52 65 73 65 72  ~7;.  if( nReser
1630: 76 65 2f 38 3e 4e 43 53 49 5a 45 2d 31 20 29 7b  ve/8>NCSIZE-1 ){
1640: 0a 20 20 20 20 6d 65 6d 2e 73 69 7a 65 43 6e 74  .    mem.sizeCnt
1650: 5b 4e 43 53 49 5a 45 2d 31 5d 2b 2b 3b 0a 20 20  [NCSIZE-1]++;.  
1660: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 2e 73  }else{.    mem.s
1670: 69 7a 65 43 6e 74 5b 6e 52 65 73 65 72 76 65 2f  izeCnt[nReserve/
1680: 38 5d 2b 2b 3b 0a 20 20 7d 0a 20 20 74 6f 74 61  8]++;.  }.  tota
1690: 6c 53 69 7a 65 20 3d 20 6e 52 65 73 65 72 76 65  lSize = nReserve
16a0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 64 72 29   + sizeof(*pHdr)
16b0: 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b   + sizeof(int) +
16c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16d0: 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2a 73  mem.nBacktrace*s
16e0: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 6d  izeof(void*) + m
16f0: 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 70 20 3d  em.nTitle;.  p =
1700: 20 6d 61 6c 6c 6f 63 28 74 6f 74 61 6c 53 69 7a   malloc(totalSiz
1710: 65 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  e);.  if( p ){. 
1720: 20 20 20 7a 20 3d 20 70 3b 0a 20 20 20 20 70 42     z = p;.    pB
1730: 74 20 3d 20 28 76 6f 69 64 2a 2a 29 26 7a 5b 6d  t = (void**)&z[m
1740: 65 6d 2e 6e 54 69 74 6c 65 5d 3b 0a 20 20 20 20  em.nTitle];.    
1750: 70 48 64 72 20 3d 20 28 73 74 72 75 63 74 20 4d  pHdr = (struct M
1760: 65 6d 42 6c 6f 63 6b 48 64 72 2a 29 26 70 42 74  emBlockHdr*)&pBt
1770: 5b 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 5d  [mem.nBacktrace]
1780: 3b 0a 20 20 20 20 70 48 64 72 2d 3e 70 4e 65 78  ;.    pHdr->pNex
1790: 74 20 3d 20 30 3b 0a 20 20 20 20 70 48 64 72 2d  t = 0;.    pHdr-
17a0: 3e 70 50 72 65 76 20 3d 20 6d 65 6d 2e 70 4c 61  >pPrev = mem.pLa
17b0: 73 74 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e  st;.    if( mem.
17c0: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 6d  pLast ){.      m
17d0: 65 6d 2e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20  em.pLast->pNext 
17e0: 3d 20 70 48 64 72 3b 0a 20 20 20 20 7d 65 6c 73  = pHdr;.    }els
17f0: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 70 46 69  e{.      mem.pFi
1800: 72 73 74 20 3d 20 70 48 64 72 3b 0a 20 20 20 20  rst = pHdr;.    
1810: 7d 0a 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 20  }.    mem.pLast 
1820: 3d 20 70 48 64 72 3b 0a 20 20 20 20 70 48 64 72  = pHdr;.    pHdr
1830: 2d 3e 69 46 6f 72 65 47 75 61 72 64 20 3d 20 46  ->iForeGuard = F
1840: 4f 52 45 47 55 41 52 44 3b 0a 20 20 20 20 70 48  OREGUARD;.    pH
1850: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c  dr->nBacktraceSl
1860: 6f 74 73 20 3d 20 6d 65 6d 2e 6e 42 61 63 6b 74  ots = mem.nBackt
1870: 72 61 63 65 3b 0a 20 20 20 20 70 48 64 72 2d 3e  race;.    pHdr->
1880: 6e 54 69 74 6c 65 20 3d 20 6d 65 6d 2e 6e 54 69  nTitle = mem.nTi
1890: 74 6c 65 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  tle;.    if( mem
18a0: 2e 6e 42 61 63 6b 74 72 61 63 65 20 29 7b 0a 20  .nBacktrace ){. 
18b0: 20 20 20 20 20 76 6f 69 64 20 2a 61 41 64 64 72       void *aAddr
18c0: 5b 34 30 5d 3b 0a 20 20 20 20 20 20 70 48 64 72  [40];.      pHdr
18d0: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 62  ->nBacktrace = b
18e0: 61 63 6b 74 72 61 63 65 28 61 41 64 64 72 2c 20  acktrace(aAddr, 
18f0: 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2b 31  mem.nBacktrace+1
1900: 29 2d 31 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  )-1;.      memcp
1910: 79 28 70 42 74 2c 20 26 61 41 64 64 72 5b 31 5d  y(pBt, &aAddr[1]
1920: 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  , pHdr->nBacktra
1930: 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29  ce*sizeof(void*)
1940: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  );.      if( mem
1950: 2e 78 42 61 63 6b 74 72 61 63 65 20 29 7b 0a 20  .xBacktrace ){. 
1960: 20 20 20 20 20 20 20 6d 65 6d 2e 78 42 61 63 6b         mem.xBack
1970: 74 72 61 63 65 28 6e 42 79 74 65 2c 20 70 48 64  trace(nByte, pHd
1980: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2d 31 2c  r->nBacktrace-1,
1990: 20 26 61 41 64 64 72 5b 31 5d 29 3b 0a 20 20 20   &aAddr[1]);.   
19a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
19b0: 20 20 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63        pHdr->nBac
19c0: 6b 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  ktrace = 0;.    
19d0: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 54  }.    if( mem.nT
19e0: 69 74 6c 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  itle ){.      me
19f0: 6d 63 70 79 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74  mcpy(z, mem.zTit
1a00: 6c 65 2c 20 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b  le, mem.nTitle);
1a10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 64 72 2d  .    }.    pHdr-
1a20: 3e 69 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  >iSize = nByte;.
1a30: 20 20 20 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a      pInt = (int*
1a40: 29 26 70 48 64 72 5b 31 5d 3b 0a 20 20 20 20 70  )&pHdr[1];.    p
1a50: 49 6e 74 5b 6e 52 65 73 65 72 76 65 2f 73 69 7a  Int[nReserve/siz
1a60: 65 6f 66 28 69 6e 74 29 5d 20 3d 20 52 45 41 52  eof(int)] = REAR
1a70: 47 55 41 52 44 3b 0a 20 20 20 20 6d 65 6d 73 65  GUARD;.    memse
1a80: 74 28 70 49 6e 74 2c 20 30 78 36 35 2c 20 6e 52  t(pInt, 0x65, nR
1a90: 65 73 65 72 76 65 29 3b 0a 20 20 20 20 70 20 3d  eserve);.    p =
1aa0: 20 28 76 6f 69 64 2a 29 70 49 6e 74 3b 0a 20 20   (void*)pInt;.  
1ab0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1ac0: 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65  x_leave(mem.mute
1ad0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 20  x);.  return p; 
1ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
1af0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
1b00: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d   void sqlite3Mem
1b10: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
1b20: 72 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  r){.  struct Mem
1b30: 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a  BlockHdr *pHdr;.
1b40: 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20    void **pBt;.  
1b50: 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73 65 72  char *z;.  asser
1b60: 74 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  t( sqlite3Config
1b70: 2e 62 4d 65 6d 73 74 61 74 20 7c 7c 20 6d 65 6d  .bMemstat || mem
1b80: 2e 6d 75 74 65 78 21 3d 30 20 29 3b 0a 20 20 70  .mutex!=0 );.  p
1b90: 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  Hdr = sqlite3Mem
1ba0: 73 79 73 47 65 74 48 65 61 64 65 72 28 70 50 72  sysGetHeader(pPr
1bb0: 69 6f 72 29 3b 0a 20 20 70 42 74 20 3d 20 28 76  ior);.  pBt = (v
1bc0: 6f 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20 70 42  oid**)pHdr;.  pB
1bd0: 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b  t -= pHdr->nBack
1be0: 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20 73 71  traceSlots;.  sq
1bf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c00: 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20  r(mem.mutex);.  
1c10: 69 66 28 20 70 48 64 72 2d 3e 70 50 72 65 76 20  if( pHdr->pPrev 
1c20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c30: 48 64 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Hdr->pPrev->pNex
1c40: 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 70  t==pHdr );.    p
1c50: 48 64 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Hdr->pPrev->pNex
1c60: 74 20 3d 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b  t = pHdr->pNext;
1c70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1c80: 73 65 72 74 28 20 6d 65 6d 2e 70 46 69 72 73 74  sert( mem.pFirst
1c90: 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 6d 65  ==pHdr );.    me
1ca0: 6d 2e 70 46 69 72 73 74 20 3d 20 70 48 64 72 2d  m.pFirst = pHdr-
1cb0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
1cc0: 28 20 70 48 64 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pHdr->pNext ){
1cd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 64  .    assert( pHd
1ce0: 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  r->pNext->pPrev=
1cf0: 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 70 48 64  =pHdr );.    pHd
1d00: 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1d10: 3d 20 70 48 64 72 2d 3e 70 50 72 65 76 3b 0a 20  = pHdr->pPrev;. 
1d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1d30: 72 74 28 20 6d 65 6d 2e 70 4c 61 73 74 3d 3d 70  rt( mem.pLast==p
1d40: 48 64 72 20 29 3b 0a 20 20 20 20 6d 65 6d 2e 70  Hdr );.    mem.p
1d50: 4c 61 73 74 20 3d 20 70 48 64 72 2d 3e 70 50 72  Last = pHdr->pPr
1d60: 65 76 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ev;.  }.  z = (c
1d70: 68 61 72 2a 29 70 42 74 3b 0a 20 20 7a 20 2d 3d  har*)pBt;.  z -=
1d80: 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20   pHdr->nTitle;. 
1d90: 20 6d 65 6d 73 65 74 28 7a 2c 20 30 78 32 62 2c   memset(z, 0x2b,
1da0: 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 2a 70   sizeof(void*)*p
1db0: 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53  Hdr->nBacktraceS
1dc0: 6c 6f 74 73 20 2b 20 73 69 7a 65 6f 66 28 2a 70  lots + sizeof(*p
1dd0: 48 64 72 29 20 2b 0a 20 20 20 20 20 20 20 20 20  Hdr) +.         
1de0: 20 20 20 20 20 20 20 20 20 70 48 64 72 2d 3e 69           pHdr->i
1df0: 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28 69 6e  Size + sizeof(in
1e00: 74 29 20 2b 20 70 48 64 72 2d 3e 6e 54 69 74 6c  t) + pHdr->nTitl
1e10: 65 29 3b 0a 20 20 66 72 65 65 28 7a 29 3b 0a 20  e);.  free(z);. 
1e20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1e30: 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b  eave(mem.mutex);
1e40: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e    .}../*.** Chan
1e50: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  ge the size of a
1e60: 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72  n existing memor
1e70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  y allocation..**
1e80: 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 64 65 62  .** For this deb
1e90: 75 67 67 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ugging implement
1ea0: 61 74 69 6f 6e 2c 20 77 65 20 2a 61 6c 77 61 79  ation, we *alway
1eb0: 73 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  s* make a copy o
1ec0: 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  f the.** allocat
1ed0: 69 6f 6e 20 69 6e 74 6f 20 61 20 6e 65 77 20 70  ion into a new p
1ee0: 6c 61 63 65 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  lace in memory. 
1ef0: 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66   In this way, if
1f00: 20 74 68 65 20 0a 2a 2a 20 68 69 67 68 65 72 20   the .** higher 
1f10: 6c 65 76 65 6c 20 63 6f 64 65 20 69 73 20 75 73  level code is us
1f20: 69 6e 67 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ing pointer to t
1f30: 68 65 20 6f 6c 64 20 61 6c 6c 6f 63 61 74 69 6f  he old allocatio
1f40: 6e 2c 20 69 74 20 69 73 20 0a 2a 2a 20 6d 75 63  n, it is .** muc
1f50: 68 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f  h more likely to
1f60: 20 62 72 65 61 6b 20 61 6e 64 20 77 65 20 61 72   break and we ar
1f70: 65 20 6d 75 63 68 20 6d 6f 72 65 20 6c 69 6b 69  e much more liki
1f80: 6e 67 20 74 6f 20 66 69 6e 64 0a 2a 2a 20 74 68  ng to find.** th
1f90: 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  e error..*/.stat
1fa0: 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ic void *sqlite3
1fb0: 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  MemRealloc(void 
1fc0: 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79  *pPrior, int nBy
1fd0: 74 65 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65  te){.  struct Me
1fe0: 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 4f 6c 64 48  mBlockHdr *pOldH
1ff0: 64 72 3b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77  dr;.  void *pNew
2000: 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e  ;.  assert( mem.
2010: 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a 20  disallow==0 );. 
2020: 20 70 4f 6c 64 48 64 72 20 3d 20 73 71 6c 69 74   pOldHdr = sqlit
2030: 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65  e3MemsysGetHeade
2040: 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65  r(pPrior);.  pNe
2050: 77 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61  w = sqlite3MemMa
2060: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69  lloc(nByte);.  i
2070: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d  f( pNew ){.    m
2080: 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 50 72 69  emcpy(pNew, pPri
2090: 6f 72 2c 20 6e 42 79 74 65 3c 70 4f 6c 64 48 64  or, nByte<pOldHd
20a0: 72 2d 3e 69 53 69 7a 65 20 3f 20 6e 42 79 74 65  r->iSize ? nByte
20b0: 20 3a 20 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a   : pOldHdr->iSiz
20c0: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
20d0: 65 3e 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65  e>pOldHdr->iSize
20e0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
20f0: 28 26 28 28 63 68 61 72 2a 29 70 4e 65 77 29 5b  (&((char*)pNew)[
2100: 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 5d 2c  pOldHdr->iSize],
2110: 20 30 78 32 62 2c 20 6e 42 79 74 65 20 2d 20 70   0x2b, nByte - p
2120: 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a  OldHdr->iSize);.
2130: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2140: 33 4d 65 6d 46 72 65 65 28 70 50 72 69 6f 72 29  3MemFree(pPrior)
2150: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2160: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50  New;.}.../*.** P
2170: 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d  opulate the low-
2180: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
2190: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
21a0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20   pointers in.** 
21b0: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6d 20  sqlite3Config.m 
21c0: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
21d0: 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e   the routines in
21e0: 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a 76   this file..*/.v
21f0: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
2200: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
2210: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2220: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
2230: 64 73 20 64 65 66 61 75 6c 74 4d 65 74 68 6f 64  ds defaultMethod
2240: 73 20 3d 20 7b 0a 20 20 20 20 20 73 71 6c 69 74  s = {.     sqlit
2250: 65 33 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20  e3MemMalloc,.   
2260: 20 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65 65    sqlite3MemFree
2270: 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  ,.     sqlite3Me
2280: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 20 73  mRealloc,.     s
2290: 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65 2c 0a 20  qlite3MemSize,. 
22a0: 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 52 6f      sqlite3MemRo
22b0: 75 6e 64 75 70 2c 0a 20 20 20 20 20 73 71 6c 69  undup,.     sqli
22c0: 74 65 33 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20  te3MemInit,.    
22d0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 68 75 74 64   sqlite3MemShutd
22e0: 6f 77 6e 2c 0a 20 20 20 20 20 30 0a 20 20 7d 3b  own,.     0.  };
22f0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
2300: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
2310: 4d 41 4c 4c 4f 43 2c 20 26 64 65 66 61 75 6c 74  MALLOC, &default
2320: 4d 65 74 68 6f 64 73 29 3b 0a 7d 0a 0a 2f 2a 0a  Methods);.}../*.
2330: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
2340: 72 20 6f 66 20 62 61 63 6b 74 72 61 63 65 20 6c  r of backtrace l
2350: 65 76 65 6c 73 20 6b 65 70 74 20 66 6f 72 20 65  evels kept for e
2360: 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ach allocation..
2370: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 7a 65  ** A value of ze
2380: 72 6f 20 74 75 72 6e 73 20 6f 66 66 20 62 61 63  ro turns off bac
2390: 6b 74 72 61 63 69 6e 67 2e 20 20 54 68 65 20 6e  ktracing.  The n
23a0: 75 6d 62 65 72 20 69 73 20 61 6c 77 61 79 73 20  umber is always 
23b0: 72 6f 75 6e 64 65 64 0a 2a 2a 20 75 70 20 74 6f  rounded.** up to
23c0: 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32   a multiple of 2
23d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23e0: 33 4d 65 6d 64 65 62 75 67 42 61 63 6b 74 72 61  3MemdebugBacktra
23f0: 63 65 28 69 6e 74 20 64 65 70 74 68 29 7b 0a 20  ce(int depth){. 
2400: 20 69 66 28 20 64 65 70 74 68 3c 30 20 29 7b 20   if( depth<0 ){ 
2410: 64 65 70 74 68 20 3d 20 30 3b 20 7d 0a 20 20 69  depth = 0; }.  i
2420: 66 28 20 64 65 70 74 68 3e 32 30 20 29 7b 20 64  f( depth>20 ){ d
2430: 65 70 74 68 20 3d 20 32 30 3b 20 7d 0a 20 20 64  epth = 20; }.  d
2440: 65 70 74 68 20 3d 20 28 64 65 70 74 68 2b 31 29  epth = (depth+1)
2450: 26 30 78 66 65 3b 0a 20 20 6d 65 6d 2e 6e 42 61  &0xfe;.  mem.nBa
2460: 63 6b 74 72 61 63 65 20 3d 20 64 65 70 74 68 3b  cktrace = depth;
2470: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
2480: 4d 65 6d 64 65 62 75 67 42 61 63 6b 74 72 61 63  MemdebugBacktrac
2490: 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 28  eCallback(void (
24a0: 2a 78 42 61 63 6b 74 72 61 63 65 29 28 69 6e 74  *xBacktrace)(int
24b0: 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 29  , int, void **))
24c0: 7b 0a 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61  {.  mem.xBacktra
24d0: 63 65 20 3d 20 78 42 61 63 6b 74 72 61 63 65 3b  ce = xBacktrace;
24e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
24f0: 65 20 74 69 74 6c 65 20 73 74 72 69 6e 67 20 66  e title string f
2500: 6f 72 20 73 75 62 73 65 71 75 65 6e 74 20 61 6c  or subsequent al
2510: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  locations..*/.vo
2520: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  id sqlite3Memdeb
2530: 75 67 53 65 74 74 69 74 6c 65 28 63 6f 6e 73 74  ugSettitle(const
2540: 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 29 7b 0a   char *zTitle){.
2550: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
2560: 28 7a 54 69 74 6c 65 29 20 2b 20 31 3b 0a 20 20  (zTitle) + 1;.  
2570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2580: 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ter(mem.mutex);.
2590: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
25a0: 6d 65 6d 2e 7a 54 69 74 6c 65 29 20 29 20 6e 20  mem.zTitle) ) n 
25b0: 3d 20 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69  = sizeof(mem.zTi
25c0: 74 6c 65 29 2d 31 3b 0a 20 20 6d 65 6d 63 70 79  tle)-1;.  memcpy
25d0: 28 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 7a 54 69  (mem.zTitle, zTi
25e0: 74 6c 65 2c 20 6e 29 3b 0a 20 20 6d 65 6d 2e 7a  tle, n);.  mem.z
25f0: 54 69 74 6c 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  Title[n] = 0;.  
2600: 6d 65 6d 2e 6e 54 69 74 6c 65 20 3d 20 28 6e 2b  mem.nTitle = (n+
2610: 37 29 26 7e 37 3b 0a 20 20 73 71 6c 69 74 65 33  7)&~7;.  sqlite3
2620: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2630: 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 76 6f 69 64  .mutex);.}..void
2640: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
2650: 53 79 6e 63 28 29 7b 0a 20 20 73 74 72 75 63 74  Sync(){.  struct
2660: 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48   MemBlockHdr *pH
2670: 64 72 3b 0a 20 20 66 6f 72 28 70 48 64 72 3d 6d  dr;.  for(pHdr=m
2680: 65 6d 2e 70 46 69 72 73 74 3b 20 70 48 64 72 3b  em.pFirst; pHdr;
2690: 20 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65 78   pHdr=pHdr->pNex
26a0: 74 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 70  t){.    void **p
26b0: 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48 64  Bt = (void**)pHd
26c0: 72 3b 0a 20 20 20 20 70 42 74 20 2d 3d 20 70 48  r;.    pBt -= pH
26d0: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c  dr->nBacktraceSl
26e0: 6f 74 73 3b 0a 20 20 20 20 6d 65 6d 2e 78 42 61  ots;.    mem.xBa
26f0: 63 6b 74 72 61 63 65 28 70 48 64 72 2d 3e 69 53  cktrace(pHdr->iS
2700: 69 7a 65 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b  ize, pHdr->nBack
2710: 74 72 61 63 65 2d 31 2c 20 26 70 42 74 5b 31 5d  trace-1, &pBt[1]
2720: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2730: 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 69 6e  Open the file in
2740: 64 69 63 61 74 65 64 20 61 6e 64 20 77 72 69 74  dicated and writ
2750: 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c 6c 20 75  e a log of all u
2760: 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 0a 2a  nfreed memory .*
2770: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  * allocations in
2780: 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a 2a 2f 0a  to that log..*/.
2790: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64  void sqlite3Memd
27a0: 65 62 75 67 44 75 6d 70 28 63 6f 6e 73 74 20 63  ebugDump(const c
27b0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
27c0: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
27d0: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
27e0: 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69 64  dr *pHdr;.  void
27f0: 20 2a 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 3b   **pBt;.  int i;
2800: 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a  .  out = fopen(z
2810: 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22 29 3b 0a  Filename, "w");.
2820: 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
2830: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
2840: 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c 65 20 74  rr, "** Unable t
2850: 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 79 20  o output memory 
2860: 64 65 62 75 67 20 6f 75 74 70 75 74 20 6c 6f 67  debug output log
2870: 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0a 20 20 20 20  : %s **\n",.    
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
28a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
28b0: 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46 69 72 73  r(pHdr=mem.pFirs
28c0: 74 3b 20 70 48 64 72 3b 20 70 48 64 72 3d 70 48  t; pHdr; pHdr=pH
28d0: 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dr->pNext){.    
28e0: 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a  char *z = (char*
28f0: 29 70 48 64 72 3b 0a 20 20 20 20 7a 20 2d 3d 20  )pHdr;.    z -= 
2900: 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65  pHdr->nBacktrace
2910: 53 6c 6f 74 73 2a 73 69 7a 65 6f 66 28 76 6f 69  Slots*sizeof(voi
2920: 64 2a 29 20 2b 20 70 48 64 72 2d 3e 6e 54 69 74  d*) + pHdr->nTit
2930: 6c 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  le;.    fprintf(
2940: 6f 75 74 2c 20 22 2a 2a 2a 2a 20 25 6c 6c 64 20  out, "**** %lld 
2950: 62 79 74 65 73 20 61 74 20 25 70 20 66 72 6f 6d  bytes at %p from
2960: 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 20 0a 20 20   %s ****\n", .  
2970: 20 20 20 20 20 20 20 20 20 20 70 48 64 72 2d 3e            pHdr->
2980: 69 53 69 7a 65 2c 20 26 70 48 64 72 5b 31 5d 2c  iSize, &pHdr[1],
2990: 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3f 20   pHdr->nTitle ? 
29a0: 7a 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20 20 20 20  z : "???");.    
29b0: 69 66 28 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74  if( pHdr->nBackt
29c0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66 66  race ){.      ff
29d0: 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20 20 20 20  lush(out);.     
29e0: 20 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70   pBt = (void**)p
29f0: 48 64 72 3b 0a 20 20 20 20 20 20 70 42 74 20 2d  Hdr;.      pBt -
2a00: 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  = pHdr->nBacktra
2a10: 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20 20 20 62  ceSlots;.      b
2a20: 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73  acktrace_symbols
2a30: 5f 66 64 28 70 42 74 2c 20 70 48 64 72 2d 3e 6e  _fd(pBt, pHdr->n
2a40: 42 61 63 6b 74 72 61 63 65 2c 20 66 69 6c 65 6e  Backtrace, filen
2a50: 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20 20 20 66  o(out));.      f
2a60: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
2a70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
2a80: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 4f 55  printf(out, "COU
2a90: 4e 54 53 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28  NTS:\n");.  for(
2aa0: 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45 2d 31 3b  i=0; i<NCSIZE-1;
2ab0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6d   i++){.    if( m
2ac0: 65 6d 2e 73 69 7a 65 43 6e 74 5b 69 5d 20 29 7b  em.sizeCnt[i] ){
2ad0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
2ae0: 75 74 2c 20 22 20 20 20 25 33 64 3a 20 25 64 5c  ut, "   %3d: %d\
2af0: 6e 22 2c 20 69 2a 38 2b 38 2c 20 6d 65 6d 2e 73  n", i*8+8, mem.s
2b00: 69 7a 65 43 6e 74 5b 69 5d 29 3b 0a 20 20 20 20  izeCnt[i]);.    
2b10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 2e  }.  }.  if( mem.
2b20: 73 69 7a 65 43 6e 74 5b 4e 43 53 49 5a 45 2d 31  sizeCnt[NCSIZE-1
2b30: 5d 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ] ){.    fprintf
2b40: 28 6f 75 74 2c 20 22 20 20 3e 25 33 64 3a 20 25  (out, "  >%3d: %
2b50: 64 5c 6e 22 2c 20 4e 43 53 49 5a 45 2a 38 2c 20  d\n", NCSIZE*8, 
2b60: 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 4e 43 53 49  mem.sizeCnt[NCSI
2b70: 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20 66 63  ZE-1]);.  }.  fc
2b80: 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a  lose(out);.}../*
2b90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
2ba0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 73  umber of times s
2bb0: 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28  qlite3MemMalloc(
2bc0: 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
2bd0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2be0: 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f 63 43  3MemdebugMallocC
2bf0: 6f 75 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b  ount(){.  int i;
2c00: 0a 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20  .  int nTotal = 
2c10: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
2c20: 4e 43 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20  NCSIZE; i++){.  
2c30: 20 20 6e 54 6f 74 61 6c 20 2b 3d 20 6d 65 6d 2e    nTotal += mem.
2c40: 73 69 7a 65 43 6e 74 5b 69 5d 3b 0a 20 20 7d 0a  sizeCnt[i];.  }.
2c50: 20 20 72 65 74 75 72 6e 20 6e 54 6f 74 61 6c 3b    return nTotal;
2c60: 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}...#endif /* S
2c70: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 2a  QLITE_MEMDEBUG *
2c80: 2f 0a                                            /.