/ Hex Artifact Content
Login

Artifact ed0cb11ae43a3cc92bfb07172c2801956e94eaba:


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 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
01b0: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
01c0: 73 75 62 73 79 73 74 65 6d 20 66 6f 72 20 75 73  subsystem for us
01d0: 65 20 62 79 20 53 51 4c 69 74 65 2e 20 20 0a 2a  e by SQLite.  .*
01e0: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 65 6d 32 2e 63  *.** $Id: mem2.c
01f0: 2c 76 20 31 2e 32 30 20 32 30 30 38 2f 30 32 2f  ,v 1.20 2008/02/
0200: 31 33 20 31 38 3a 32 35 3a 32 37 20 64 61 6e 69  13 18:25:27 dani
0210: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f  elk1977 Exp $.*/
0220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ../*.** This ver
0230: 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f  sion of the memo
0240: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  ry allocator is 
0250: 75 73 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 65  used only if the
0260: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  .** SQLITE_MEMDE
0270: 42 55 47 20 6d 61 63 72 6f 20 69 73 20 64 65 66  BUG macro is def
0280: 69 6e 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ined and SQLITE_
0290: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 41 4c 4c 4f  OMIT_MEMORY_ALLO
02a0: 43 41 54 49 4f 4e 0a 2a 2a 20 69 73 20 6e 6f 74  CATION.** is not
02b0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
02c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
02d0: 4d 45 4d 44 45 42 55 47 29 0a 0a 2f 2a 0a 2a 2a  MEMDEBUG)../*.**
02e0: 20 57 65 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   We will eventua
02f0: 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 20 6d 75  lly construct mu
0300: 6c 74 69 70 6c 65 20 6d 65 6d 6f 72 79 20 61 6c  ltiple memory al
0310: 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74  location subsyst
0320: 65 6d 73 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ems.** suitable 
0330: 66 6f 72 20 75 73 65 20 69 6e 20 76 61 72 69 6f  for use in vario
0340: 75 73 20 63 6f 6e 74 65 78 74 73 3a 0a 2a 2a 0a  us contexts:.**.
0350: 2a 2a 20 20 20 20 2a 20 20 4e 6f 72 6d 61 6c 20  **    *  Normal 
0360: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 62  multi-threaded b
0370: 75 69 6c 64 73 0a 2a 2a 20 20 20 20 2a 20 20 4e  uilds.**    *  N
0380: 6f 72 6d 61 6c 20 73 69 6e 67 6c 65 2d 74 68 72  ormal single-thr
0390: 65 61 64 65 64 20 62 75 69 6c 64 73 0a 2a 2a 20  eaded builds.** 
03a0: 20 20 20 2a 20 20 44 65 62 75 67 67 69 6e 67 20     *  Debugging 
03b0: 62 75 69 6c 64 73 0a 2a 2a 0a 2a 2a 20 54 68 69  builds.**.** Thi
03c0: 73 20 76 65 72 73 69 6f 6e 20 69 73 20 73 75 69  s version is sui
03d0: 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20 69 6e  table for use in
03e0: 20 64 65 62 75 67 67 69 6e 67 20 62 75 69 6c 64   debugging build
03f0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75 72 65  s..**.** Feature
0400: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 45 76  s:.**.**    * Ev
0410: 65 72 79 20 61 6c 6c 6f 63 61 74 65 20 68 61 73  ery allocate has
0420: 20 67 75 61 72 64 73 20 61 74 20 62 6f 74 68 20   guards at both 
0430: 65 6e 64 73 2e 0a 2a 2a 20 20 20 20 2a 20 4e 65  ends..**    * Ne
0440: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72  w allocations ar
0450: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 69  e initialized wi
0460: 74 68 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 2a 2a  th randomness.**
0470: 20 20 20 20 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e      * Allocation
0480: 73 20 61 72 65 20 6f 76 65 72 77 72 69 74 74 65  s are overwritte
0490: 6e 20 77 69 74 68 20 72 61 6e 64 6f 6d 6e 65 73  n with randomnes
04a0: 73 20 77 68 65 6e 20 66 72 65 65 64 0a 2a 2a 20  s when freed.** 
04b0: 20 20 20 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c 6f     * Optional lo
04c0: 67 73 20 6f 66 20 6d 61 6c 6c 6f 63 20 61 63 74  gs of malloc act
04d0: 69 76 69 74 79 20 67 65 6e 65 72 61 74 65 64 0a  ivity generated.
04e0: 2a 2a 20 20 20 20 2a 20 53 75 6d 6d 61 72 79 20  **    * Summary 
04f0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  of outstanding a
0500: 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 20  llocations with 
0510: 62 61 63 6b 74 72 61 63 65 73 20 74 6f 20 74 68  backtraces to th
0520: 65 0a 2a 2a 20 20 20 20 20 20 70 6f 69 6e 74 20  e.**      point 
0530: 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  of allocation..*
0540: 2a 20 20 20 20 2a 20 54 68 65 20 61 62 69 6c 69  *    * The abili
0550: 74 79 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 6d  ty to simulate m
0560: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0570: 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 23 69 6e 63   failure.*/.#inc
0580: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0590: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
05a0: 69 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  io.h>../*.** The
05b0: 20 62 61 63 6b 74 72 61 63 65 20 66 75 6e 63 74   backtrace funct
05c0: 69 6f 6e 61 6c 69 74 79 20 69 73 20 6f 6e 6c 79  ionality is only
05d0: 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20   available with 
05e0: 47 4c 49 42 43 0a 2a 2f 0a 23 69 66 64 65 66 20  GLIBC.*/.#ifdef 
05f0: 5f 5f 47 4c 49 42 43 5f 5f 0a 20 20 65 78 74 65  __GLIBC__.  exte
0600: 72 6e 20 69 6e 74 20 62 61 63 6b 74 72 61 63 65  rn int backtrace
0610: 28 76 6f 69 64 2a 2a 2c 69 6e 74 29 3b 0a 20 20  (void**,int);.  
0620: 65 78 74 65 72 6e 20 76 6f 69 64 20 62 61 63 6b  extern void back
0630: 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f 66 64  trace_symbols_fd
0640: 28 76 6f 69 64 2a 63 6f 6e 73 74 2a 2c 69 6e 74  (void*const*,int
0650: 2c 69 6e 74 29 3b 0a 23 65 6c 73 65 0a 23 20 64  ,int);.#else.# d
0660: 65 66 69 6e 65 20 62 61 63 6b 74 72 61 63 65 28  efine backtrace(
0670: 41 2c 42 29 20 30 0a 23 20 64 65 66 69 6e 65 20  A,B) 0.# define 
0680: 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c  backtrace_symbol
0690: 73 5f 66 64 28 41 2c 42 2c 43 29 0a 23 65 6e 64  s_fd(A,B,C).#end
06a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 6d  if../*.** Each m
06b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
06c0: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
06d0: 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d  :.**.**  -------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 0a 2a 2a 20 20 7c 20 54 69 74 6c 65 20 7c 20  -.**  | Title | 
0730: 20 62 61 63 6b 74 72 61 63 65 20 70 6f 69 6e 74   backtrace point
0740: 65 72 73 20 7c 20 20 4d 65 6d 42 6c 6f 63 6b 48  ers |  MemBlockH
0750: 64 72 20 7c 20 20 61 6c 6c 6f 63 61 74 69 6f 6e  dr |  allocation
0760: 20 7c 20 20 45 6e 64 47 75 61 72 64 20 7c 0a 2a   |  EndGuard |.*
0770: 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *  -------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
07c0: 2a 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f  * The applicatio
07d0: 6e 20 63 6f 64 65 20 73 65 65 73 20 6f 6e 6c 79  n code sees only
07e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
07f0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 57  e allocation.  W
0800: 65 20 68 61 76 65 0a 2a 2a 20 74 6f 20 62 61 63  e have.** to bac
0810: 6b 20 75 70 20 66 72 6f 6d 20 74 68 65 20 61 6c  k up from the al
0820: 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74 65 72  location pointer
0830: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 4d 65 6d   to find the Mem
0840: 42 6c 6f 63 6b 48 64 72 2e 20 20 54 68 65 0a 2a  BlockHdr.  The.*
0850: 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 74 65  * MemBlockHdr te
0860: 6c 6c 73 20 75 73 20 74 68 65 20 73 69 7a 65 20  lls us the size 
0870: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
0880: 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  n and the number
0890: 20 6f 66 0a 2a 2a 20 62 61 63 6b 74 72 61 63 65   of.** backtrace
08a0: 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 72   pointers.  Ther
08b0: 65 20 69 73 20 61 6c 73 6f 20 61 20 67 75 61 72  e is also a guar
08c0: 64 20 77 6f 72 64 20 61 74 20 74 68 65 20 65 6e  d word at the en
08d0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 4d 65 6d 42  d of the.** MemB
08e0: 6c 6f 63 6b 48 64 72 2e 0a 2a 2f 0a 73 74 72 75  lockHdr..*/.stru
08f0: 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 7b  ct MemBlockHdr {
0900: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
0910: 63 6b 48 64 72 20 2a 70 4e 65 78 74 2c 20 2a 70  ckHdr *pNext, *p
0920: 50 72 65 76 3b 20 20 2f 2a 20 4c 69 6e 6b 65 64  Prev;  /* Linked
0930: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 66   list of all unf
0940: 72 65 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  reed memory */. 
0950: 20 69 6e 74 20 69 53 69 7a 65 3b 20 20 20 20 20   int iSize;     
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0980: 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
0990: 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61 63 6b 74  */.  char nBackt
09a0: 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  race;           
09b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
09c0: 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63 65 73  er of backtraces
09d0: 20 6f 6e 20 74 68 69 73 20 61 6c 6c 6f 63 20 2a   on this alloc *
09e0: 2f 0a 20 20 63 68 61 72 20 6e 42 61 63 6b 74 72  /.  char nBacktr
09f0: 61 63 65 53 6c 6f 74 73 3b 20 20 20 20 20 20 20  aceSlots;       
0a00: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
0a10: 61 62 6c 65 20 62 61 63 6b 74 72 61 63 65 20 73  able backtrace s
0a20: 6c 6f 74 73 20 2a 2f 0a 20 20 73 68 6f 72 74 20  lots */.  short 
0a30: 6e 54 69 74 6c 65 3b 20 20 20 20 20 20 20 20 20  nTitle;         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0a50: 20 42 79 74 65 73 20 6f 66 20 74 69 74 6c 65 3b   Bytes of title;
0a60: 20 69 6e 63 6c 75 64 65 73 20 27 5c 30 27 20 2a   includes '\0' *
0a70: 2f 0a 20 20 69 6e 74 20 69 46 6f 72 65 47 75 61  /.  int iForeGua
0a80: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
0a90: 20 20 20 20 20 20 20 20 2f 2a 20 47 75 61 72 64          /* Guard
0aa0: 20 77 6f 72 64 20 66 6f 72 20 73 61 6e 69 74 79   word for sanity
0ab0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 75   */.};../*.** Gu
0ac0: 61 72 64 20 77 6f 72 64 73 0a 2a 2f 0a 23 64 65  ard words.*/.#de
0ad0: 66 69 6e 65 20 46 4f 52 45 47 55 41 52 44 20 30  fine FOREGUARD 0
0ae0: 78 38 30 46 35 45 31 35 33 0a 23 64 65 66 69 6e  x80F5E153.#defin
0af0: 65 20 52 45 41 52 47 55 41 52 44 20 30 78 45 34  e REARGUARD 0xE4
0b00: 36 37 36 42 35 33 0a 0a 2f 2a 0a 2a 2a 20 4e 75  676B53../*.** Nu
0b10: 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 73  mber of malloc s
0b20: 69 7a 65 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ize increments t
0b30: 6f 20 74 72 61 63 6b 2e 0a 2a 2f 0a 23 64 65 66  o track..*/.#def
0b40: 69 6e 65 20 4e 43 53 49 5a 45 20 20 31 30 30 30  ine NCSIZE  1000
0b50: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ../*.** All of t
0b60: 68 65 20 73 74 61 74 69 63 20 76 61 72 69 61 62  he static variab
0b70: 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 69 73  les used by this
0b80: 20 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c 6c   module are coll
0b90: 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 20  ected.** into a 
0ba0: 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75 72 65  single structure
0bb0: 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e 20 20 54   named "mem".  T
0bc0: 68 69 73 20 69 73 20 74 6f 20 6b 65 65 70 20 74  his is to keep t
0bd0: 68 65 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72  he.** static var
0be0: 69 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65 64  iables organized
0bf0: 20 61 6e 64 20 74 6f 20 72 65 64 75 63 65 20 6e   and to reduce n
0c00: 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75 74 69  amespace polluti
0c10: 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  on.** when this 
0c20: 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 69 6e  module is combin
0c30: 65 64 20 77 69 74 68 20 6f 74 68 65 72 20 69 6e  ed with other in
0c40: 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f   the amalgamatio
0c50: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  n..*/.static str
0c60: 75 63 74 20 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  uct {.  /*.  ** 
0c70: 54 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61  The alarm callba
0c80: 63 6b 20 61 6e 64 20 69 74 73 20 61 72 67 75 6d  ck and its argum
0c90: 65 6e 74 73 2e 20 20 54 68 65 20 6d 65 6d 2e 6d  ents.  The mem.m
0ca0: 75 74 65 78 20 6c 6f 63 6b 20 77 69 6c 6c 0a 20  utex lock will. 
0cb0: 20 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69 6c   ** be held whil
0cc0: 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69  e the callback i
0cd0: 73 20 72 75 6e 6e 69 6e 67 2e 20 20 52 65 63 75  s running.  Recu
0ce0: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
0cf0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
0d00: 20 73 75 62 73 79 73 74 65 6d 20 61 72 65 20 61   subsystem are a
0d10: 6c 6c 6f 77 65 64 2c 20 62 75 74 20 6e 6f 20 6e  llowed, but no n
0d20: 65 77 20 63 61 6c 6c 62 61 63 6b 73 20 77 69 6c  ew callbacks wil
0d30: 6c 20 62 65 0a 20 20 2a 2a 20 69 73 73 75 65 64  l be.  ** issued
0d40: 2e 20 20 54 68 65 20 61 6c 61 72 6d 42 75 73 79  .  The alarmBusy
0d50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
0d60: 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 63 75   to prevent recu
0d70: 72 73 69 76 65 0a 20 20 2a 2a 20 63 61 6c 6c 62  rsive.  ** callb
0d80: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
0d90: 69 74 65 33 5f 69 6e 74 36 34 20 61 6c 61 72 6d  ite3_int64 alarm
0da0: 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20 76 6f 69  Threshold;.  voi
0db0: 64 20 28 2a 61 6c 61 72 6d 43 61 6c 6c 62 61 63  d (*alarmCallbac
0dc0: 6b 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65  k)(void*, sqlite
0dd0: 33 5f 69 6e 74 36 34 2c 20 69 6e 74 29 3b 0a 20  3_int64, int);. 
0de0: 20 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67 3b   void *alarmArg;
0df0: 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42 75 73 79  .  int alarmBusy
0e00: 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  ;.  .  /*.  ** M
0e10: 75 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  utex to control 
0e20: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d 65  access to the me
0e30: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0e40: 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  subsystem..  */.
0e50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
0e60: 2a 6d 75 74 65 78 3b 0a 20 20 0a 20 20 2f 2a 0a  *mutex;.  .  /*.
0e70: 20 20 2a 2a 20 43 75 72 72 65 6e 74 20 61 6c 6c    ** Current all
0e80: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 68 69 67 68  ocation and high
0e90: 2d 77 61 74 65 72 20 6d 61 72 6b 2e 0a 20 20 2a  -water mark..  *
0ea0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
0eb0: 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20 73 71 6c  4 nowUsed;.  sql
0ec0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 55 73 65  ite3_int64 mxUse
0ed0: 64 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  d;.  .  /*.  ** 
0ee0: 48 65 61 64 20 61 6e 64 20 74 61 69 6c 20 6f 66  Head and tail of
0ef0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
0f00: 66 20 61 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e  f all outstandin
0f10: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 20 20  g allocations.  
0f20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  */.  struct MemB
0f30: 6c 6f 63 6b 48 64 72 20 2a 70 46 69 72 73 74 3b  lockHdr *pFirst;
0f40: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
0f50: 63 6b 48 64 72 20 2a 70 4c 61 73 74 3b 0a 20 20  ckHdr *pLast;.  
0f60: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6e  .  /*.  ** The n
0f70: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
0f80: 6f 66 20 62 61 63 6b 74 72 61 63 65 20 74 6f 20  of backtrace to 
0f90: 73 61 76 65 20 69 6e 20 6e 65 77 20 61 6c 6c 6f  save in new allo
0fa0: 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  cations..  */.  
0fb0: 69 6e 74 20 6e 42 61 63 6b 74 72 61 63 65 3b 0a  int nBacktrace;.
0fc0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 69 74 6c 65  .  /*.  ** Title
0fd0: 20 74 65 78 74 20 74 6f 20 69 6e 73 65 72 74 20   text to insert 
0fe0: 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 61 63 68  in front of each
0ff0: 20 62 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 6e   block.  */.  in
1000: 74 20 6e 54 69 74 6c 65 3b 20 20 20 20 20 20 20  t nTitle;       
1010: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 54 69   /* Bytes of zTi
1020: 74 6c 65 20 74 6f 20 73 61 76 65 2e 20 20 49 6e  tle to save.  In
1030: 63 6c 75 64 65 73 20 27 5c 30 27 20 61 6e 64 20  cludes '\0' and 
1040: 70 61 64 64 69 6e 67 20 2a 2f 0a 20 20 63 68 61  padding */.  cha
1050: 72 20 7a 54 69 74 6c 65 5b 31 30 30 5d 3b 20 20  r zTitle[100];  
1060: 2f 2a 20 54 68 65 20 74 69 74 6c 65 20 74 65 78  /* The title tex
1070: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  t */..  /* .  **
1080: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69   sqlite3MallocDi
1090: 73 61 6c 6c 6f 77 28 29 20 69 6e 63 72 65 6d 65  sallow() increme
10a0: 6e 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nts the followin
10b0: 67 20 63 6f 75 6e 74 65 72 2e 0a 20 20 2a 2a 20  g counter..  ** 
10c0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c  sqlite3MallocAll
10d0: 6f 77 28 29 20 64 65 63 72 65 6d 65 6e 74 73 20  ow() decrements 
10e0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 64  it..  */.  int d
10f0: 69 73 61 6c 6c 6f 77 3b 20 2f 2a 20 44 6f 20 6e  isallow; /* Do n
1100: 6f 74 20 61 6c 6c 6f 77 20 6d 65 6d 6f 72 79 20  ot allow memory 
1110: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 0a 20  allocation */.. 
1120: 20 2f 2a 0a 20 20 2a 2a 20 47 61 74 68 65 72 20   /*.  ** Gather 
1130: 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 74 68  statistics on th
1140: 65 20 73 69 7a 65 73 20 6f 66 20 6d 65 6d 6f 72  e sizes of memor
1150: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20  y allocations.. 
1160: 20 2a 2a 20 73 69 7a 65 43 6e 74 5b 69 5d 20 69   ** sizeCnt[i] i
1170: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1180: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1190: 70 74 73 20 6f 66 20 69 2a 38 0a 20 20 2a 2a 20  pts of i*8.  ** 
11a0: 62 79 74 65 73 2e 20 20 69 3d 3d 4e 43 53 49 5a  bytes.  i==NCSIZ
11b0: 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  E is the number 
11c0: 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  of allocation at
11d0: 74 65 6d 70 74 73 20 66 6f 72 0a 20 20 2a 2a 20  tempts for.  ** 
11e0: 73 69 7a 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  sizes more than 
11f0: 4e 43 53 49 5a 45 2a 38 20 62 79 74 65 73 2e 0a  NCSIZE*8 bytes..
1200: 20 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 43    */.  int sizeC
1210: 6e 74 5b 4e 43 53 49 5a 45 5d 3b 0a 0a 7d 20 6d  nt[NCSIZE];..} m
1220: 65 6d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 45 6e 74 65  em;.../*.** Ente
1230: 72 20 74 68 65 20 6d 75 74 65 78 20 6d 65 6d 2e  r the mutex mem.
1240: 6d 75 74 65 78 2e 20 41 6c 6c 6f 63 61 74 65 20  mutex. Allocate 
1250: 69 74 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  it if it is not 
1260: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
1270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1280: 64 20 65 6e 74 65 72 4d 65 6d 28 76 6f 69 64 29  d enterMem(void)
1290: 7b 0a 20 20 69 66 28 20 6d 65 6d 2e 6d 75 74 65  {.  if( mem.mute
12a0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 2e  x==0 ){.    mem.
12b0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
12c0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
12d0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12e0: 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  MEM);.  }.  sqli
12f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1300: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  mem.mutex);.}../
1310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1320: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
1330: 20 63 75 72 72 65 6e 74 6c 79 20 63 68 65 63 6b   currently check
1340: 65 64 20 6f 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74  ed out..*/.sqlit
1350: 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1360: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 76 6f 69  _memory_used(voi
1370: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  d){.  sqlite3_in
1380: 74 36 34 20 6e 3b 0a 20 20 65 6e 74 65 72 4d 65  t64 n;.  enterMe
1390: 6d 28 29 3b 0a 20 20 6e 20 3d 20 6d 65 6d 2e 6e  m();.  n = mem.n
13a0: 6f 77 55 73 65 64 3b 0a 20 20 73 71 6c 69 74 65  owUsed;.  sqlite
13b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
13c0: 6d 2e 6d 75 74 65 78 29 3b 20 20 0a 20 20 72 65  m.mutex);  .  re
13d0: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
13e0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
13f0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  mum amount of me
1400: 6d 6f 72 79 20 74 68 61 74 20 68 61 73 20 65 76  mory that has ev
1410: 65 72 20 62 65 65 6e 0a 2a 2a 20 63 68 65 63 6b  er been.** check
1420: 65 64 20 6f 75 74 20 73 69 6e 63 65 20 65 69 74  ed out since eit
1430: 68 65 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  her the beginnin
1440: 67 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 73  g of this proces
1450: 73 0a 2a 2a 20 6f 72 20 73 69 6e 63 65 20 74 68  s.** or since th
1460: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 72 65  e most recent re
1470: 73 65 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  set..*/.sqlite3_
1480: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d 65  int64 sqlite3_me
1490: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 28 69  mory_highwater(i
14a0: 6e 74 20 72 65 73 65 74 46 6c 61 67 29 7b 0a 20  nt resetFlag){. 
14b0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
14c0: 3b 0a 20 20 65 6e 74 65 72 4d 65 6d 28 29 3b 0a  ;.  enterMem();.
14d0: 20 20 6e 20 3d 20 6d 65 6d 2e 6d 78 55 73 65 64    n = mem.mxUsed
14e0: 3b 0a 20 20 69 66 28 20 72 65 73 65 74 46 6c 61  ;.  if( resetFla
14f0: 67 20 29 7b 0a 20 20 20 20 6d 65 6d 2e 6d 78 55  g ){.    mem.mxU
1500: 73 65 64 20 3d 20 6d 65 6d 2e 6e 6f 77 55 73 65  sed = mem.nowUse
1510: 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  d;.  }.  sqlite3
1520: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
1530: 2e 6d 75 74 65 78 29 3b 20 20 0a 20 20 72 65 74  .mutex);  .  ret
1540: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1550: 43 68 61 6e 67 65 20 74 68 65 20 61 6c 61 72 6d  Change the alarm
1560: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 69 6e 74   callback.*/.int
1570: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
1580: 61 6c 61 72 6d 28 0a 20 20 76 6f 69 64 28 2a 78  alarm(.  void(*x
1590: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a  Callback)(void *
15a0: 70 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pArg, sqlite3_in
15b0: 74 36 34 20 75 73 65 64 2c 20 69 6e 74 20 4e 29  t64 used, int N)
15c0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  ,.  void *pArg,.
15d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
15e0: 69 54 68 72 65 73 68 6f 6c 64 0a 29 7b 0a 20 20  iThreshold.){.  
15f0: 65 6e 74 65 72 4d 65 6d 28 29 3b 0a 20 20 6d 65  enterMem();.  me
1600: 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20  m.alarmCallback 
1610: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6d  = xCallback;.  m
1620: 65 6d 2e 61 6c 61 72 6d 41 72 67 20 3d 20 70 41  em.alarmArg = pA
1630: 72 67 3b 0a 20 20 6d 65 6d 2e 61 6c 61 72 6d 54  rg;.  mem.alarmT
1640: 68 72 65 73 68 6f 6c 64 20 3d 20 69 54 68 72 65  hreshold = iThre
1650: 73 68 6f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  shold;.  sqlite3
1660: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
1670: 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  .mutex);.  retur
1680: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1690: 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 74 68  /*.** Trigger th
16a0: 65 20 61 6c 61 72 6d 20 0a 2a 2f 0a 73 74 61 74  e alarm .*/.stat
16b0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  ic void sqlite3M
16c0: 65 6d 73 79 73 41 6c 61 72 6d 28 69 6e 74 20 6e  emsysAlarm(int n
16d0: 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 28 2a  Byte){.  void (*
16e0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
16f0: 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 69  ,sqlite3_int64,i
1700: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  nt);.  sqlite3_i
1710: 6e 74 36 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20  nt64 nowUsed;.  
1720: 76 6f 69 64 20 2a 70 41 72 67 3b 0a 20 20 69 66  void *pArg;.  if
1730: 28 20 6d 65 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62  ( mem.alarmCallb
1740: 61 63 6b 3d 3d 30 20 7c 7c 20 6d 65 6d 2e 61 6c  ack==0 || mem.al
1750: 61 72 6d 42 75 73 79 20 20 29 20 72 65 74 75 72  armBusy  ) retur
1760: 6e 3b 0a 20 20 6d 65 6d 2e 61 6c 61 72 6d 42 75  n;.  mem.alarmBu
1770: 73 79 20 3d 20 31 3b 0a 20 20 78 43 61 6c 6c 62  sy = 1;.  xCallb
1780: 61 63 6b 20 3d 20 6d 65 6d 2e 61 6c 61 72 6d 43  ack = mem.alarmC
1790: 61 6c 6c 62 61 63 6b 3b 0a 20 20 6e 6f 77 55 73  allback;.  nowUs
17a0: 65 64 20 3d 20 6d 65 6d 2e 6e 6f 77 55 73 65 64  ed = mem.nowUsed
17b0: 3b 0a 20 20 70 41 72 67 20 3d 20 6d 65 6d 2e 61  ;.  pArg = mem.a
17c0: 6c 61 72 6d 41 72 67 3b 0a 20 20 73 71 6c 69 74  larmArg;.  sqlit
17d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
17e0: 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 78 43 61  em.mutex);.  xCa
17f0: 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 6f 77  llback(pArg, now
1800: 55 73 65 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Used, nByte);.  
1810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1820: 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ter(mem.mutex);.
1830: 20 20 6d 65 6d 2e 61 6c 61 72 6d 42 75 73 79 20    mem.alarmBusy 
1840: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  = 0;.}../*.** Gi
1850: 76 65 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  ven an allocatio
1860: 6e 2c 20 66 69 6e 64 20 74 68 65 20 4d 65 6d 42  n, find the MemB
1870: 6c 6f 63 6b 48 64 72 20 66 6f 72 20 74 68 61 74  lockHdr for that
1880: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   allocation..**.
1890: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18a0: 63 68 65 63 6b 73 20 74 68 65 20 67 75 61 72 64  checks the guard
18b0: 73 20 61 74 20 65 69 74 68 65 72 20 65 6e 64 20  s at either end 
18c0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
18d0: 6e 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 79  n and.** if they
18e0: 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 69   are incorrect i
18f0: 74 20 61 73 73 65 72 74 73 2e 0a 2a 2f 0a 73 74  t asserts..*/.st
1900: 61 74 69 63 20 73 74 72 75 63 74 20 4d 65 6d 42  atic struct MemB
1910: 6c 6f 63 6b 48 64 72 20 2a 73 71 6c 69 74 65 33  lockHdr *sqlite3
1920: 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28  MemsysGetHeader(
1930: 76 6f 69 64 20 2a 70 41 6c 6c 6f 63 61 74 69 6f  void *pAllocatio
1940: 6e 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  n){.  struct Mem
1950: 42 6c 6f 63 6b 48 64 72 20 2a 70 3b 0a 20 20 69  BlockHdr *p;.  i
1960: 6e 74 20 2a 70 49 6e 74 3b 0a 0a 20 20 70 20 3d  nt *pInt;..  p =
1970: 20 28 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63   (struct MemBloc
1980: 6b 48 64 72 2a 29 70 41 6c 6c 6f 63 61 74 69 6f  kHdr*)pAllocatio
1990: 6e 3b 0a 20 20 70 2d 2d 3b 0a 20 20 61 73 73 65  n;.  p--;.  asse
19a0: 72 74 28 20 70 2d 3e 69 46 6f 72 65 47 75 61 72  rt( p->iForeGuar
19b0: 64 3d 3d 46 4f 52 45 47 55 41 52 44 20 29 3b 0a  d==FOREGUARD );.
19c0: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 69 53    assert( (p->iS
19d0: 69 7a 65 20 26 20 33 29 3d 3d 30 20 29 3b 0a 20  ize & 3)==0 );. 
19e0: 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29 70 41   pInt = (int*)pA
19f0: 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20 20 61 73 73  llocation;.  ass
1a00: 65 72 74 28 20 70 49 6e 74 5b 70 2d 3e 69 53 69  ert( pInt[p->iSi
1a10: 7a 65 2f 73 69 7a 65 6f 66 28 69 6e 74 29 5d 3d  ze/sizeof(int)]=
1a20: 3d 52 45 41 52 47 55 41 52 44 20 29 3b 0a 20 20  =REARGUARD );.  
1a30: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1a40: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1a50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 75  mber of bytes cu
1a60: 72 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65  rrently allocate
1a70: 64 20 61 74 20 61 64 64 72 65 73 73 20 70 2e 0a  d at address p..
1a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 61  */.int sqlite3Ma
1a90: 6c 6c 6f 63 53 69 7a 65 28 76 6f 69 64 20 2a 70  llocSize(void *p
1aa0: 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  ){.  struct MemB
1ab0: 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20  lockHdr *pHdr;. 
1ac0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
1ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1ae0: 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  Hdr = sqlite3Mem
1af0: 73 79 73 47 65 74 48 65 61 64 65 72 28 70 29 3b  sysGetHeader(p);
1b00: 0a 20 20 72 65 74 75 72 6e 20 70 48 64 72 2d 3e  .  return pHdr->
1b10: 69 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iSize;.}../*.** 
1b20: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
1b30: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
1b40: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1b50: 5f 6d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  _malloc(int nByt
1b60: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  e){.  struct Mem
1b70: 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a  BlockHdr *pHdr;.
1b80: 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20    void **pBt;.  
1b90: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 2a  char *z;.  int *
1ba0: 70 49 6e 74 3b 0a 20 20 76 6f 69 64 20 2a 70 20  pInt;.  void *p 
1bb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 74 6f 74 61 6c  = 0;.  int total
1bc0: 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 6e 42 79  Size;..  if( nBy
1bd0: 74 65 3e 30 20 29 7b 0a 20 20 20 20 65 6e 74 65  te>0 ){.    ente
1be0: 72 4d 65 6d 28 29 3b 0a 20 20 20 20 61 73 73 65  rMem();.    asse
1bf0: 72 74 28 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77  rt( mem.disallow
1c00: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6d  ==0 );.    if( m
1c10: 65 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b  em.alarmCallback
1c20: 21 3d 30 20 26 26 20 6d 65 6d 2e 6e 6f 77 55 73  !=0 && mem.nowUs
1c30: 65 64 2b 6e 42 79 74 65 3e 3d 6d 65 6d 2e 61 6c  ed+nByte>=mem.al
1c40: 61 72 6d 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a  armThreshold ){.
1c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
1c60: 73 79 73 41 6c 61 72 6d 28 6e 42 79 74 65 29 3b  sysAlarm(nByte);
1c70: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
1c80: 20 3d 20 28 6e 42 79 74 65 2b 33 29 26 7e 33 3b   = (nByte+3)&~3;
1c90: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 2f 38  .    if( nByte/8
1ca0: 3e 4e 43 53 49 5a 45 2d 31 20 29 7b 0a 20 20 20  >NCSIZE-1 ){.   
1cb0: 20 20 20 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 4e     mem.sizeCnt[N
1cc0: 43 53 49 5a 45 2d 31 5d 2b 2b 3b 0a 20 20 20 20  CSIZE-1]++;.    
1cd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
1ce0: 2e 73 69 7a 65 43 6e 74 5b 6e 42 79 74 65 2f 38  .sizeCnt[nByte/8
1cf0: 5d 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ]++;.    }.    t
1d00: 6f 74 61 6c 53 69 7a 65 20 3d 20 6e 42 79 74 65  otalSize = nByte
1d10: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 64 72 29   + sizeof(*pHdr)
1d20: 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b   + sizeof(int) +
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d40: 20 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65    mem.nBacktrace
1d50: 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b  *sizeof(void*) +
1d60: 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 20   mem.nTitle;.   
1d70: 20 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c   if( sqlite3Faul
1d80: 74 53 74 65 70 28 53 51 4c 49 54 45 5f 46 41 55  tStep(SQLITE_FAU
1d90: 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f  LTINJECTOR_MALLO
1da0: 43 29 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  C) ){.      p = 
1db0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1dc0: 20 20 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74      p = malloc(t
1dd0: 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  otalSize);.     
1de0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
1df0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 73       sqlite3Mems
1e00: 79 73 41 6c 61 72 6d 28 6e 42 79 74 65 29 3b 0a  ysAlarm(nByte);.
1e10: 20 20 20 20 20 20 20 20 70 20 3d 20 6d 61 6c 6c          p = mall
1e20: 6f 63 28 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  oc(totalSize);. 
1e30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e40: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1e50: 7a 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  z = p;.      pBt
1e60: 20 3d 20 28 76 6f 69 64 2a 2a 29 26 7a 5b 6d 65   = (void**)&z[me
1e70: 6d 2e 6e 54 69 74 6c 65 5d 3b 0a 20 20 20 20 20  m.nTitle];.     
1e80: 20 70 48 64 72 20 3d 20 28 73 74 72 75 63 74 20   pHdr = (struct 
1e90: 4d 65 6d 42 6c 6f 63 6b 48 64 72 2a 29 26 70 42  MemBlockHdr*)&pB
1ea0: 74 5b 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65  t[mem.nBacktrace
1eb0: 5d 3b 0a 20 20 20 20 20 20 70 48 64 72 2d 3e 70  ];.      pHdr->p
1ec0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
1ed0: 70 48 64 72 2d 3e 70 50 72 65 76 20 3d 20 6d 65  pHdr->pPrev = me
1ee0: 6d 2e 70 4c 61 73 74 3b 0a 20 20 20 20 20 20 69  m.pLast;.      i
1ef0: 66 28 20 6d 65 6d 2e 70 4c 61 73 74 20 29 7b 0a  f( mem.pLast ){.
1f00: 20 20 20 20 20 20 20 20 6d 65 6d 2e 70 4c 61 73          mem.pLas
1f10: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 48 64 72 3b  t->pNext = pHdr;
1f20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f30: 20 20 20 20 20 20 6d 65 6d 2e 70 46 69 72 73 74        mem.pFirst
1f40: 20 3d 20 70 48 64 72 3b 0a 20 20 20 20 20 20 7d   = pHdr;.      }
1f50: 0a 20 20 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74  .      mem.pLast
1f60: 20 3d 20 70 48 64 72 3b 0a 20 20 20 20 20 20 70   = pHdr;.      p
1f70: 48 64 72 2d 3e 69 46 6f 72 65 47 75 61 72 64 20  Hdr->iForeGuard 
1f80: 3d 20 46 4f 52 45 47 55 41 52 44 3b 0a 20 20 20  = FOREGUARD;.   
1f90: 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72     pHdr->nBacktr
1fa0: 61 63 65 53 6c 6f 74 73 20 3d 20 6d 65 6d 2e 6e  aceSlots = mem.n
1fb0: 42 61 63 6b 74 72 61 63 65 3b 0a 20 20 20 20 20  Backtrace;.     
1fc0: 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3d 20   pHdr->nTitle = 
1fd0: 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 20 20  mem.nTitle;.    
1fe0: 20 20 69 66 28 20 6d 65 6d 2e 6e 42 61 63 6b 74    if( mem.nBackt
1ff0: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
2000: 76 6f 69 64 20 2a 61 41 64 64 72 5b 34 30 5d 3b  void *aAddr[40];
2010: 0a 20 20 20 20 20 20 20 20 70 48 64 72 2d 3e 6e  .        pHdr->n
2020: 42 61 63 6b 74 72 61 63 65 20 3d 20 62 61 63 6b  Backtrace = back
2030: 74 72 61 63 65 28 61 41 64 64 72 2c 20 6d 65 6d  trace(aAddr, mem
2040: 2e 6e 42 61 63 6b 74 72 61 63 65 2b 31 29 2d 31  .nBacktrace+1)-1
2050: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2060: 28 70 42 74 2c 20 26 61 41 64 64 72 5b 31 5d 2c  (pBt, &aAddr[1],
2070: 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63   pHdr->nBacktrac
2080: 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29  e*sizeof(void*))
2090: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20a0: 20 20 20 20 20 20 20 70 48 64 72 2d 3e 6e 42 61         pHdr->nBa
20b0: 63 6b 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20  cktrace = 0;.   
20c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d     }.      if( m
20d0: 65 6d 2e 6e 54 69 74 6c 65 20 29 7b 0a 20 20 20  em.nTitle ){.   
20e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 6d       memcpy(z, m
20f0: 65 6d 2e 7a 54 69 74 6c 65 2c 20 6d 65 6d 2e 6e  em.zTitle, mem.n
2100: 54 69 74 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Title);.      }.
2110: 20 20 20 20 20 20 70 48 64 72 2d 3e 69 53 69 7a        pHdr->iSiz
2120: 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e = nByte;.     
2130: 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29 26 70   pInt = (int*)&p
2140: 48 64 72 5b 31 5d 3b 0a 20 20 20 20 20 20 70 49  Hdr[1];.      pI
2150: 6e 74 5b 6e 42 79 74 65 2f 73 69 7a 65 6f 66 28  nt[nByte/sizeof(
2160: 69 6e 74 29 5d 20 3d 20 52 45 41 52 47 55 41 52  int)] = REARGUAR
2170: 44 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  D;.      memset(
2180: 70 49 6e 74 2c 20 30 78 36 35 2c 20 6e 42 79 74  pInt, 0x65, nByt
2190: 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 2e 6e 6f  e);.      mem.no
21a0: 77 55 73 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a  wUsed += nByte;.
21b0: 20 20 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 6f        if( mem.no
21c0: 77 55 73 65 64 3e 6d 65 6d 2e 6d 78 55 73 65 64  wUsed>mem.mxUsed
21d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 2e   ){.        mem.
21e0: 6d 78 55 73 65 64 20 3d 20 6d 65 6d 2e 6e 6f 77  mxUsed = mem.now
21f0: 55 73 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Used;.      }.  
2200: 20 20 20 20 70 20 3d 20 28 76 6f 69 64 2a 29 70      p = (void*)p
2210: 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Int;.    }.    s
2220: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2230: 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20  ve(mem.mutex);. 
2240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 20 0a   }.  return p; .
2250: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
2260: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
2270: 6c 69 74 65 33 5f 66 72 65 65 28 76 6f 69 64 20  lite3_free(void 
2280: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 73 74 72 75  *pPrior){.  stru
2290: 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a  ct MemBlockHdr *
22a0: 70 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a 2a 70  pHdr;.  void **p
22b0: 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  Bt;.  char *z;. 
22c0: 20 69 66 28 20 70 50 72 69 6f 72 3d 3d 30 20 29   if( pPrior==0 )
22d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e  }.  assert( mem.
22f0: 6d 75 74 65 78 21 3d 30 20 29 3b 0a 20 20 70 48  mutex!=0 );.  pH
2300: 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73  dr = sqlite3Mems
2310: 79 73 47 65 74 48 65 61 64 65 72 28 70 50 72 69  ysGetHeader(pPri
2320: 6f 72 29 3b 0a 20 20 70 42 74 20 3d 20 28 76 6f  or);.  pBt = (vo
2330: 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20 70 42 74  id**)pHdr;.  pBt
2340: 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74   -= pHdr->nBackt
2350: 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20 73 71 6c  raceSlots;.  sql
2360: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2370: 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 6d  (mem.mutex);.  m
2380: 65 6d 2e 6e 6f 77 55 73 65 64 20 2d 3d 20 70 48  em.nowUsed -= pH
2390: 64 72 2d 3e 69 53 69 7a 65 3b 0a 20 20 69 66 28  dr->iSize;.  if(
23a0: 20 70 48 64 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pHdr->pPrev ){.
23b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 48 64 72      assert( pHdr
23c0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
23d0: 70 48 64 72 20 29 3b 0a 20 20 20 20 70 48 64 72  pHdr );.    pHdr
23e0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
23f0: 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pHdr->pNext;.  
2400: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2410: 74 28 20 6d 65 6d 2e 70 46 69 72 73 74 3d 3d 70  t( mem.pFirst==p
2420: 48 64 72 20 29 3b 0a 20 20 20 20 6d 65 6d 2e 70  Hdr );.    mem.p
2430: 46 69 72 73 74 20 3d 20 70 48 64 72 2d 3e 70 4e  First = pHdr->pN
2440: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
2450: 48 64 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Hdr->pNext ){.  
2460: 20 20 61 73 73 65 72 74 28 20 70 48 64 72 2d 3e    assert( pHdr->
2470: 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 48  pNext->pPrev==pH
2480: 64 72 20 29 3b 0a 20 20 20 20 70 48 64 72 2d 3e  dr );.    pHdr->
2490: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
24a0: 48 64 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 65  Hdr->pPrev;.  }e
24b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
24c0: 20 6d 65 6d 2e 70 4c 61 73 74 3d 3d 70 48 64 72   mem.pLast==pHdr
24d0: 20 29 3b 0a 20 20 20 20 6d 65 6d 2e 70 4c 61 73   );.    mem.pLas
24e0: 74 20 3d 20 70 48 64 72 2d 3e 70 50 72 65 76 3b  t = pHdr->pPrev;
24f0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
2500: 2a 29 70 42 74 3b 0a 20 20 7a 20 2d 3d 20 70 48  *)pBt;.  z -= pH
2510: 64 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20 20 6d 65  dr->nTitle;.  me
2520: 6d 73 65 74 28 7a 2c 20 30 78 32 62 2c 20 73 69  mset(z, 0x2b, si
2530: 7a 65 6f 66 28 76 6f 69 64 2a 29 2a 70 48 64 72  zeof(void*)*pHdr
2540: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74  ->nBacktraceSlot
2550: 73 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 64 72  s + sizeof(*pHdr
2560: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) +.            
2570: 20 20 20 20 20 20 70 48 64 72 2d 3e 69 53 69 7a        pHdr->iSiz
2580: 65 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20  e + sizeof(int) 
2590: 2b 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 29 3b  + pHdr->nTitle);
25a0: 0a 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 73 71  .  free(z);.  sq
25b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
25c0: 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 20 20 0a  e(mem.mutex);  .
25d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
25e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  the size of an e
25f0: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
2600: 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  llocation..**.**
2610: 20 46 6f 72 20 74 68 69 73 20 64 65 62 75 67 67   For this debugg
2620: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
2630: 6f 6e 2c 20 77 65 20 2a 61 6c 77 61 79 73 2a 20  on, we *always* 
2640: 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
2650: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
2660: 20 69 6e 74 6f 20 61 20 6e 65 77 20 70 6c 61 63   into a new plac
2670: 65 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 49 6e  e in memory.  In
2680: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
2690: 65 20 0a 2a 2a 20 68 69 67 68 65 72 20 6c 65 76  e .** higher lev
26a0: 65 6c 20 63 6f 64 65 20 69 73 20 75 73 69 6e 67  el code is using
26b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
26c0: 6f 6c 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  old allocation, 
26d0: 69 74 20 69 73 20 0a 2a 2a 20 6d 75 63 68 20 6d  it is .** much m
26e0: 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 62 72  ore likely to br
26f0: 65 61 6b 20 61 6e 64 20 77 65 20 61 72 65 20 6d  eak and we are m
2700: 75 63 68 20 6d 6f 72 65 20 6c 69 6b 69 6e 67 20  uch more liking 
2710: 74 6f 20 66 69 6e 64 0a 2a 2a 20 74 68 65 20 65  to find.** the e
2720: 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  rror..*/.void *s
2730: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 76  qlite3_realloc(v
2740: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
2750: 20 6e 42 79 74 65 29 7b 0a 20 20 73 74 72 75 63   nByte){.  struc
2760: 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70  t MemBlockHdr *p
2770: 4f 6c 64 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a  OldHdr;.  void *
2780: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 50 72 69  pNew;.  if( pPri
2790: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  or==0 ){.    ret
27a0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  urn sqlite3_mall
27b0: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  oc(nByte);.  }. 
27c0: 20 69 66 28 20 6e 42 79 74 65 3c 3d 30 20 29 7b   if( nByte<=0 ){
27d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27e0: 65 28 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 72  e(pPrior);.    r
27f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
2800: 73 73 65 72 74 28 20 6d 65 6d 2e 64 69 73 61 6c  ssert( mem.disal
2810: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 4f 6c 64  low==0 );.  pOld
2820: 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  Hdr = sqlite3Mem
2830: 73 79 73 47 65 74 48 65 61 64 65 72 28 70 50 72  sysGetHeader(pPr
2840: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ior);.  pNew = s
2850: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
2860: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  yte);.  if( pNew
2870: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
2880: 4e 65 77 2c 20 70 50 72 69 6f 72 2c 20 6e 42 79  New, pPrior, nBy
2890: 74 65 3c 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a  te<pOldHdr->iSiz
28a0: 65 20 3f 20 6e 42 79 74 65 20 3a 20 70 4f 6c 64  e ? nByte : pOld
28b0: 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20  Hdr->iSize);.   
28c0: 20 69 66 28 20 6e 42 79 74 65 3e 70 4f 6c 64 48   if( nByte>pOldH
28d0: 64 72 2d 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20  dr->iSize ){.   
28e0: 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
28f0: 72 2a 29 70 4e 65 77 29 5b 70 4f 6c 64 48 64 72  r*)pNew)[pOldHdr
2900: 2d 3e 69 53 69 7a 65 5d 2c 20 30 78 32 62 2c 20  ->iSize], 0x2b, 
2910: 6e 42 79 74 65 20 2d 20 70 4f 6c 64 48 64 72 2d  nByte - pOldHdr-
2920: 3e 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  >iSize);.    }. 
2930: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2940: 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  pPrior);.  }.  r
2950: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
2960: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
2970: 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63 65  ber of backtrace
2980: 20 6c 65 76 65 6c 73 20 6b 65 70 74 20 66 6f 72   levels kept for
2990: 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e   each allocation
29a0: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
29b0: 7a 65 72 6f 20 74 75 72 6e 73 20 6f 66 20 62 61  zero turns of ba
29c0: 63 6b 74 72 61 63 69 6e 67 2e 20 20 54 68 65 20  cktracing.  The 
29d0: 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61 79 73  number is always
29e0: 20 72 6f 75 6e 64 65 64 0a 2a 2a 20 75 70 20 74   rounded.** up t
29f0: 6f 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  o a multiple of 
2a00: 32 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  2..*/.void sqlit
2a10: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 62 61 63 6b  e3_memdebug_back
2a20: 74 72 61 63 65 28 69 6e 74 20 64 65 70 74 68 29  trace(int depth)
2a30: 7b 0a 20 20 69 66 28 20 64 65 70 74 68 3c 30 20  {.  if( depth<0 
2a40: 29 7b 20 64 65 70 74 68 20 3d 20 30 3b 20 7d 0a  ){ depth = 0; }.
2a50: 20 20 69 66 28 20 64 65 70 74 68 3e 32 30 20 29    if( depth>20 )
2a60: 7b 20 64 65 70 74 68 20 3d 20 32 30 3b 20 7d 0a  { depth = 20; }.
2a70: 20 20 64 65 70 74 68 20 3d 20 28 64 65 70 74 68    depth = (depth
2a80: 2b 31 29 26 30 78 66 65 3b 0a 20 20 6d 65 6d 2e  +1)&0xfe;.  mem.
2a90: 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 64 65 70  nBacktrace = dep
2aa0: 74 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  th;.}../*.** Set
2ab0: 20 74 68 65 20 74 69 74 6c 65 20 73 74 72 69 6e   the title strin
2ac0: 67 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  g for subsequent
2ad0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f   allocations..*/
2ae0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 65  .void sqlite3_me
2af0: 6d 64 65 62 75 67 5f 73 65 74 74 69 74 6c 65 28  mdebug_settitle(
2b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74  const char *zTit
2b10: 6c 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73  le){.  int n = s
2b20: 74 72 6c 65 6e 28 7a 54 69 74 6c 65 29 20 2b 20  trlen(zTitle) + 
2b30: 31 3b 0a 20 20 65 6e 74 65 72 4d 65 6d 28 29 3b  1;.  enterMem();
2b40: 0a 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66  .  if( n>=sizeof
2b50: 28 6d 65 6d 2e 7a 54 69 74 6c 65 29 20 29 20 6e  (mem.zTitle) ) n
2b60: 20 3d 20 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54   = sizeof(mem.zT
2b70: 69 74 6c 65 29 2d 31 3b 0a 20 20 6d 65 6d 63 70  itle)-1;.  memcp
2b80: 79 28 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 7a 54  y(mem.zTitle, zT
2b90: 69 74 6c 65 2c 20 6e 29 3b 0a 20 20 6d 65 6d 2e  itle, n);.  mem.
2ba0: 7a 54 69 74 6c 65 5b 6e 5d 20 3d 20 30 3b 0a 20  zTitle[n] = 0;. 
2bb0: 20 6d 65 6d 2e 6e 54 69 74 6c 65 20 3d 20 28 6e   mem.nTitle = (n
2bc0: 2b 33 29 26 7e 33 3b 0a 20 20 73 71 6c 69 74 65  +3)&~3;.  sqlite
2bd0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
2be0: 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  m.mutex);.}../*.
2bf0: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
2c00: 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77   indicated and w
2c10: 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c  rite a log of al
2c20: 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  l unfreed memory
2c30: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   .** allocations
2c40: 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a   into that log..
2c50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
2c60: 6d 65 6d 64 65 62 75 67 5f 64 75 6d 70 28 63 6f  memdebug_dump(co
2c70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2c80: 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  ame){.  FILE *ou
2c90: 74 3b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  t;.  struct MemB
2ca0: 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20  lockHdr *pHdr;. 
2cb0: 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 69   void **pBt;.  i
2cc0: 6e 74 20 69 3b 0a 20 20 6f 75 74 20 3d 20 66 6f  nt i;.  out = fo
2cd0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  pen(zFilename, "
2ce0: 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  w");.  if( out==
2cf0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
2d00: 28 73 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61  (stderr, "** Una
2d10: 62 6c 65 20 74 6f 20 6f 75 74 70 75 74 20 6d 65  ble to output me
2d20: 6d 6f 72 79 20 64 65 62 75 67 20 6f 75 74 70 75  mory debug outpu
2d30: 74 20 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c  t log: %s **\n",
2d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d50: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
2d60: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2d70: 0a 20 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d 2e  .  for(pHdr=mem.
2d80: 70 46 69 72 73 74 3b 20 70 48 64 72 3b 20 70 48  pFirst; pHdr; pH
2d90: 64 72 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29 7b  dr=pHdr->pNext){
2da0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
2db0: 63 68 61 72 2a 29 70 48 64 72 3b 0a 20 20 20 20  char*)pHdr;.    
2dc0: 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b  z -= pHdr->nBack
2dd0: 74 72 61 63 65 53 6c 6f 74 73 2a 73 69 7a 65 6f  traceSlots*sizeo
2de0: 66 28 76 6f 69 64 2a 29 20 2b 20 70 48 64 72 2d  f(void*) + pHdr-
2df0: 3e 6e 54 69 74 6c 65 3b 0a 20 20 20 20 66 70 72  >nTitle;.    fpr
2e00: 69 6e 74 66 28 6f 75 74 2c 20 22 2a 2a 2a 2a 20  intf(out, "**** 
2e10: 25 64 20 62 79 74 65 73 20 61 74 20 25 70 20 66  %d bytes at %p f
2e20: 72 6f 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 20  rom %s ****\n", 
2e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 48 64  .            pHd
2e40: 72 2d 3e 69 53 69 7a 65 2c 20 26 70 48 64 72 5b  r->iSize, &pHdr[
2e50: 31 5d 2c 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65  1], pHdr->nTitle
2e60: 20 3f 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20   ? z : "???");. 
2e70: 20 20 20 69 66 28 20 70 48 64 72 2d 3e 6e 42 61     if( pHdr->nBa
2e80: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
2e90: 20 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20   fflush(out);.  
2ea0: 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a      pBt = (void*
2eb0: 2a 29 70 48 64 72 3b 0a 20 20 20 20 20 20 70 42  *)pHdr;.      pB
2ec0: 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b  t -= pHdr->nBack
2ed0: 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20  traceSlots;.    
2ee0: 20 20 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62    backtrace_symb
2ef0: 6f 6c 73 5f 66 64 28 70 42 74 2c 20 70 48 64 72  ols_fd(pBt, pHdr
2f00: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2c 20 66 69  ->nBacktrace, fi
2f10: 6c 65 6e 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20  leno(out));.    
2f20: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
2f30: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
2f40: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
2f50: 43 4f 55 4e 54 53 3a 5c 6e 22 29 3b 0a 20 20 66  COUNTS:\n");.  f
2f60: 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45  or(i=0; i<NCSIZE
2f70: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  -1; i++){.    if
2f80: 28 20 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 69 5d  ( mem.sizeCnt[i]
2f90: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
2fa0: 66 28 6f 75 74 2c 20 22 20 20 20 25 33 64 3a 20  f(out, "   %3d: 
2fb0: 25 64 5c 6e 22 2c 20 69 2a 38 2b 38 2c 20 6d 65  %d\n", i*8+8, me
2fc0: 6d 2e 73 69 7a 65 43 6e 74 5b 69 5d 29 3b 0a 20  m.sizeCnt[i]);. 
2fd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
2fe0: 65 6d 2e 73 69 7a 65 43 6e 74 5b 4e 43 53 49 5a  em.sizeCnt[NCSIZ
2ff0: 45 2d 31 5d 20 29 7b 0a 20 20 20 20 66 70 72 69  E-1] ){.    fpri
3000: 6e 74 66 28 6f 75 74 2c 20 22 20 20 3e 25 33 64  ntf(out, "  >%3d
3010: 3a 20 25 64 5c 6e 22 2c 20 4e 43 53 49 5a 45 2a  : %d\n", NCSIZE*
3020: 38 2c 20 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 4e  8, mem.sizeCnt[N
3030: 43 53 49 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a 20  CSIZE-1]);.  }. 
3040: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a   fclose(out);.}.
3050: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3060: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
3070: 73 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  s sqlite3_malloc
3080: 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
3090: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
30a0: 65 33 5f 6d 65 6d 64 65 62 75 67 5f 6d 61 6c 6c  e3_memdebug_mall
30b0: 6f 63 5f 63 6f 75 6e 74 28 29 7b 0a 20 20 69 6e  oc_count(){.  in
30c0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 6f 74 61  t i;.  int nTota
30d0: 6c 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  l = 0;.  for(i=0
30e0: 3b 20 69 3c 4e 43 53 49 5a 45 3b 20 69 2b 2b 29  ; i<NCSIZE; i++)
30f0: 7b 0a 20 20 20 20 6e 54 6f 74 61 6c 20 2b 3d 20  {.    nTotal += 
3100: 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 69 5d 3b 0a  mem.sizeCnt[i];.
3110: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 54 6f    }.  return nTo
3120: 74 61 6c 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20  tal;.}...#endif 
3130: 2f 2a 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  /* SQLITE_MEMDEB
3140: 55 47 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  UG && !SQLITE_OM
3150: 49 54 5f 4d 45 4d 4f 52 59 5f 41 4c 4c 4f 43 41  IT_MEMORY_ALLOCA
3160: 54 49 4f 4e 20 2a 2f 0a                          TION */.