/ Hex Artifact Content
Login

Artifact 37c410e289cc81e0ca3d76ba803f11973a02638a:


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 34 20 32 30 30 38 2f 30 33 2f  ,v 1.24 2008/03/
0200: 32 38 20 30 37 3a 34 32 3a 35 34 20 64 61 6e 69  28 07:42:54 dani
0210: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f  elk1977 Exp $.*/
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0230: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54  eInt.h"../*.** T
0240: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  his version of t
0250: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0260: 74 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  tor is used only
0270: 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54   if the.** SQLIT
0280: 45 5f 4d 45 4d 44 45 42 55 47 20 6d 61 63 72 6f  E_MEMDEBUG macro
0290: 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2f 0a 23   is defined.*/.#
02a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
02b0: 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  DEBUG../*.** The
02c0: 20 62 61 63 6b 74 72 61 63 65 20 66 75 6e 63 74   backtrace funct
02d0: 69 6f 6e 61 6c 69 74 79 20 69 73 20 6f 6e 6c 79  ionality is only
02e0: 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20   available with 
02f0: 47 4c 49 42 43 0a 2a 2f 0a 23 69 66 64 65 66 20  GLIBC.*/.#ifdef 
0300: 5f 5f 47 4c 49 42 43 5f 5f 0a 20 20 65 78 74 65  __GLIBC__.  exte
0310: 72 6e 20 69 6e 74 20 62 61 63 6b 74 72 61 63 65  rn int backtrace
0320: 28 76 6f 69 64 2a 2a 2c 69 6e 74 29 3b 0a 20 20  (void**,int);.  
0330: 65 78 74 65 72 6e 20 76 6f 69 64 20 62 61 63 6b  extern void back
0340: 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f 66 64  trace_symbols_fd
0350: 28 76 6f 69 64 2a 63 6f 6e 73 74 2a 2c 69 6e 74  (void*const*,int
0360: 2c 69 6e 74 29 3b 0a 23 65 6c 73 65 0a 23 20 64  ,int);.#else.# d
0370: 65 66 69 6e 65 20 62 61 63 6b 74 72 61 63 65 28  efine backtrace(
0380: 41 2c 42 29 20 30 0a 23 20 64 65 66 69 6e 65 20  A,B) 0.# define 
0390: 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c  backtrace_symbol
03a0: 73 5f 66 64 28 41 2c 42 2c 43 29 0a 23 65 6e 64  s_fd(A,B,C).#end
03b0: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  if.#include <std
03c0: 69 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  io.h>../*.** Eac
03d0: 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  h memory allocat
03e0: 69 6f 6e 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74  ion looks like t
03f0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 2d 2d  his:.**.**  ----
0400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 0a 2a 2a 20 20 7c 20 54 69 74 6c 65  ----.**  | Title
0450: 20 7c 20 20 62 61 63 6b 74 72 61 63 65 20 70 6f   |  backtrace po
0460: 69 6e 74 65 72 73 20 7c 20 20 4d 65 6d 42 6c 6f  inters |  MemBlo
0470: 63 6b 48 64 72 20 7c 20 20 61 6c 6c 6f 63 61 74  ckHdr |  allocat
0480: 69 6f 6e 20 7c 20 20 45 6e 64 47 75 61 72 64 20  ion |  EndGuard 
0490: 7c 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  |.**  ----------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
04e0: 2a 0a 2a 2a 20 54 68 65 20 61 70 70 6c 69 63 61  *.** The applica
04f0: 74 69 6f 6e 20 63 6f 64 65 20 73 65 65 73 20 6f  tion code sees o
0500: 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nly a pointer to
0510: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
0520: 20 20 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f 20    We have.** to 
0530: 62 61 63 6b 20 75 70 20 66 72 6f 6d 20 74 68 65  back up from the
0540: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e   allocation poin
0550: 74 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ter to find the 
0560: 4d 65 6d 42 6c 6f 63 6b 48 64 72 2e 20 20 54 68  MemBlockHdr.  Th
0570: 65 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  e.** MemBlockHdr
0580: 20 74 65 6c 6c 73 20 75 73 20 74 68 65 20 73 69   tells us the si
0590: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
05a0: 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d  tion and the num
05b0: 62 65 72 20 6f 66 0a 2a 2a 20 62 61 63 6b 74 72  ber of.** backtr
05c0: 61 63 65 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  ace pointers.  T
05d0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 67  here is also a g
05e0: 75 61 72 64 20 77 6f 72 64 20 61 74 20 74 68 65  uard word at the
05f0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 4d   end of the.** M
0600: 65 6d 42 6c 6f 63 6b 48 64 72 2e 0a 2a 2f 0a 73  emBlockHdr..*/.s
0610: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
0620: 72 20 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  r {.  struct Mem
0630: 42 6c 6f 63 6b 48 64 72 20 2a 70 4e 65 78 74 2c  BlockHdr *pNext,
0640: 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 4c 69 6e   *pPrev;  /* Lin
0650: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
0660: 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 2a  unfreed memory *
0670: 2f 0a 20 20 69 6e 74 20 69 53 69 7a 65 3b 20 20  /.  int iSize;  
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
06a0: 6f 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  of this allocati
06b0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61  on */.  char nBa
06c0: 63 6b 74 72 61 63 65 3b 20 20 20 20 20 20 20 20  cktrace;        
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
06e0: 75 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61  umber of backtra
06f0: 63 65 73 20 6f 6e 20 74 68 69 73 20 61 6c 6c 6f  ces on this allo
0700: 63 20 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61 63  c */.  char nBac
0710: 6b 74 72 61 63 65 53 6c 6f 74 73 3b 20 20 20 20  ktraceSlots;    
0720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76             /* Av
0730: 61 69 6c 61 62 6c 65 20 62 61 63 6b 74 72 61 63  ailable backtrac
0740: 65 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 73 68 6f  e slots */.  sho
0750: 72 74 20 6e 54 69 74 6c 65 3b 20 20 20 20 20 20  rt nTitle;      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 74 69 74   /* Bytes of tit
0780: 6c 65 3b 20 69 6e 63 6c 75 64 65 73 20 27 5c 30  le; includes '\0
0790: 27 20 2a 2f 0a 20 20 69 6e 74 20 69 46 6f 72 65  ' */.  int iFore
07a0: 47 75 61 72 64 3b 20 20 20 20 20 20 20 20 20 20  Guard;          
07b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 75             /* Gu
07c0: 61 72 64 20 77 6f 72 64 20 66 6f 72 20 73 61 6e  ard word for san
07d0: 69 74 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ity */.};../*.**
07e0: 20 47 75 61 72 64 20 77 6f 72 64 73 0a 2a 2f 0a   Guard words.*/.
07f0: 23 64 65 66 69 6e 65 20 46 4f 52 45 47 55 41 52  #define FOREGUAR
0800: 44 20 30 78 38 30 46 35 45 31 35 33 0a 23 64 65  D 0x80F5E153.#de
0810: 66 69 6e 65 20 52 45 41 52 47 55 41 52 44 20 30  fine REARGUARD 0
0820: 78 45 34 36 37 36 42 35 33 0a 0a 2f 2a 0a 2a 2a  xE4676B53../*.**
0830: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   Number of mallo
0840: 63 20 73 69 7a 65 20 69 6e 63 72 65 6d 65 6e 74  c size increment
0850: 73 20 74 6f 20 74 72 61 63 6b 2e 0a 2a 2f 0a 23  s to track..*/.#
0860: 64 65 66 69 6e 65 20 4e 43 53 49 5a 45 20 20 31  define NCSIZE  1
0870: 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f  000../*.** All o
0880: 66 20 74 68 65 20 73 74 61 74 69 63 20 76 61 72  f the static var
0890: 69 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 74  iables used by t
08a0: 68 69 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63  his module are c
08b0: 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f  ollected.** into
08c0: 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74   a single struct
08d0: 75 72 65 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e  ure named "mem".
08e0: 20 20 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65    This is to kee
08f0: 70 20 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20  p the.** static 
0900: 76 61 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69  variables organi
0910: 7a 65 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63  zed and to reduc
0920: 65 20 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c  e namespace poll
0930: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68  ution.** when th
0940: 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d  is module is com
0950: 62 69 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72  bined with other
0960: 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
0970: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
0980: 73 74 72 75 63 74 20 7b 0a 20 20 2f 2a 0a 20 20  struct {.  /*.  
0990: 2a 2a 20 54 68 65 20 61 6c 61 72 6d 20 63 61 6c  ** The alarm cal
09a0: 6c 62 61 63 6b 20 61 6e 64 20 69 74 73 20 61 72  lback and its ar
09b0: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 6d 65  guments.  The me
09c0: 6d 2e 6d 75 74 65 78 20 6c 6f 63 6b 20 77 69 6c  m.mutex lock wil
09d0: 6c 0a 20 20 2a 2a 20 62 65 20 68 65 6c 64 20 77  l.  ** be held w
09e0: 68 69 6c 65 20 74 68 65 20 63 61 6c 6c 62 61 63  hile the callbac
09f0: 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 52  k is running.  R
0a00: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69  ecursive calls i
0a10: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  nto.  ** the mem
0a20: 6f 72 79 20 73 75 62 73 79 73 74 65 6d 20 61 72  ory subsystem ar
0a30: 65 20 61 6c 6c 6f 77 65 64 2c 20 62 75 74 20 6e  e allowed, but n
0a40: 6f 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 73 20  o new callbacks 
0a50: 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 73 73  will be.  ** iss
0a60: 75 65 64 2e 20 20 54 68 65 20 61 6c 61 72 6d 42  ued.  The alarmB
0a70: 75 73 79 20 76 61 72 69 61 62 6c 65 20 69 73 20  usy variable is 
0a80: 73 65 74 20 74 6f 20 70 72 65 76 65 6e 74 20 72  set to prevent r
0a90: 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 63 61  ecursive.  ** ca
0aa0: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
0ab0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6c  sqlite3_int64 al
0ac0: 61 72 6d 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20  armThreshold;.  
0ad0: 76 6f 69 64 20 28 2a 61 6c 61 72 6d 43 61 6c 6c  void (*alarmCall
0ae0: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 20 73 71 6c  back)(void*, sql
0af0: 69 74 65 33 5f 69 6e 74 36 34 2c 20 69 6e 74 29  ite3_int64, int)
0b00: 3b 0a 20 20 76 6f 69 64 20 2a 61 6c 61 72 6d 41  ;.  void *alarmA
0b10: 72 67 3b 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42  rg;.  int alarmB
0b20: 75 73 79 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  usy;.  .  /*.  *
0b30: 2a 20 4d 75 74 65 78 20 74 6f 20 63 6f 6e 74 72  * Mutex to contr
0b40: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
0b50: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b60: 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  on subsystem..  
0b70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
0b80: 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 0a 20 20  ex *mutex;.  .  
0b90: 2f 2a 0a 20 20 2a 2a 20 43 75 72 72 65 6e 74 20  /*.  ** Current 
0ba0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 68  allocation and h
0bb0: 69 67 68 2d 77 61 74 65 72 20 6d 61 72 6b 2e 0a  igh-water mark..
0bc0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69    */.  sqlite3_i
0bd0: 6e 74 36 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20  nt64 nowUsed;.  
0be0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78  sqlite3_int64 mx
0bf0: 55 73 65 64 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20  Used;.  .  /*.  
0c00: 2a 2a 20 48 65 61 64 20 61 6e 64 20 74 61 69 6c  ** Head and tail
0c10: 20 6f 66 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   of a linked lis
0c20: 74 20 6f 66 20 61 6c 6c 20 6f 75 74 73 74 61 6e  t of all outstan
0c30: 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  ding allocations
0c40: 0a 20 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4d  .  */.  struct M
0c50: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 46 69 72  emBlockHdr *pFir
0c60: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  st;.  struct Mem
0c70: 42 6c 6f 63 6b 48 64 72 20 2a 70 4c 61 73 74 3b  BlockHdr *pLast;
0c80: 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  .  .  /*.  ** Th
0c90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
0ca0: 6c 73 20 6f 66 20 62 61 63 6b 74 72 61 63 65 20  ls of backtrace 
0cb0: 74 6f 20 73 61 76 65 20 69 6e 20 6e 65 77 20 61  to save in new a
0cc0: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  llocations..  */
0cd0: 0a 20 20 69 6e 74 20 6e 42 61 63 6b 74 72 61 63  .  int nBacktrac
0ce0: 65 3b 0a 20 20 76 6f 69 64 20 28 2a 78 42 61 63  e;.  void (*xBac
0cf0: 6b 74 72 61 63 65 29 28 69 6e 74 2c 20 69 6e 74  ktrace)(int, int
0d00: 2c 20 76 6f 69 64 20 2a 2a 29 3b 0a 0a 20 20 2f  , void **);..  /
0d10: 2a 0a 20 20 2a 2a 20 54 69 74 6c 65 20 74 65 78  *.  ** Title tex
0d20: 74 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 20 66  t to insert in f
0d30: 72 6f 6e 74 20 6f 66 20 65 61 63 68 20 62 6c 6f  ront of each blo
0d40: 63 6b 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ck.  */.  int nT
0d50: 69 74 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  itle;        /* 
0d60: 42 79 74 65 73 20 6f 66 20 7a 54 69 74 6c 65 20  Bytes of zTitle 
0d70: 74 6f 20 73 61 76 65 2e 20 20 49 6e 63 6c 75 64  to save.  Includ
0d80: 65 73 20 27 5c 30 27 20 61 6e 64 20 70 61 64 64  es '\0' and padd
0d90: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ing */.  char zT
0da0: 69 74 6c 65 5b 31 30 30 5d 3b 20 20 2f 2a 20 54  itle[100];  /* T
0db0: 68 65 20 74 69 74 6c 65 20 74 65 78 74 20 2a 2f  he title text */
0dc0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 73 71 6c  ..  /* .  ** sql
0dd0: 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c  ite3MallocDisall
0de0: 6f 77 28 29 20 69 6e 63 72 65 6d 65 6e 74 73 20  ow() increments 
0df0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
0e00: 75 6e 74 65 72 2e 0a 20 20 2a 2a 20 73 71 6c 69  unter..  ** sqli
0e10: 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29  te3MallocAllow()
0e20: 20 64 65 63 72 65 6d 65 6e 74 73 20 69 74 2e 0a   decrements it..
0e30: 20 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 61 6c    */.  int disal
0e40: 6c 6f 77 3b 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  low; /* Do not a
0e50: 6c 6c 6f 77 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  llow memory allo
0e60: 63 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 0a  cation */..  /*.
0e70: 20 20 2a 2a 20 47 61 74 68 65 72 20 73 74 61 74    ** Gather stat
0e80: 69 73 74 69 63 73 20 6f 6e 20 74 68 65 20 73 69  istics on the si
0e90: 7a 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c  zes of memory al
0ea0: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  locations..  ** 
0eb0: 73 69 7a 65 43 6e 74 5b 69 5d 20 69 73 20 74 68  sizeCnt[i] is th
0ec0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f  e number of allo
0ed0: 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  cation attempts 
0ee0: 6f 66 20 69 2a 38 0a 20 20 2a 2a 20 62 79 74 65  of i*8.  ** byte
0ef0: 73 2e 20 20 69 3d 3d 4e 43 53 49 5a 45 20 69 73  s.  i==NCSIZE is
0f00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
0f10: 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
0f20: 74 73 20 66 6f 72 0a 20 20 2a 2a 20 73 69 7a 65  ts for.  ** size
0f30: 73 20 6d 6f 72 65 20 74 68 61 6e 20 4e 43 53 49  s more than NCSI
0f40: 5a 45 2a 38 20 62 79 74 65 73 2e 0a 20 20 2a 2f  ZE*8 bytes..  */
0f50: 0a 20 20 69 6e 74 20 73 69 7a 65 43 6e 74 5b 4e  .  int sizeCnt[N
0f60: 43 53 49 5a 45 5d 3b 0a 0a 7d 20 6d 65 6d 3b 0a  CSIZE];..} mem;.
0f70: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 74 65 72 20 74 68  ../*.** Enter th
0f80: 65 20 6d 75 74 65 78 20 6d 65 6d 2e 6d 75 74 65  e mutex mem.mute
0f90: 78 2e 20 41 6c 6c 6f 63 61 74 65 20 69 74 20 69  x. Allocate it i
0fa0: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
0fb0: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  ady allocated..*
0fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e  /.static void en
0fd0: 74 65 72 4d 65 6d 28 76 6f 69 64 29 7b 0a 20 20  terMem(void){.  
0fe0: 69 66 28 20 6d 65 6d 2e 6d 75 74 65 78 3d 3d 30  if( mem.mutex==0
0ff0: 20 29 7b 0a 20 20 20 20 6d 65 6d 2e 6d 75 74 65   ){.    mem.mute
1000: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
1010: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
1020: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29  UTEX_STATIC_MEM)
1030: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1040: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e  mutex_enter(mem.
1050: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mutex);.}../*.**
1060: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1070: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72  nt of memory cur
1080: 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f  rently checked o
1090: 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ut..*/.sqlite3_i
10a0: 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d 65 6d  nt64 sqlite3_mem
10b0: 6f 72 79 5f 75 73 65 64 28 76 6f 69 64 29 7b 0a  ory_used(void){.
10c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10d0: 6e 3b 0a 20 20 65 6e 74 65 72 4d 65 6d 28 29 3b  n;.  enterMem();
10e0: 0a 20 20 6e 20 3d 20 6d 65 6d 2e 6e 6f 77 55 73  .  n = mem.nowUs
10f0: 65 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ed;.  sqlite3_mu
1100: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75  tex_leave(mem.mu
1110: 74 65 78 29 3b 20 20 0a 20 20 72 65 74 75 72 6e  tex);  .  return
1120: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
1130: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
1140: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
1150: 20 74 68 61 74 20 68 61 73 20 65 76 65 72 20 62   that has ever b
1160: 65 65 6e 0a 2a 2a 20 63 68 65 63 6b 65 64 20 6f  een.** checked o
1170: 75 74 20 73 69 6e 63 65 20 65 69 74 68 65 72 20  ut since either 
1180: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1190: 20 74 68 69 73 20 70 72 6f 63 65 73 73 0a 2a 2a   this process.**
11a0: 20 6f 72 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   or since the mo
11b0: 73 74 20 72 65 63 65 6e 74 20 72 65 73 65 74 2e  st recent reset.
11c0: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
11d0: 34 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  4 sqlite3_memory
11e0: 5f 68 69 67 68 77 61 74 65 72 28 69 6e 74 20 72  _highwater(int r
11f0: 65 73 65 74 46 6c 61 67 29 7b 0a 20 20 73 71 6c  esetFlag){.  sql
1200: 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 20 20  ite3_int64 n;.  
1210: 65 6e 74 65 72 4d 65 6d 28 29 3b 0a 20 20 6e 20  enterMem();.  n 
1220: 3d 20 6d 65 6d 2e 6d 78 55 73 65 64 3b 0a 20 20  = mem.mxUsed;.  
1230: 69 66 28 20 72 65 73 65 74 46 6c 61 67 20 29 7b  if( resetFlag ){
1240: 0a 20 20 20 20 6d 65 6d 2e 6d 78 55 73 65 64 20  .    mem.mxUsed 
1250: 3d 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20  = mem.nowUsed;. 
1260: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1270: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
1280: 65 78 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20  ex);  .  return 
1290: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
12a0: 67 65 20 74 68 65 20 61 6c 61 72 6d 20 63 61 6c  ge the alarm cal
12b0: 6c 62 61 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lback.*/.int sql
12c0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72  ite3_memory_alar
12d0: 6d 28 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c  m(.  void(*xCall
12e0: 62 61 63 6b 29 28 76 6f 69 64 20 2a 70 41 72 67  back)(void *pArg
12f0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
1300: 75 73 65 64 2c 20 69 6e 74 20 4e 29 2c 0a 20 20  used, int N),.  
1310: 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 73 71  void *pArg,.  sq
1320: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 54 68 72  lite3_int64 iThr
1330: 65 73 68 6f 6c 64 0a 29 7b 0a 20 20 65 6e 74 65  eshold.){.  ente
1340: 72 4d 65 6d 28 29 3b 0a 20 20 6d 65 6d 2e 61 6c  rMem();.  mem.al
1350: 61 72 6d 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  armCallback = xC
1360: 61 6c 6c 62 61 63 6b 3b 0a 20 20 6d 65 6d 2e 61  allback;.  mem.a
1370: 6c 61 72 6d 41 72 67 20 3d 20 70 41 72 67 3b 0a  larmArg = pArg;.
1380: 20 20 6d 65 6d 2e 61 6c 61 72 6d 54 68 72 65 73    mem.alarmThres
1390: 68 6f 6c 64 20 3d 20 69 54 68 72 65 73 68 6f 6c  hold = iThreshol
13a0: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
13b0: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
13c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
13d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13e0: 2a 20 54 72 69 67 67 65 72 20 74 68 65 20 61 6c  * Trigger the al
13f0: 61 72 6d 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  arm .*/.static v
1400: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 73 79  oid sqlite3Memsy
1410: 73 41 6c 61 72 6d 28 69 6e 74 20 6e 42 79 74 65  sAlarm(int nByte
1420: 29 7b 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  ){.  void (*xCal
1430: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 73 71 6c  lback)(void*,sql
1440: 69 74 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b  ite3_int64,int);
1450: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1460: 20 6e 6f 77 55 73 65 64 3b 0a 20 20 76 6f 69 64   nowUsed;.  void
1470: 20 2a 70 41 72 67 3b 0a 20 20 69 66 28 20 6d 65   *pArg;.  if( me
1480: 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3d  m.alarmCallback=
1490: 3d 30 20 7c 7c 20 6d 65 6d 2e 61 6c 61 72 6d 42  =0 || mem.alarmB
14a0: 75 73 79 20 20 29 20 72 65 74 75 72 6e 3b 0a 20  usy  ) return;. 
14b0: 20 6d 65 6d 2e 61 6c 61 72 6d 42 75 73 79 20 3d   mem.alarmBusy =
14c0: 20 31 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 20   1;.  xCallback 
14d0: 3d 20 6d 65 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62  = mem.alarmCallb
14e0: 61 63 6b 3b 0a 20 20 6e 6f 77 55 73 65 64 20 3d  ack;.  nowUsed =
14f0: 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20   mem.nowUsed;.  
1500: 70 41 72 67 20 3d 20 6d 65 6d 2e 61 6c 61 72 6d  pArg = mem.alarm
1510: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
1520: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d  utex_leave(mem.m
1530: 75 74 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62 61  utex);.  xCallba
1540: 63 6b 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64  ck(pArg, nowUsed
1550: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c 69  , nByte);.  sqli
1560: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1570: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65  mem.mutex);.  me
1580: 6d 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 30 3b  m.alarmBusy = 0;
1590: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
15a0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 66  an allocation, f
15b0: 69 6e 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b  ind the MemBlock
15c0: 48 64 72 20 66 6f 72 20 74 68 61 74 20 61 6c 6c  Hdr for that all
15d0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
15e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
15f0: 6b 73 20 74 68 65 20 67 75 61 72 64 73 20 61 74  ks the guards at
1600: 20 65 69 74 68 65 72 20 65 6e 64 20 6f 66 20 74   either end of t
1610: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e  he allocation an
1620: 64 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65  d.** if they are
1630: 20 69 6e 63 6f 72 72 65 63 74 20 69 74 20 61 73   incorrect it as
1640: 73 65 72 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  serts..*/.static
1650: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
1660: 48 64 72 20 2a 73 71 6c 69 74 65 33 4d 65 6d 73  Hdr *sqlite3Mems
1670: 79 73 47 65 74 48 65 61 64 65 72 28 76 6f 69 64  ysGetHeader(void
1680: 20 2a 70 41 6c 6c 6f 63 61 74 69 6f 6e 29 7b 0a   *pAllocation){.
1690: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
16a0: 6b 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a  kHdr *p;.  int *
16b0: 70 49 6e 74 3b 0a 0a 20 20 70 20 3d 20 28 73 74  pInt;..  p = (st
16c0: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
16d0: 2a 29 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20  *)pAllocation;. 
16e0: 20 70 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20   p--;.  assert( 
16f0: 70 2d 3e 69 46 6f 72 65 47 75 61 72 64 3d 3d 46  p->iForeGuard==F
1700: 4f 52 45 47 55 41 52 44 20 29 3b 0a 20 20 61 73  OREGUARD );.  as
1710: 73 65 72 74 28 20 28 70 2d 3e 69 53 69 7a 65 20  sert( (p->iSize 
1720: 26 20 33 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e  & 3)==0 );.  pIn
1730: 74 20 3d 20 28 69 6e 74 2a 29 70 41 6c 6c 6f 63  t = (int*)pAlloc
1740: 61 74 69 6f 6e 3b 0a 20 20 61 73 73 65 72 74 28  ation;.  assert(
1750: 20 70 49 6e 74 5b 70 2d 3e 69 53 69 7a 65 2f 73   pInt[p->iSize/s
1760: 69 7a 65 6f 66 28 69 6e 74 29 5d 3d 3d 52 45 41  izeof(int)]==REA
1770: 52 47 55 41 52 44 20 29 3b 0a 20 20 72 65 74 75  RGUARD );.  retu
1780: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
1790: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17a0: 20 6f 66 20 62 79 74 65 73 20 63 75 72 72 65 6e   of bytes curren
17b0: 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 74  tly allocated at
17c0: 20 61 64 64 72 65 73 73 20 70 2e 0a 2a 2f 0a 69   address p..*/.i
17d0: 6e 74 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  nt sqlite3Malloc
17e0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
17f0: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
1800: 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 69 66 28  Hdr *pHdr;.  if(
1810: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
1820: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 48 64 72 20  n 0;.  }.  pHdr 
1830: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47  = sqlite3MemsysG
1840: 65 74 48 65 61 64 65 72 28 70 29 3b 0a 20 20 72  etHeader(p);.  r
1850: 65 74 75 72 6e 20 70 48 64 72 2d 3e 69 53 69 7a  eturn pHdr->iSiz
1860: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  e;.}../*.** Allo
1870: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
1880: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76   of memory..*/.v
1890: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c  oid *sqlite3_mal
18a0: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a  loc(int nByte){.
18b0: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
18c0: 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f  kHdr *pHdr;.  vo
18d0: 69 64 20 2a 2a 70 42 74 3b 0a 20 20 63 68 61 72  id **pBt;.  char
18e0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 2a 70 49 6e 74   *z;.  int *pInt
18f0: 3b 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b  ;.  void *p = 0;
1900: 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
1910: 3b 0a 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 30  ;..  if( nByte>0
1920: 20 29 7b 0a 20 20 20 20 65 6e 74 65 72 4d 65 6d   ){.    enterMem
1930: 28 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ();.    assert( 
1940: 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 3d 3d 30 20  mem.disallow==0 
1950: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e 61  );.    if( mem.a
1960: 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 21 3d 30 20  larmCallback!=0 
1970: 26 26 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 2b 6e  && mem.nowUsed+n
1980: 42 79 74 65 3e 3d 6d 65 6d 2e 61 6c 61 72 6d 54  Byte>=mem.alarmT
1990: 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20  hreshold ){.    
19a0: 20 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 41    sqlite3MemsysA
19b0: 6c 61 72 6d 28 6e 42 79 74 65 29 3b 0a 20 20 20  larm(nByte);.   
19c0: 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28   }.    nByte = (
19d0: 6e 42 79 74 65 2b 33 29 26 7e 33 3b 0a 20 20 20  nByte+3)&~3;.   
19e0: 20 69 66 28 20 6e 42 79 74 65 2f 38 3e 4e 43 53   if( nByte/8>NCS
19f0: 49 5a 45 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  IZE-1 ){.      m
1a00: 65 6d 2e 73 69 7a 65 43 6e 74 5b 4e 43 53 49 5a  em.sizeCnt[NCSIZ
1a10: 45 2d 31 5d 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  E-1]++;.    }els
1a20: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 73 69 7a  e{.      mem.siz
1a30: 65 43 6e 74 5b 6e 42 79 74 65 2f 38 5d 2b 2b 3b  eCnt[nByte/8]++;
1a40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 6f 74 61 6c  .    }.    total
1a50: 53 69 7a 65 20 3d 20 6e 42 79 74 65 20 2b 20 73  Size = nByte + s
1a60: 69 7a 65 6f 66 28 2a 70 48 64 72 29 20 2b 20 73  izeof(*pHdr) + s
1a70: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20  izeof(int) +.   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
1a90: 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2a 73 69 7a  m.nBacktrace*siz
1aa0: 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 6d 65 6d  eof(void*) + mem
1ab0: 2e 6e 54 69 74 6c 65 3b 0a 20 20 20 20 69 66 28  .nTitle;.    if(
1ac0: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 74 65   sqlite3FaultSte
1ad0: 70 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  p(SQLITE_FAULTIN
1ae0: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 20 29  JECTOR_MALLOC) )
1af0: 7b 0a 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20  {.      p = 0;. 
1b00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b10: 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f 74 61 6c  p = malloc(total
1b20: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
1b30: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   p==0 ){.       
1b40: 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 41 6c   sqlite3MemsysAl
1b50: 61 72 6d 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  arm(nByte);.    
1b60: 20 20 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74      p = malloc(t
1b70: 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  otalSize);.     
1b80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b90: 20 70 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20   p ){.      z = 
1ba0: 70 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20 28  p;.      pBt = (
1bb0: 76 6f 69 64 2a 2a 29 26 7a 5b 6d 65 6d 2e 6e 54  void**)&z[mem.nT
1bc0: 69 74 6c 65 5d 3b 0a 20 20 20 20 20 20 70 48 64  itle];.      pHd
1bd0: 72 20 3d 20 28 73 74 72 75 63 74 20 4d 65 6d 42  r = (struct MemB
1be0: 6c 6f 63 6b 48 64 72 2a 29 26 70 42 74 5b 6d 65  lockHdr*)&pBt[me
1bf0: 6d 2e 6e 42 61 63 6b 74 72 61 63 65 5d 3b 0a 20  m.nBacktrace];. 
1c00: 20 20 20 20 20 70 48 64 72 2d 3e 70 4e 65 78 74       pHdr->pNext
1c10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 64 72   = 0;.      pHdr
1c20: 2d 3e 70 50 72 65 76 20 3d 20 6d 65 6d 2e 70 4c  ->pPrev = mem.pL
1c30: 61 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  ast;.      if( m
1c40: 65 6d 2e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  em.pLast ){.    
1c50: 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 2d 3e 70      mem.pLast->p
1c60: 4e 65 78 74 20 3d 20 70 48 64 72 3b 0a 20 20 20  Next = pHdr;.   
1c70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c80: 20 20 6d 65 6d 2e 70 46 69 72 73 74 20 3d 20 70    mem.pFirst = p
1c90: 48 64 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Hdr;.      }.   
1ca0: 20 20 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70     mem.pLast = p
1cb0: 48 64 72 3b 0a 20 20 20 20 20 20 70 48 64 72 2d  Hdr;.      pHdr-
1cc0: 3e 69 46 6f 72 65 47 75 61 72 64 20 3d 20 46 4f  >iForeGuard = FO
1cd0: 52 45 47 55 41 52 44 3b 0a 20 20 20 20 20 20 70  REGUARD;.      p
1ce0: 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53  Hdr->nBacktraceS
1cf0: 6c 6f 74 73 20 3d 20 6d 65 6d 2e 6e 42 61 63 6b  lots = mem.nBack
1d00: 74 72 61 63 65 3b 0a 20 20 20 20 20 20 70 48 64  trace;.      pHd
1d10: 72 2d 3e 6e 54 69 74 6c 65 20 3d 20 6d 65 6d 2e  r->nTitle = mem.
1d20: 6e 54 69 74 6c 65 3b 0a 20 20 20 20 20 20 69 66  nTitle;.      if
1d30: 28 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65  ( mem.nBacktrace
1d40: 20 29 7b 0a 20 20 20 20 20 20 20 20 76 6f 69 64   ){.        void
1d50: 20 2a 61 41 64 64 72 5b 34 30 5d 3b 0a 20 20 20   *aAddr[40];.   
1d60: 20 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b       pHdr->nBack
1d70: 74 72 61 63 65 20 3d 20 62 61 63 6b 74 72 61 63  trace = backtrac
1d80: 65 28 61 41 64 64 72 2c 20 6d 65 6d 2e 6e 42 61  e(aAddr, mem.nBa
1d90: 63 6b 74 72 61 63 65 2b 31 29 2d 31 3b 0a 20 20  cktrace+1)-1;.  
1da0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 74        memcpy(pBt
1db0: 2c 20 26 61 41 64 64 72 5b 31 5d 2c 20 70 48 64  , &aAddr[1], pHd
1dc0: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2a 73 69  r->nBacktrace*si
1dd0: 7a 65 6f 66 28 76 6f 69 64 2a 29 29 3b 0a 09 69  zeof(void*));..i
1de0: 66 28 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63  f( mem.xBacktrac
1df0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  e ){.          m
1e00: 65 6d 2e 78 42 61 63 6b 74 72 61 63 65 28 6e 42  em.xBacktrace(nB
1e10: 79 74 65 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b  yte, pHdr->nBack
1e20: 74 72 61 63 65 2d 31 2c 20 26 61 41 64 64 72 5b  trace-1, &aAddr[
1e30: 31 5d 29 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  1]);..}.      }e
1e40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 48 64  lse{.        pHd
1e50: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20  r->nBacktrace = 
1e60: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1e70: 20 69 66 28 20 6d 65 6d 2e 6e 54 69 74 6c 65 20   if( mem.nTitle 
1e80: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1e90: 79 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c  y(z, mem.zTitle,
1ea0: 20 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b 0a 20 20   mem.nTitle);.  
1eb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 48 64 72      }.      pHdr
1ec0: 2d 3e 69 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b  ->iSize = nByte;
1ed0: 0a 20 20 20 20 20 20 70 49 6e 74 20 3d 20 28 69  .      pInt = (i
1ee0: 6e 74 2a 29 26 70 48 64 72 5b 31 5d 3b 0a 20 20  nt*)&pHdr[1];.  
1ef0: 20 20 20 20 70 49 6e 74 5b 6e 42 79 74 65 2f 73      pInt[nByte/s
1f00: 69 7a 65 6f 66 28 69 6e 74 29 5d 20 3d 20 52 45  izeof(int)] = RE
1f10: 41 52 47 55 41 52 44 3b 0a 20 20 20 20 20 20 6d  ARGUARD;.      m
1f20: 65 6d 73 65 74 28 70 49 6e 74 2c 20 30 78 36 35  emset(pInt, 0x65
1f30: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1f40: 6d 65 6d 2e 6e 6f 77 55 73 65 64 20 2b 3d 20 6e  mem.nowUsed += n
1f50: 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Byte;.      if( 
1f60: 6d 65 6d 2e 6e 6f 77 55 73 65 64 3e 6d 65 6d 2e  mem.nowUsed>mem.
1f70: 6d 78 55 73 65 64 20 29 7b 0a 20 20 20 20 20 20  mxUsed ){.      
1f80: 20 20 6d 65 6d 2e 6d 78 55 73 65 64 20 3d 20 6d    mem.mxUsed = m
1f90: 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20 20 20  em.nowUsed;.    
1fa0: 20 20 7d 0a 20 20 20 20 20 20 70 20 3d 20 28 76    }.      p = (v
1fb0: 6f 69 64 2a 29 70 49 6e 74 3b 0a 20 20 20 20 7d  oid*)pInt;.    }
1fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1fd0: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
1fe0: 65 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ex);.  }.  retur
1ff0: 6e 20 70 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n p; .}../*.** F
2000: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76  ree memory..*/.v
2010: 6f 69 64 20 73 71 6c 69 74 65 33 5f 66 72 65 65  oid sqlite3_free
2020: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a  (void *pPrior){.
2030: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
2040: 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f  kHdr *pHdr;.  vo
2050: 69 64 20 2a 2a 70 42 74 3b 0a 20 20 63 68 61 72  id **pBt;.  char
2060: 20 2a 7a 3b 0a 20 20 69 66 28 20 70 50 72 69 6f   *z;.  if( pPrio
2070: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
2080: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
2090: 28 20 6d 65 6d 2e 6d 75 74 65 78 21 3d 30 20 29  ( mem.mutex!=0 )
20a0: 3b 0a 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74  ;.  pHdr = sqlit
20b0: 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65  e3MemsysGetHeade
20c0: 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70 42 74  r(pPrior);.  pBt
20d0: 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b   = (void**)pHdr;
20e0: 0a 20 20 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e  .  pBt -= pHdr->
20f0: 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b  nBacktraceSlots;
2100: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2110: 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78  _enter(mem.mutex
2120: 29 3b 0a 20 20 6d 65 6d 2e 6e 6f 77 55 73 65 64  );.  mem.nowUsed
2130: 20 2d 3d 20 70 48 64 72 2d 3e 69 53 69 7a 65 3b   -= pHdr->iSize;
2140: 0a 20 20 69 66 28 20 70 48 64 72 2d 3e 70 50 72  .  if( pHdr->pPr
2150: 65 76 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ev ){.    assert
2160: 28 20 70 48 64 72 2d 3e 70 50 72 65 76 2d 3e 70  ( pHdr->pPrev->p
2170: 4e 65 78 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20  Next==pHdr );.  
2180: 20 20 70 48 64 72 2d 3e 70 50 72 65 76 2d 3e 70    pHdr->pPrev->p
2190: 4e 65 78 74 20 3d 20 70 48 64 72 2d 3e 70 4e 65  Next = pHdr->pNe
21a0: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
21b0: 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 46 69   assert( mem.pFi
21c0: 72 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20  rst==pHdr );.   
21d0: 20 6d 65 6d 2e 70 46 69 72 73 74 20 3d 20 70 48   mem.pFirst = pH
21e0: 64 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  dr->pNext;.  }. 
21f0: 20 69 66 28 20 70 48 64 72 2d 3e 70 4e 65 78 74   if( pHdr->pNext
2200: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2210: 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pHdr->pNext->pPr
2220: 65 76 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20  ev==pHdr );.    
2230: 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pHdr->pNext->pPr
2240: 65 76 20 3d 20 70 48 64 72 2d 3e 70 50 72 65 76  ev = pHdr->pPrev
2250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2260: 73 73 65 72 74 28 20 6d 65 6d 2e 70 4c 61 73 74  ssert( mem.pLast
2270: 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 6d 65  ==pHdr );.    me
2280: 6d 2e 70 4c 61 73 74 20 3d 20 70 48 64 72 2d 3e  m.pLast = pHdr->
2290: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 7a 20 3d  pPrev;.  }.  z =
22a0: 20 28 63 68 61 72 2a 29 70 42 74 3b 0a 20 20 7a   (char*)pBt;.  z
22b0: 20 2d 3d 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65   -= pHdr->nTitle
22c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 2c 20 30 78  ;.  memset(z, 0x
22d0: 32 62 2c 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a  2b, sizeof(void*
22e0: 29 2a 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  )*pHdr->nBacktra
22f0: 63 65 53 6c 6f 74 73 20 2b 20 73 69 7a 65 6f 66  ceSlots + sizeof
2300: 28 2a 70 48 64 72 29 20 2b 0a 20 20 20 20 20 20  (*pHdr) +.      
2310: 20 20 20 20 20 20 20 20 20 20 20 20 70 48 64 72              pHdr
2320: 2d 3e 69 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66  ->iSize + sizeof
2330: 28 69 6e 74 29 20 2b 20 70 48 64 72 2d 3e 6e 54  (int) + pHdr->nT
2340: 69 74 6c 65 29 3b 0a 20 20 66 72 65 65 28 7a 29  itle);.  free(z)
2350: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2360: 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65  x_leave(mem.mute
2370: 78 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  x);  .}../*.** C
2380: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
2390: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65  f an existing me
23a0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
23b0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20  .**.** For this 
23c0: 64 65 62 75 67 67 69 6e 67 20 69 6d 70 6c 65 6d  debugging implem
23d0: 65 6e 74 61 74 69 6f 6e 2c 20 77 65 20 2a 61 6c  entation, we *al
23e0: 77 61 79 73 2a 20 6d 61 6b 65 20 61 20 63 6f 70  ways* make a cop
23f0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f  y of the.** allo
2400: 63 61 74 69 6f 6e 20 69 6e 74 6f 20 61 20 6e 65  cation into a ne
2410: 77 20 70 6c 61 63 65 20 69 6e 20 6d 65 6d 6f 72  w place in memor
2420: 79 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  y.  In this way,
2430: 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 69 67 68   if the .** high
2440: 65 72 20 6c 65 76 65 6c 20 63 6f 64 65 20 69 73  er level code is
2450: 20 75 73 69 6e 67 20 70 6f 69 6e 74 65 72 20 74   using pointer t
2460: 6f 20 74 68 65 20 6f 6c 64 20 61 6c 6c 6f 63 61  o the old alloca
2470: 74 69 6f 6e 2c 20 69 74 20 69 73 20 0a 2a 2a 20  tion, it is .** 
2480: 6d 75 63 68 20 6d 6f 72 65 20 6c 69 6b 65 6c 79  much more likely
2490: 20 74 6f 20 62 72 65 61 6b 20 61 6e 64 20 77 65   to break and we
24a0: 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 20 6c   are much more l
24b0: 69 6b 69 6e 67 20 74 6f 20 66 69 6e 64 0a 2a 2a  iking to find.**
24c0: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76   the error..*/.v
24d0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 65 61  oid *sqlite3_rea
24e0: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
24f0: 72 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  r, int nByte){. 
2500: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
2510: 48 64 72 20 2a 70 4f 6c 64 48 64 72 3b 0a 20 20  Hdr *pOldHdr;.  
2520: 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 69 66  void *pNew;.  if
2530: 28 20 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ( pPrior==0 ){. 
2540: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2550: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
2560: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65  .  }.  if( nByte
2570: 3c 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  <=0 ){.    sqlit
2580: 65 33 5f 66 72 65 65 28 70 50 72 69 6f 72 29 3b  e3_free(pPrior);
2590: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
25a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d   }.  assert( mem
25b0: 2e 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a  .disallow==0 );.
25c0: 20 20 70 4f 6c 64 48 64 72 20 3d 20 73 71 6c 69    pOldHdr = sqli
25d0: 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64  te3MemsysGetHead
25e0: 65 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  er(pPrior);.  pN
25f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
2600: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  loc(nByte);.  if
2610: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65  ( pNew ){.    me
2620: 6d 63 70 79 28 70 4e 65 77 2c 20 70 50 72 69 6f  mcpy(pNew, pPrio
2630: 72 2c 20 6e 42 79 74 65 3c 70 4f 6c 64 48 64 72  r, nByte<pOldHdr
2640: 2d 3e 69 53 69 7a 65 20 3f 20 6e 42 79 74 65 20  ->iSize ? nByte 
2650: 3a 20 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65  : pOldHdr->iSize
2660: 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
2670: 3e 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 20  >pOldHdr->iSize 
2680: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
2690: 26 28 28 63 68 61 72 2a 29 70 4e 65 77 29 5b 70  &((char*)pNew)[p
26a0: 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 5d 2c 20  OldHdr->iSize], 
26b0: 30 78 32 62 2c 20 6e 42 79 74 65 20 2d 20 70 4f  0x2b, nByte - pO
26c0: 6c 64 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20  ldHdr->iSize);. 
26d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26e0: 5f 66 72 65 65 28 70 50 72 69 6f 72 29 3b 0a 20  _free(pPrior);. 
26f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
2700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 61 63  he number of bac
2720: 6b 74 72 61 63 65 20 6c 65 76 65 6c 73 20 6b 65  ktrace levels ke
2730: 70 74 20 66 6f 72 20 65 61 63 68 20 61 6c 6c 6f  pt for each allo
2740: 63 61 74 69 6f 6e 2e 0a 2a 2a 20 41 20 76 61 6c  cation..** A val
2750: 75 65 20 6f 66 20 7a 65 72 6f 20 74 75 72 6e 73  ue of zero turns
2760: 20 6f 66 20 62 61 63 6b 74 72 61 63 69 6e 67 2e   of backtracing.
2770: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 69 73 20    The number is 
2780: 61 6c 77 61 79 73 20 72 6f 75 6e 64 65 64 0a 2a  always rounded.*
2790: 2a 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69 70  * up to a multip
27a0: 6c 65 20 6f 66 20 32 2e 0a 2a 2f 0a 76 6f 69 64  le of 2..*/.void
27b0: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
27c0: 42 61 63 6b 74 72 61 63 65 28 69 6e 74 20 64 65  Backtrace(int de
27d0: 70 74 68 29 7b 0a 20 20 69 66 28 20 64 65 70 74  pth){.  if( dept
27e0: 68 3c 30 20 29 7b 20 64 65 70 74 68 20 3d 20 30  h<0 ){ depth = 0
27f0: 3b 20 7d 0a 20 20 69 66 28 20 64 65 70 74 68 3e  ; }.  if( depth>
2800: 32 30 20 29 7b 20 64 65 70 74 68 20 3d 20 32 30  20 ){ depth = 20
2810: 3b 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 28 64  ; }.  depth = (d
2820: 65 70 74 68 2b 31 29 26 30 78 66 65 3b 0a 20 20  epth+1)&0xfe;.  
2830: 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 20 3d  mem.nBacktrace =
2840: 20 64 65 70 74 68 3b 0a 7d 0a 0a 76 6f 69 64 20   depth;.}..void 
2850: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42  sqlite3MemdebugB
2860: 61 63 6b 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  acktraceCallback
2870: 28 76 6f 69 64 20 28 2a 78 42 61 63 6b 74 72 61  (void (*xBacktra
2880: 63 65 29 28 69 6e 74 2c 20 69 6e 74 2c 20 76 6f  ce)(int, int, vo
2890: 69 64 20 2a 2a 29 29 7b 0a 20 20 6d 65 6d 2e 78  id **)){.  mem.x
28a0: 42 61 63 6b 74 72 61 63 65 20 3d 20 78 42 61 63  Backtrace = xBac
28b0: 6b 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ktrace;.}../*.**
28c0: 20 53 65 74 20 74 68 65 20 74 69 74 6c 65 20 73   Set the title s
28d0: 74 72 69 6e 67 20 66 6f 72 20 73 75 62 73 65 71  tring for subseq
28e0: 75 65 6e 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  uent allocations
28f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2900: 33 4d 65 6d 64 65 62 75 67 53 65 74 74 69 74 6c  3MemdebugSettitl
2910: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
2920: 69 74 6c 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  itle){.  int n =
2930: 20 73 74 72 6c 65 6e 28 7a 54 69 74 6c 65 29 20   strlen(zTitle) 
2940: 2b 20 31 3b 0a 20 20 65 6e 74 65 72 4d 65 6d 28  + 1;.  enterMem(
2950: 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  );.  if( n>=size
2960: 6f 66 28 6d 65 6d 2e 7a 54 69 74 6c 65 29 20 29  of(mem.zTitle) )
2970: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 65 6d 2e   n = sizeof(mem.
2980: 7a 54 69 74 6c 65 29 2d 31 3b 0a 20 20 6d 65 6d  zTitle)-1;.  mem
2990: 63 70 79 28 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20  cpy(mem.zTitle, 
29a0: 7a 54 69 74 6c 65 2c 20 6e 29 3b 0a 20 20 6d 65  zTitle, n);.  me
29b0: 6d 2e 7a 54 69 74 6c 65 5b 6e 5d 20 3d 20 30 3b  m.zTitle[n] = 0;
29c0: 0a 20 20 6d 65 6d 2e 6e 54 69 74 6c 65 20 3d 20  .  mem.nTitle = 
29d0: 28 6e 2b 33 29 26 7e 33 3b 0a 20 20 73 71 6c 69  (n+3)&~3;.  sqli
29e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
29f0: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 76  mem.mutex);.}..v
2a00: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  oid sqlite3Memde
2a10: 62 75 67 53 79 6e 63 28 29 7b 0a 20 20 73 74 72  bugSync(){.  str
2a20: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
2a30: 2a 70 48 64 72 3b 0a 20 20 66 6f 72 28 70 48 64  *pHdr;.  for(pHd
2a40: 72 3d 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48  r=mem.pFirst; pH
2a50: 64 72 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70  dr; pHdr=pHdr->p
2a60: 4e 65 78 74 29 7b 0a 20 20 20 20 76 6f 69 64 20  Next){.    void 
2a70: 2a 2a 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29  **pBt = (void**)
2a80: 70 48 64 72 3b 0a 20 20 20 20 70 42 74 20 2d 3d  pHdr;.    pBt -=
2a90: 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63   pHdr->nBacktrac
2aa0: 65 53 6c 6f 74 73 3b 0a 20 20 20 20 6d 65 6d 2e  eSlots;.    mem.
2ab0: 78 42 61 63 6b 74 72 61 63 65 28 70 48 64 72 2d  xBacktrace(pHdr-
2ac0: 3e 69 53 69 7a 65 2c 20 70 48 64 72 2d 3e 6e 42  >iSize, pHdr->nB
2ad0: 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 70 42 74  acktrace-1, &pBt
2ae0: 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  [1]);.  }.}../*.
2af0: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
2b00: 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77   indicated and w
2b10: 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c  rite a log of al
2b20: 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  l unfreed memory
2b30: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   .** allocations
2b40: 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a   into that log..
2b50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
2b60: 65 6d 64 65 62 75 67 44 75 6d 70 28 63 6f 6e 73  emdebugDump(cons
2b70: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2b80: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b  e){.  FILE *out;
2b90: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
2ba0: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76  ckHdr *pHdr;.  v
2bb0: 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 69 6e 74  oid **pBt;.  int
2bc0: 20 69 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65   i;.  out = fope
2bd0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22  n(zFilename, "w"
2be0: 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
2bf0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
2c00: 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c  tderr, "** Unabl
2c10: 65 20 74 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f  e to output memo
2c20: 72 79 20 64 65 62 75 67 20 6f 75 74 70 75 74 20  ry debug output 
2c30: 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0a 20  log: %s **\n",. 
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
2c60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2c70: 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46   for(pHdr=mem.pF
2c80: 69 72 73 74 3b 20 70 48 64 72 3b 20 70 48 64 72  irst; pHdr; pHdr
2c90: 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pHdr->pNext){. 
2ca0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
2cb0: 61 72 2a 29 70 48 64 72 3b 0a 20 20 20 20 7a 20  ar*)pHdr;.    z 
2cc0: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
2cd0: 61 63 65 53 6c 6f 74 73 2a 73 69 7a 65 6f 66 28  aceSlots*sizeof(
2ce0: 76 6f 69 64 2a 29 20 2b 20 70 48 64 72 2d 3e 6e  void*) + pHdr->n
2cf0: 54 69 74 6c 65 3b 0a 20 20 20 20 66 70 72 69 6e  Title;.    fprin
2d00: 74 66 28 6f 75 74 2c 20 22 2a 2a 2a 2a 20 25 64  tf(out, "**** %d
2d10: 20 62 79 74 65 73 20 61 74 20 25 70 20 66 72 6f   bytes at %p fro
2d20: 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 20 0a 20  m %s ****\n", . 
2d30: 20 20 20 20 20 20 20 20 20 20 20 70 48 64 72 2d             pHdr-
2d40: 3e 69 53 69 7a 65 2c 20 26 70 48 64 72 5b 31 5d  >iSize, &pHdr[1]
2d50: 2c 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3f  , pHdr->nTitle ?
2d60: 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20 20 20   z : "???");.   
2d70: 20 69 66 28 20 70 48 64 72 2d 3e 6e 42 61 63 6b   if( pHdr->nBack
2d80: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66  trace ){.      f
2d90: 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20 20 20  flush(out);.    
2da0: 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29    pBt = (void**)
2db0: 70 48 64 72 3b 0a 20 20 20 20 20 20 70 42 74 20  pHdr;.      pBt 
2dc0: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
2dd0: 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20 20 20  aceSlots;.      
2de0: 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c  backtrace_symbol
2df0: 73 5f 66 64 28 70 42 74 2c 20 70 48 64 72 2d 3e  s_fd(pBt, pHdr->
2e00: 6e 42 61 63 6b 74 72 61 63 65 2c 20 66 69 6c 65  nBacktrace, file
2e10: 6e 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20 20 20  no(out));.      
2e20: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
2e30: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
2e40: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 4f  fprintf(out, "CO
2e50: 55 4e 54 53 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72  UNTS:\n");.  for
2e60: 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45 2d 31  (i=0; i<NCSIZE-1
2e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2e80: 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 69 5d 20 29  mem.sizeCnt[i] )
2e90: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
2ea0: 6f 75 74 2c 20 22 20 20 20 25 33 64 3a 20 25 64  out, "   %3d: %d
2eb0: 5c 6e 22 2c 20 69 2a 38 2b 38 2c 20 6d 65 6d 2e  \n", i*8+8, mem.
2ec0: 73 69 7a 65 43 6e 74 5b 69 5d 29 3b 0a 20 20 20  sizeCnt[i]);.   
2ed0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d   }.  }.  if( mem
2ee0: 2e 73 69 7a 65 43 6e 74 5b 4e 43 53 49 5a 45 2d  .sizeCnt[NCSIZE-
2ef0: 31 5d 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  1] ){.    fprint
2f00: 66 28 6f 75 74 2c 20 22 20 20 3e 25 33 64 3a 20  f(out, "  >%3d: 
2f10: 25 64 5c 6e 22 2c 20 4e 43 53 49 5a 45 2a 38 2c  %d\n", NCSIZE*8,
2f20: 20 6d 65 6d 2e 73 69 7a 65 43 6e 74 5b 4e 43 53   mem.sizeCnt[NCS
2f30: 49 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20 66  IZE-1]);.  }.  f
2f40: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a 2f  close(out);.}../
2f50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2f60: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
2f70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2f80: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
2f90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fa0: 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f 63 43 6f  MemdebugMallocCo
2fb0: 75 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  unt(){.  int i;.
2fc0: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
2fd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  ;.  for(i=0; i<N
2fe0: 43 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20 20  CSIZE; i++){.   
2ff0: 20 6e 54 6f 74 61 6c 20 2b 3d 20 6d 65 6d 2e 73   nTotal += mem.s
3000: 69 7a 65 43 6e 74 5b 69 5d 3b 0a 20 20 7d 0a 20  izeCnt[i];.  }. 
3010: 20 72 65 74 75 72 6e 20 6e 54 6f 74 61 6c 3b 0a   return nTotal;.
3020: 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }...#endif /* SQ
3030: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 2a 2f  LITE_MEMDEBUG */
3040: 0a                                               .