/ Hex Artifact Content
Login

Artifact e307323e86b5da1853d7111b68fd6b84ad6f09cf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 41 75 67 75 73  /*.** 2007 Augus
0010: 74 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 15.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 77  ile contains low
0190: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
01a0: 6c 6f 63 61 74 69 6f 6e 20 64 72 69 76 65 72 73  location drivers
01b0: 20 66 6f 72 20 77 68 65 6e 0a 2a 2a 20 53 51 4c   for when.** SQL
01c0: 69 74 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ite will use the
01d0: 20 73 74 61 6e 64 61 72 64 20 43 2d 6c 69 62 72   standard C-libr
01e0: 61 72 79 20 6d 61 6c 6c 6f 63 2f 72 65 61 6c 6c  ary malloc/reall
01f0: 6f 63 2f 66 72 65 65 20 69 6e 74 65 72 66 61 63  oc/free interfac
0200: 65 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 74  e.** to obtain t
0210: 68 65 20 6d 65 6d 6f 72 79 20 69 74 20 6e 65 65  he memory it nee
0220: 64 73 20 77 68 69 6c 65 20 61 64 64 69 6e 67 20  ds while adding 
0230: 6c 6f 74 73 20 6f 66 20 61 64 64 69 74 69 6f 6e  lots of addition
0240: 61 6c 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  al debugging.** 
0250: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 65  information to e
0260: 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ach allocation i
0270: 6e 20 6f 72 64 65 72 20 74 6f 20 68 65 6c 70 20  n order to help 
0280: 64 65 74 65 63 74 20 61 6e 64 20 66 69 78 20 6d  detect and fix m
0290: 65 6d 6f 72 79 0a 2a 2a 20 6c 65 61 6b 73 20 61  emory.** leaks a
02a0: 6e 64 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 20  nd memory usage 
02b0: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  errors..**.** Th
02c0: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
02d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
02e0: 20 6f 66 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65   of the low-leve
02f0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
0300: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
0310: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
0320: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
0330: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  hods object..*/.
0340: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68  Int.h"../*.** Th
0360: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  is version of th
0370: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
0380: 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
0390: 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45  if the.** SQLITE
03a0: 5f 4d 45 4d 44 45 42 55 47 20 6d 61 63 72 6f 20  _MEMDEBUG macro 
03b0: 69 73 20 64 65 66 69 6e 65 64 0a 2a 2f 0a 23 69  is defined.*/.#i
03c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44  fdef SQLITE_MEMD
03d0: 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  EBUG../*.** The 
03e0: 62 61 63 6b 74 72 61 63 65 20 66 75 6e 63 74 69  backtrace functi
03f0: 6f 6e 61 6c 69 74 79 20 69 73 20 6f 6e 6c 79 20  onality is only 
0400: 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 47  available with G
0410: 4c 49 42 43 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  LIBC.*/.#ifdef _
0420: 5f 47 4c 49 42 43 5f 5f 0a 20 20 65 78 74 65 72  _GLIBC__.  exter
0430: 6e 20 69 6e 74 20 62 61 63 6b 74 72 61 63 65 28  n int backtrace(
0440: 76 6f 69 64 2a 2a 2c 69 6e 74 29 3b 0a 20 20 65  void**,int);.  e
0450: 78 74 65 72 6e 20 76 6f 69 64 20 62 61 63 6b 74  xtern void backt
0460: 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f 66 64 28  race_symbols_fd(
0470: 76 6f 69 64 2a 63 6f 6e 73 74 2a 2c 69 6e 74 2c  void*const*,int,
0480: 69 6e 74 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  int);.#else.# de
0490: 66 69 6e 65 20 62 61 63 6b 74 72 61 63 65 28 41  fine backtrace(A
04a0: 2c 42 29 20 31 0a 23 20 64 65 66 69 6e 65 20 62  ,B) 1.# define b
04b0: 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73  acktrace_symbols
04c0: 5f 66 64 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  _fd(A,B,C).#endi
04d0: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  f.#include <stdi
04e0: 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  o.h>../*.** Each
04f0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0500: 6f 6e 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  on looks like th
0510: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 2d 2d 2d  is:.**.**  -----
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 0a 2a 2a 20 20 7c 20 54 69 74 6c 65 20  ---.**  | Title 
0570: 7c 20 20 62 61 63 6b 74 72 61 63 65 20 70 6f 69  |  backtrace poi
0580: 6e 74 65 72 73 20 7c 20 20 4d 65 6d 42 6c 6f 63  nters |  MemBloc
0590: 6b 48 64 72 20 7c 20 20 61 6c 6c 6f 63 61 74 69  kHdr |  allocati
05a0: 6f 6e 20 7c 20 20 45 6e 64 47 75 61 72 64 20 7c  on |  EndGuard |
05b0: 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**  -----------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
0600: 0a 2a 2a 20 54 68 65 20 61 70 70 6c 69 63 61 74  .** The applicat
0610: 69 6f 6e 20 63 6f 64 65 20 73 65 65 73 20 6f 6e  ion code sees on
0620: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
0630: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  the allocation. 
0640: 20 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f 20 62   We have.** to b
0650: 61 63 6b 20 75 70 20 66 72 6f 6d 20 74 68 65 20  ack up from the 
0660: 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74  allocation point
0670: 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 4d  er to find the M
0680: 65 6d 42 6c 6f 63 6b 48 64 72 2e 20 20 54 68 65  emBlockHdr.  The
0690: 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  .** MemBlockHdr 
06a0: 74 65 6c 6c 73 20 75 73 20 74 68 65 20 73 69 7a  tells us the siz
06b0: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
06c0: 69 6f 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ion and the numb
06d0: 65 72 20 6f 66 0a 2a 2a 20 62 61 63 6b 74 72 61  er of.** backtra
06e0: 63 65 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68  ce pointers.  Th
06f0: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 67 75  ere is also a gu
0700: 61 72 64 20 77 6f 72 64 20 61 74 20 74 68 65 20  ard word at the 
0710: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 4d 65  end of the.** Me
0720: 6d 42 6c 6f 63 6b 48 64 72 2e 0a 2a 2f 0a 73 74  mBlockHdr..*/.st
0730: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
0740: 20 7b 0a 20 20 69 36 34 20 69 53 69 7a 65 3b 20   {.  i64 iSize; 
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0760: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
0770: 20 6f 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   of this allocat
0780: 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ion */.  struct 
0790: 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 4e 65  MemBlockHdr *pNe
07a0: 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20  xt, *pPrev;  /* 
07b0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61  Linked list of a
07c0: 6c 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72  ll unfreed memor
07d0: 79 20 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61 63  y */.  char nBac
07e0: 6b 74 72 61 63 65 3b 20 20 20 20 20 20 20 20 20  ktrace;         
07f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0800: 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63  mber of backtrac
0810: 65 73 20 6f 6e 20 74 68 69 73 20 61 6c 6c 6f 63  es on this alloc
0820: 20 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61 63 6b   */.  char nBack
0830: 74 72 61 63 65 53 6c 6f 74 73 3b 20 20 20 20 20  traceSlots;     
0840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61            /* Ava
0850: 69 6c 61 62 6c 65 20 62 61 63 6b 74 72 61 63 65  ilable backtrace
0860: 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 75 38 20 6e   slots */.  u8 n
0870: 54 69 74 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Title;          
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 2f 2a 20 42 79 74 65 73 20 6f 66 20 74 69 74 6c  /* Bytes of titl
08a0: 65 3b 20 69 6e 63 6c 75 64 65 73 20 27 5c 30 27  e; includes '\0'
08b0: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 20   */.  u8 eType; 
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
08e0: 6f 63 61 74 69 6f 6e 20 74 79 70 65 20 63 6f 64  ocation type cod
08f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 46 6f 72 65  e */.  int iFore
0900: 47 75 61 72 64 3b 20 20 20 20 20 20 20 20 20 20  Guard;          
0910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 75             /* Gu
0920: 61 72 64 20 77 6f 72 64 20 66 6f 72 20 73 61 6e  ard word for san
0930: 69 74 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ity */.};../*.**
0940: 20 47 75 61 72 64 20 77 6f 72 64 73 0a 2a 2f 0a   Guard words.*/.
0950: 23 64 65 66 69 6e 65 20 46 4f 52 45 47 55 41 52  #define FOREGUAR
0960: 44 20 30 78 38 30 46 35 45 31 35 33 0a 23 64 65  D 0x80F5E153.#de
0970: 66 69 6e 65 20 52 45 41 52 47 55 41 52 44 20 30  fine REARGUARD 0
0980: 78 45 34 36 37 36 42 35 33 0a 0a 2f 2a 0a 2a 2a  xE4676B53../*.**
0990: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f   Number of mallo
09a0: 63 20 73 69 7a 65 20 69 6e 63 72 65 6d 65 6e 74  c size increment
09b0: 73 20 74 6f 20 74 72 61 63 6b 2e 0a 2a 2f 0a 23  s to track..*/.#
09c0: 64 65 66 69 6e 65 20 4e 43 53 49 5a 45 20 20 31  define NCSIZE  1
09d0: 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f  000../*.** All o
09e0: 66 20 74 68 65 20 73 74 61 74 69 63 20 76 61 72  f the static var
09f0: 69 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 74  iables used by t
0a00: 68 69 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63  his module are c
0a10: 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f  ollected.** into
0a20: 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74   a single struct
0a30: 75 72 65 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e  ure named "mem".
0a40: 20 20 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65    This is to kee
0a50: 70 20 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20  p the.** static 
0a60: 76 61 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69  variables organi
0a70: 7a 65 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63  zed and to reduc
0a80: 65 20 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c  e namespace poll
0a90: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68  ution.** when th
0aa0: 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d  is module is com
0ab0: 62 69 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72  bined with other
0ac0: 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
0ad0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
0ae0: 73 74 72 75 63 74 20 7b 0a 20 20 0a 20 20 2f 2a  struct {.  .  /*
0af0: 0a 20 20 2a 2a 20 4d 75 74 65 78 20 74 6f 20 63  .  ** Mutex to c
0b00: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
0b10: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0b20: 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d  cation subsystem
0b30: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
0b40: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 0a  _mutex *mutex;..
0b50: 20 20 2f 2a 0a 20 20 2a 2a 20 48 65 61 64 20 61    /*.  ** Head a
0b60: 6e 64 20 74 61 69 6c 20 6f 66 20 61 20 6c 69 6e  nd tail of a lin
0b70: 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ked list of all 
0b80: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
0b90: 63 61 74 69 6f 6e 73 0a 20 20 2a 2f 0a 20 20 73  cations.  */.  s
0ba0: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
0bb0: 72 20 2a 70 46 69 72 73 74 3b 0a 20 20 73 74 72  r *pFirst;.  str
0bc0: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
0bd0: 2a 70 4c 61 73 74 3b 0a 20 20 0a 20 20 2f 2a 0a  *pLast;.  .  /*.
0be0: 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    ** The number 
0bf0: 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20 62 61 63  of levels of bac
0c00: 6b 74 72 61 63 65 20 74 6f 20 73 61 76 65 20 69  ktrace to save i
0c10: 6e 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  n new allocation
0c20: 73 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  s..  */.  int nB
0c30: 61 63 6b 74 72 61 63 65 3b 0a 20 20 76 6f 69 64  acktrace;.  void
0c40: 20 28 2a 78 42 61 63 6b 74 72 61 63 65 29 28 69   (*xBacktrace)(i
0c50: 6e 74 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2a  nt, int, void **
0c60: 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 69  );..  /*.  ** Ti
0c70: 74 6c 65 20 74 65 78 74 20 74 6f 20 69 6e 73 65  tle text to inse
0c80: 72 74 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65  rt in front of e
0c90: 61 63 68 20 62 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ach block.  */. 
0ca0: 20 69 6e 74 20 6e 54 69 74 6c 65 3b 20 20 20 20   int nTitle;    
0cb0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
0cc0: 7a 54 69 74 6c 65 20 74 6f 20 73 61 76 65 2e 20  zTitle to save. 
0cd0: 20 49 6e 63 6c 75 64 65 73 20 27 5c 30 27 20 61   Includes '\0' a
0ce0: 6e 64 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20 20  nd padding */.  
0cf0: 63 68 61 72 20 7a 54 69 74 6c 65 5b 31 30 30 5d  char zTitle[100]
0d00: 3b 20 20 2f 2a 20 54 68 65 20 74 69 74 6c 65 20  ;  /* The title 
0d10: 74 65 78 74 20 2a 2f 0a 0a 20 20 2f 2a 20 0a 20  text */..  /* . 
0d20: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   ** sqlite3Mallo
0d30: 63 44 69 73 61 6c 6c 6f 77 28 29 20 69 6e 63 72  cDisallow() incr
0d40: 65 6d 65 6e 74 73 20 74 68 65 20 66 6f 6c 6c 6f  ements the follo
0d50: 77 69 6e 67 20 63 6f 75 6e 74 65 72 2e 0a 20 20  wing counter..  
0d60: 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ** sqlite3Malloc
0d70: 41 6c 6c 6f 77 28 29 20 64 65 63 72 65 6d 65 6e  Allow() decremen
0d80: 74 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ts it..  */.  in
0d90: 74 20 64 69 73 61 6c 6c 6f 77 3b 20 2f 2a 20 44  t disallow; /* D
0da0: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6d 65 6d 6f  o not allow memo
0db0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  ry allocation */
0dc0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 47 61 74 68  ..  /*.  ** Gath
0dd0: 65 72 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e  er statistics on
0de0: 20 74 68 65 20 73 69 7a 65 73 20 6f 66 20 6d 65   the sizes of me
0df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
0e00: 2e 0a 20 20 2a 2a 20 6e 41 6c 6c 6f 63 5b 69 5d  ..  ** nAlloc[i]
0e10: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
0e20: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  f allocation att
0e30: 65 6d 70 74 73 20 6f 66 20 69 2a 38 0a 20 20 2a  empts of i*8.  *
0e40: 2a 20 62 79 74 65 73 2e 20 20 69 3d 3d 4e 43 53  * bytes.  i==NCS
0e50: 49 5a 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65  IZE is the numbe
0e60: 72 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  r of allocation 
0e70: 61 74 74 65 6d 70 74 73 20 66 6f 72 0a 20 20 2a  attempts for.  *
0e80: 2a 20 73 69 7a 65 73 20 6d 6f 72 65 20 74 68 61  * sizes more tha
0e90: 6e 20 4e 43 53 49 5a 45 2a 38 20 62 79 74 65 73  n NCSIZE*8 bytes
0ea0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  ..  */.  int nAl
0eb0: 6c 6f 63 5b 4e 43 53 49 5a 45 5d 3b 20 20 20 20  loc[NCSIZE];    
0ec0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
0ed0: 72 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  r of allocations
0ee0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65   */.  int nCurre
0ef0: 6e 74 5b 4e 43 53 49 5a 45 5d 3b 20 20 20 20 2f  nt[NCSIZE];    /
0f00: 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  * Current number
0f10: 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20   of allocations 
0f20: 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 75 72 72 65  */.  int mxCurre
0f30: 6e 74 5b 4e 43 53 49 5a 45 5d 3b 20 20 20 2f 2a  nt[NCSIZE];   /*
0f40: 20 48 69 67 68 77 61 74 65 72 20 6d 61 72 6b 20   Highwater mark 
0f50: 66 6f 72 20 6e 43 75 72 72 65 6e 74 20 2a 2f 0a  for nCurrent */.
0f60: 0a 7d 20 6d 65 6d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  .} mem;.../*.** 
0f70: 41 64 6a 75 73 74 20 6d 65 6d 6f 72 79 20 75 73  Adjust memory us
0f80: 61 67 65 20 73 74 61 74 69 73 74 69 63 73 0a 2a  age statistics.*
0f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
0fa0: 6a 75 73 74 53 74 61 74 73 28 69 6e 74 20 69 53  justStats(int iS
0fb0: 69 7a 65 2c 20 69 6e 74 20 69 6e 63 72 65 6d 65  ize, int increme
0fc0: 6e 74 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 52  nt){.  int i = R
0fd0: 4f 55 4e 44 38 28 69 53 69 7a 65 29 2f 38 3b 0a  OUND8(iSize)/8;.
0fe0: 20 20 69 66 28 20 69 3e 4e 43 53 49 5a 45 2d 31    if( i>NCSIZE-1
0ff0: 20 29 7b 0a 20 20 20 20 69 20 3d 20 4e 43 53 49   ){.    i = NCSI
1000: 5a 45 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ZE - 1;.  }.  if
1010: 28 20 69 6e 63 72 65 6d 65 6e 74 3e 30 20 29 7b  ( increment>0 ){
1020: 0a 20 20 20 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b  .    mem.nAlloc[
1030: 69 5d 2b 2b 3b 0a 20 20 20 20 6d 65 6d 2e 6e 43  i]++;.    mem.nC
1040: 75 72 72 65 6e 74 5b 69 5d 2b 2b 3b 0a 20 20 20  urrent[i]++;.   
1050: 20 69 66 28 20 6d 65 6d 2e 6e 43 75 72 72 65 6e   if( mem.nCurren
1060: 74 5b 69 5d 3e 6d 65 6d 2e 6d 78 43 75 72 72 65  t[i]>mem.mxCurre
1070: 6e 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6d  nt[i] ){.      m
1080: 65 6d 2e 6d 78 43 75 72 72 65 6e 74 5b 69 5d 20  em.mxCurrent[i] 
1090: 3d 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69  = mem.nCurrent[i
10a0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
10b0: 7b 0a 20 20 20 20 6d 65 6d 2e 6e 43 75 72 72 65  {.    mem.nCurre
10c0: 6e 74 5b 69 5d 2d 2d 3b 0a 20 20 20 20 61 73 73  nt[i]--;.    ass
10d0: 65 72 74 28 20 6d 65 6d 2e 6e 43 75 72 72 65 6e  ert( mem.nCurren
10e0: 74 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 7d 0a 7d  t[i]>=0 );.  }.}
10f0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
1100: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 66 69 6e   allocation, fin
1110: 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b 48 64  d the MemBlockHd
1120: 72 20 66 6f 72 20 74 68 61 74 20 61 6c 6c 6f 63  r for that alloc
1130: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
1140: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
1150: 20 74 68 65 20 67 75 61 72 64 73 20 61 74 20 65   the guards at e
1160: 69 74 68 65 72 20 65 6e 64 20 6f 66 20 74 68 65  ither end of the
1170: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 0a   allocation and.
1180: 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69  ** if they are i
1190: 6e 63 6f 72 72 65 63 74 20 69 74 20 61 73 73 65  ncorrect it asse
11a0: 72 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  rts..*/.static s
11b0: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
11c0: 72 20 2a 73 71 6c 69 74 65 33 4d 65 6d 73 79 73  r *sqlite3Memsys
11d0: 47 65 74 48 65 61 64 65 72 28 76 6f 69 64 20 2a  GetHeader(void *
11e0: 70 41 6c 6c 6f 63 61 74 69 6f 6e 29 7b 0a 20 20  pAllocation){.  
11f0: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
1200: 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 70 49  dr *p;.  int *pI
1210: 6e 74 3b 0a 20 20 75 38 20 2a 70 55 38 3b 0a 20  nt;.  u8 *pU8;. 
1220: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 0a   int nReserve;..
1230: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4d 65    p = (struct Me
1240: 6d 42 6c 6f 63 6b 48 64 72 2a 29 70 41 6c 6c 6f  mBlockHdr*)pAllo
1250: 63 61 74 69 6f 6e 3b 0a 20 20 70 2d 2d 3b 0a 20  cation;.  p--;. 
1260: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 46 6f 72   assert( p->iFor
1270: 65 47 75 61 72 64 3d 3d 28 69 6e 74 29 46 4f 52  eGuard==(int)FOR
1280: 45 47 55 41 52 44 20 29 3b 0a 20 20 6e 52 65 73  EGUARD );.  nRes
1290: 65 72 76 65 20 3d 20 52 4f 55 4e 44 38 28 70 2d  erve = ROUND8(p-
12a0: 3e 69 53 69 7a 65 29 3b 0a 20 20 70 49 6e 74 20  >iSize);.  pInt 
12b0: 3d 20 28 69 6e 74 2a 29 70 41 6c 6c 6f 63 61 74  = (int*)pAllocat
12c0: 69 6f 6e 3b 0a 20 20 70 55 38 20 3d 20 28 75 38  ion;.  pU8 = (u8
12d0: 2a 29 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20  *)pAllocation;. 
12e0: 20 61 73 73 65 72 74 28 20 70 49 6e 74 5b 6e 52   assert( pInt[nR
12f0: 65 73 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e  eserve/sizeof(in
1300: 74 29 5d 3d 3d 28 69 6e 74 29 52 45 41 52 47 55  t)]==(int)REARGU
1310: 41 52 44 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73  ARD );.  /* This
1320: 20 63 68 65 63 6b 73 20 61 6e 79 20 6f 66 20 74   checks any of t
1330: 68 65 20 22 65 78 74 72 61 22 20 62 79 74 65 73  he "extra" bytes
1340: 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65 0a 20   allocated due. 
1350: 20 2a 2a 20 74 6f 20 72 6f 75 6e 64 69 6e 67 20   ** to rounding 
1360: 75 70 20 74 6f 20 61 6e 20 38 20 62 79 74 65 20  up to an 8 byte 
1370: 62 6f 75 6e 64 61 72 79 20 74 6f 20 65 6e 73 75  boundary to ensu
1380: 72 65 20 0a 20 20 2a 2a 20 74 68 65 79 20 68 61  re .  ** they ha
1390: 76 65 6e 27 74 20 62 65 65 6e 20 6f 76 65 72 77  ven't been overw
13a0: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 77  ritten..  */.  w
13b0: 68 69 6c 65 28 20 6e 52 65 73 65 72 76 65 2d 2d  hile( nReserve--
13c0: 20 3e 20 70 2d 3e 69 53 69 7a 65 20 29 20 61 73   > p->iSize ) as
13d0: 73 65 72 74 28 20 70 55 38 5b 6e 52 65 73 65 72  sert( pU8[nReser
13e0: 76 65 5d 3d 3d 30 78 36 35 20 29 3b 0a 20 20 72  ve]==0x65 );.  r
13f0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
1400: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1410: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 75 72  ber of bytes cur
1420: 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64  rently allocated
1430: 20 61 74 20 61 64 64 72 65 73 73 20 70 2e 0a 2a   at address p..*
1440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1450: 69 74 65 33 4d 65 6d 53 69 7a 65 28 76 6f 69 64  ite3MemSize(void
1460: 20 2a 70 29 7b 0a 20 20 73 74 72 75 63 74 20 4d   *p){.  struct M
1470: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72  emBlockHdr *pHdr
1480: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
1490: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14a0: 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74 65 33    pHdr = sqlite3
14b0: 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28  MemsysGetHeader(
14c0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 48 64  p);.  return pHd
14d0: 72 2d 3e 69 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  r->iSize;.}../*.
14e0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
14f0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
1500: 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a  ion subsystem..*
1510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1520: 69 74 65 33 4d 65 6d 49 6e 69 74 28 76 6f 69 64  ite3MemInit(void
1530: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1540: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1550: 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72  otUsed);.  asser
1560: 74 28 20 28 73 69 7a 65 6f 66 28 73 74 72 75 63  t( (sizeof(struc
1570: 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 29 26 37  t MemBlockHdr)&7
1580: 29 20 3d 3d 20 30 20 29 3b 0a 20 20 69 66 28 20  ) == 0 );.  if( 
1590: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
15a0: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b  nfig.bMemstat ){
15b0: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 65 6d 6f 72  .    /* If memor
15c0: 79 20 73 74 61 74 75 73 20 69 73 20 65 6e 61 62  y status is enab
15d0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  led, then the ma
15e0: 6c 6c 6f 63 2e 63 20 77 72 61 70 70 65 72 20 77  lloc.c wrapper w
15f0: 69 6c 6c 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ill already.    
1600: 2a 2a 20 68 6f 6c 64 20 74 68 65 20 53 54 41 54  ** hold the STAT
1610: 49 43 5f 4d 45 4d 20 6d 75 74 65 78 20 77 68 65  IC_MEM mutex whe
1620: 6e 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 68  n the routines h
1630: 65 72 65 20 61 72 65 20 69 6e 76 6f 6b 65 64 2e  ere are invoked.
1640: 20 2a 2f 0a 20 20 20 20 6d 65 6d 2e 6d 75 74 65   */.    mem.mute
1650: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
1660: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1670: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a  EX_STATIC_MEM);.
1680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1690: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16a0: 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   Deinitialize th
16b0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
16c0: 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a  ion subsystem..*
16d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
16e0: 6c 69 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 6e  lite3MemShutdown
16f0: 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b  (void *NotUsed){
1700: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1710: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1720: 6d 65 6d 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 7d  mem.mutex = 0;.}
1730: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
1740: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
1750: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
1760: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
1770: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1780: 20 73 71 6c 69 74 65 33 4d 65 6d 52 6f 75 6e 64   sqlite3MemRound
1790: 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74  up(int n){.  ret
17a0: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 29 3b 0a 7d  urn ROUND8(n);.}
17b0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 20 62  ../*.** Fill a b
17c0: 75 66 66 65 72 20 77 69 74 68 20 70 73 65 75 64  uffer with pseud
17d0: 6f 2d 72 61 6e 64 6f 6d 20 62 79 74 65 73 2e 20  o-random bytes. 
17e0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
17f0: 20 70 72 65 73 65 74 0a 2a 2a 20 74 68 65 20 63   preset.** the c
1800: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 6e 65 77 20  ontent of a new 
1810: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1820: 6e 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  n to unpredictab
1830: 6c 65 20 76 61 6c 75 65 73 20 61 6e 64 0a 2a 2a  le values and.**
1840: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 6f   to clear the co
1850: 6e 74 65 6e 74 20 6f 66 20 61 20 66 72 65 65 64  ntent of a freed
1860: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 75   allocation to u
1870: 6e 70 72 65 64 69 63 74 61 62 6c 65 20 76 61 6c  npredictable val
1880: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
1890: 6f 69 64 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 63  oid randomFill(c
18a0: 68 61 72 20 2a 70 42 75 66 2c 20 69 6e 74 20 6e  har *pBuf, int n
18b0: 42 79 74 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Byte){.  unsigne
18c0: 64 20 69 6e 74 20 78 2c 20 79 2c 20 72 3b 0a 20  d int x, y, r;. 
18d0: 20 78 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f   x = SQLITE_PTR_
18e0: 54 4f 5f 49 4e 54 28 70 42 75 66 29 3b 0a 20 20  TO_INT(pBuf);.  
18f0: 79 20 3d 20 6e 42 79 74 65 20 7c 20 31 3b 0a 20  y = nByte | 1;. 
1900: 20 77 68 69 6c 65 28 20 6e 42 79 74 65 20 3e 3d   while( nByte >=
1910: 20 34 20 29 7b 0a 20 20 20 20 78 20 3d 20 28 78   4 ){.    x = (x
1920: 3e 3e 31 29 20 5e 20 28 2d 28 78 26 31 29 20 26  >>1) ^ (-(x&1) &
1930: 20 30 78 64 30 30 30 30 30 30 31 29 3b 0a 20 20   0xd0000001);.  
1940: 20 20 79 20 3d 20 79 2a 31 31 30 33 35 31 35 32    y = y*11035152
1950: 34 35 20 2b 20 31 32 33 34 35 3b 0a 20 20 20 20  45 + 12345;.    
1960: 72 20 3d 20 78 20 5e 20 79 3b 0a 20 20 20 20 2a  r = x ^ y;.    *
1970: 28 69 6e 74 2a 29 70 42 75 66 20 3d 20 72 3b 0a  (int*)pBuf = r;.
1980: 20 20 20 20 70 42 75 66 20 2b 3d 20 34 3b 0a 20      pBuf += 4;. 
1990: 20 20 20 6e 42 79 74 65 20 2d 3d 20 34 3b 0a 20     nByte -= 4;. 
19a0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 42 79 74   }.  while( nByt
19b0: 65 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 78  e-- > 0 ){.    x
19c0: 20 3d 20 28 78 3e 3e 31 29 20 5e 20 28 2d 28 78   = (x>>1) ^ (-(x
19d0: 26 31 29 20 26 20 30 78 64 30 30 30 30 30 30 31  &1) & 0xd0000001
19e0: 29 3b 0a 20 20 20 20 79 20 3d 20 79 2a 31 31 30  );.    y = y*110
19f0: 33 35 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b  3515245 + 12345;
1a00: 0a 20 20 20 20 72 20 3d 20 78 20 5e 20 79 3b 0a  .    r = x ^ y;.
1a10: 20 20 20 20 2a 28 70 42 75 66 2b 2b 29 20 3d 20      *(pBuf++) = 
1a20: 72 20 26 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a  r & 0xff;.  }.}.
1a30: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1a40: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 6d  nByte bytes of m
1a50: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
1a60: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 65   void *sqlite3Me
1a70: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
1a80: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  e){.  struct Mem
1a90: 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a  BlockHdr *pHdr;.
1aa0: 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20    void **pBt;.  
1ab0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 2a  char *z;.  int *
1ac0: 70 49 6e 74 3b 0a 20 20 76 6f 69 64 20 2a 70 20  pInt;.  void *p 
1ad0: 3d 20 30 3b 0a 20 20 69 6e 74 20 74 6f 74 61 6c  = 0;.  int total
1ae0: 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 52 65 73  Size;.  int nRes
1af0: 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  erve;.  sqlite3_
1b00: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e  mutex_enter(mem.
1b10: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
1b20: 28 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 3d 3d  ( mem.disallow==
1b30: 30 20 29 3b 0a 20 20 6e 52 65 73 65 72 76 65 20  0 );.  nReserve 
1b40: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
1b50: 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 6e  .  totalSize = n
1b60: 52 65 73 65 72 76 65 20 2b 20 73 69 7a 65 6f 66  Reserve + sizeof
1b70: 28 2a 70 48 64 72 29 20 2b 20 73 69 7a 65 6f 66  (*pHdr) + sizeof
1b80: 28 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20 20  (int) +.        
1b90: 20 20 20 20 20 20 20 6d 65 6d 2e 6e 42 61 63 6b         mem.nBack
1ba0: 74 72 61 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69  trace*sizeof(voi
1bb0: 64 2a 29 20 2b 20 6d 65 6d 2e 6e 54 69 74 6c 65  d*) + mem.nTitle
1bc0: 3b 0a 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74  ;.  p = malloc(t
1bd0: 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 69 66 28  otalSize);.  if(
1be0: 20 70 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 3b   p ){.    z = p;
1bf0: 0a 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64  .    pBt = (void
1c00: 2a 2a 29 26 7a 5b 6d 65 6d 2e 6e 54 69 74 6c 65  **)&z[mem.nTitle
1c10: 5d 3b 0a 20 20 20 20 70 48 64 72 20 3d 20 28 73  ];.    pHdr = (s
1c20: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
1c30: 72 2a 29 26 70 42 74 5b 6d 65 6d 2e 6e 42 61 63  r*)&pBt[mem.nBac
1c40: 6b 74 72 61 63 65 5d 3b 0a 20 20 20 20 70 48 64  ktrace];.    pHd
1c50: 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1c60: 20 20 70 48 64 72 2d 3e 70 50 72 65 76 20 3d 20    pHdr->pPrev = 
1c70: 6d 65 6d 2e 70 4c 61 73 74 3b 0a 20 20 20 20 69  mem.pLast;.    i
1c80: 66 28 20 6d 65 6d 2e 70 4c 61 73 74 20 29 7b 0a  f( mem.pLast ){.
1c90: 20 20 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 2d        mem.pLast-
1ca0: 3e 70 4e 65 78 74 20 3d 20 70 48 64 72 3b 0a 20  >pNext = pHdr;. 
1cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc0: 6d 65 6d 2e 70 46 69 72 73 74 20 3d 20 70 48 64  mem.pFirst = pHd
1cd0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
1ce0: 2e 70 4c 61 73 74 20 3d 20 70 48 64 72 3b 0a 20  .pLast = pHdr;. 
1cf0: 20 20 20 70 48 64 72 2d 3e 69 46 6f 72 65 47 75     pHdr->iForeGu
1d00: 61 72 64 20 3d 20 46 4f 52 45 47 55 41 52 44 3b  ard = FOREGUARD;
1d10: 0a 20 20 20 20 70 48 64 72 2d 3e 65 54 79 70 65  .    pHdr->eType
1d20: 20 3d 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 3b   = MEMTYPE_HEAP;
1d30: 0a 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b  .    pHdr->nBack
1d40: 74 72 61 63 65 53 6c 6f 74 73 20 3d 20 6d 65 6d  traceSlots = mem
1d50: 2e 6e 42 61 63 6b 74 72 61 63 65 3b 0a 20 20 20  .nBacktrace;.   
1d60: 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3d 20   pHdr->nTitle = 
1d70: 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 20 20  mem.nTitle;.    
1d80: 69 66 28 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61  if( mem.nBacktra
1d90: 63 65 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  ce ){.      void
1da0: 20 2a 61 41 64 64 72 5b 34 30 5d 3b 0a 20 20 20   *aAddr[40];.   
1db0: 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72     pHdr->nBacktr
1dc0: 61 63 65 20 3d 20 62 61 63 6b 74 72 61 63 65 28  ace = backtrace(
1dd0: 61 41 64 64 72 2c 20 6d 65 6d 2e 6e 42 61 63 6b  aAddr, mem.nBack
1de0: 74 72 61 63 65 2b 31 29 2d 31 3b 0a 20 20 20 20  trace+1)-1;.    
1df0: 20 20 6d 65 6d 63 70 79 28 70 42 74 2c 20 26 61    memcpy(pBt, &a
1e00: 41 64 64 72 5b 31 5d 2c 20 70 48 64 72 2d 3e 6e  Addr[1], pHdr->n
1e10: 42 61 63 6b 74 72 61 63 65 2a 73 69 7a 65 6f 66  Backtrace*sizeof
1e20: 28 76 6f 69 64 2a 29 29 3b 0a 20 20 20 20 20 20  (void*));.      
1e30: 61 73 73 65 72 74 28 70 42 74 5b 30 5d 29 3b 0a  assert(pBt[0]);.
1e40: 20 20 20 20 20 20 69 66 28 20 6d 65 6d 2e 78 42        if( mem.xB
1e50: 61 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20  acktrace ){.    
1e60: 20 20 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61      mem.xBacktra
1e70: 63 65 28 6e 42 79 74 65 2c 20 70 48 64 72 2d 3e  ce(nByte, pHdr->
1e80: 6e 42 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 61  nBacktrace-1, &a
1e90: 41 64 64 72 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Addr[1]);.      
1ea0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1eb0: 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72     pHdr->nBacktr
1ec0: 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ace = 0;.    }. 
1ed0: 20 20 20 69 66 28 20 6d 65 6d 2e 6e 54 69 74 6c     if( mem.nTitl
1ee0: 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1ef0: 79 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c  y(z, mem.zTitle,
1f00: 20 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b 0a 20 20   mem.nTitle);.  
1f10: 20 20 7d 0a 20 20 20 20 70 48 64 72 2d 3e 69 53    }.    pHdr->iS
1f20: 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
1f30: 20 61 64 6a 75 73 74 53 74 61 74 73 28 6e 42 79   adjustStats(nBy
1f40: 74 65 2c 20 2b 31 29 3b 0a 20 20 20 20 70 49 6e  te, +1);.    pIn
1f50: 74 20 3d 20 28 69 6e 74 2a 29 26 70 48 64 72 5b  t = (int*)&pHdr[
1f60: 31 5d 3b 0a 20 20 20 20 70 49 6e 74 5b 6e 52 65  1];.    pInt[nRe
1f70: 73 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e 74  serve/sizeof(int
1f80: 29 5d 20 3d 20 52 45 41 52 47 55 41 52 44 3b 0a  )] = REARGUARD;.
1f90: 20 20 20 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 28      randomFill((
1fa0: 63 68 61 72 2a 29 70 49 6e 74 2c 20 6e 42 79 74  char*)pInt, nByt
1fb0: 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 28  e);.    memset((
1fc0: 28 63 68 61 72 2a 29 70 49 6e 74 29 2b 6e 42 79  (char*)pInt)+nBy
1fd0: 74 65 2c 20 30 78 36 35 2c 20 6e 52 65 73 65 72  te, 0x65, nReser
1fe0: 76 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  ve-nByte);.    p
1ff0: 20 3d 20 28 76 6f 69 64 2a 29 70 49 6e 74 3b 0a   = (void*)pInt;.
2000: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2010: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75  tex_leave(mem.mu
2020: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
2030: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ; .}../*.** Free
2040: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
2050: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  ic void sqlite3M
2060: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
2070: 69 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 4d  ior){.  struct M
2080: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72  emBlockHdr *pHdr
2090: 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a  ;.  void **pBt;.
20a0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73    char *z;.  ass
20b0: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
20c0: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
20d0: 74 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  t || sqlite3Glob
20e0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
20f0: 74 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  tex==0 .       |
2100: 7c 20 6d 65 6d 2e 6d 75 74 65 78 21 3d 30 20 29  | mem.mutex!=0 )
2110: 3b 0a 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74  ;.  pHdr = sqlit
2120: 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65  e3MemsysGetHeade
2130: 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70 42 74  r(pPrior);.  pBt
2140: 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b   = (void**)pHdr;
2150: 0a 20 20 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e  .  pBt -= pHdr->
2160: 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b  nBacktraceSlots;
2170: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2180: 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78  _enter(mem.mutex
2190: 29 3b 0a 20 20 69 66 28 20 70 48 64 72 2d 3e 70  );.  if( pHdr->p
21a0: 50 72 65 76 20 29 7b 0a 20 20 20 20 61 73 73 65  Prev ){.    asse
21b0: 72 74 28 20 70 48 64 72 2d 3e 70 50 72 65 76 2d  rt( pHdr->pPrev-
21c0: 3e 70 4e 65 78 74 3d 3d 70 48 64 72 20 29 3b 0a  >pNext==pHdr );.
21d0: 20 20 20 20 70 48 64 72 2d 3e 70 50 72 65 76 2d      pHdr->pPrev-
21e0: 3e 70 4e 65 78 74 20 3d 20 70 48 64 72 2d 3e 70  >pNext = pHdr->p
21f0: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
2200: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 70     assert( mem.p
2210: 46 69 72 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20  First==pHdr );. 
2220: 20 20 20 6d 65 6d 2e 70 46 69 72 73 74 20 3d 20     mem.pFirst = 
2230: 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  pHdr->pNext;.  }
2240: 0a 20 20 69 66 28 20 70 48 64 72 2d 3e 70 4e 65  .  if( pHdr->pNe
2250: 78 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  xt ){.    assert
2260: 28 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70  ( pHdr->pNext->p
2270: 50 72 65 76 3d 3d 70 48 64 72 20 29 3b 0a 20 20  Prev==pHdr );.  
2280: 20 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70    pHdr->pNext->p
2290: 50 72 65 76 20 3d 20 70 48 64 72 2d 3e 70 50 72  Prev = pHdr->pPr
22a0: 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ev;.  }else{.   
22b0: 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 4c 61   assert( mem.pLa
22c0: 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20  st==pHdr );.    
22d0: 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70 48 64 72  mem.pLast = pHdr
22e0: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 7a  ->pPrev;.  }.  z
22f0: 20 3d 20 28 63 68 61 72 2a 29 70 42 74 3b 0a 20   = (char*)pBt;. 
2300: 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 54 69 74   z -= pHdr->nTit
2310: 6c 65 3b 0a 20 20 61 64 6a 75 73 74 53 74 61 74  le;.  adjustStat
2320: 73 28 70 48 64 72 2d 3e 69 53 69 7a 65 2c 20 2d  s(pHdr->iSize, -
2330: 31 29 3b 0a 20 20 72 61 6e 64 6f 6d 46 69 6c 6c  1);.  randomFill
2340: 28 7a 2c 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a  (z, sizeof(void*
2350: 29 2a 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  )*pHdr->nBacktra
2360: 63 65 53 6c 6f 74 73 20 2b 20 73 69 7a 65 6f 66  ceSlots + sizeof
2370: 28 2a 70 48 64 72 29 20 2b 0a 20 20 20 20 20 20  (*pHdr) +.      
2380: 20 20 20 20 20 20 20 20 20 20 70 48 64 72 2d 3e            pHdr->
2390: 69 53 69 7a 65 20 2b 20 73 69 7a 65 6f 66 28 69  iSize + sizeof(i
23a0: 6e 74 29 20 2b 20 70 48 64 72 2d 3e 6e 54 69 74  nt) + pHdr->nTit
23b0: 6c 65 29 3b 0a 20 20 66 72 65 65 28 7a 29 3b 0a  le);.  free(z);.
23c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23d0: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
23e0: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;  .}../*.** Cha
23f0: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
2400: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f  an existing memo
2410: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ry allocation..*
2420: 2a 0a 2a 2a 20 46 6f 72 20 74 68 69 73 20 64 65  *.** For this de
2430: 62 75 67 67 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  bugging implemen
2440: 74 61 74 69 6f 6e 2c 20 77 65 20 2a 61 6c 77 61  tation, we *alwa
2450: 79 73 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ys* make a copy 
2460: 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  of the.** alloca
2470: 74 69 6f 6e 20 69 6e 74 6f 20 61 20 6e 65 77 20  tion into a new 
2480: 70 6c 61 63 65 20 69 6e 20 6d 65 6d 6f 72 79 2e  place in memory.
2490: 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69    In this way, i
24a0: 66 20 74 68 65 20 0a 2a 2a 20 68 69 67 68 65 72  f the .** higher
24b0: 20 6c 65 76 65 6c 20 63 6f 64 65 20 69 73 20 75   level code is u
24c0: 73 69 6e 67 20 70 6f 69 6e 74 65 72 20 74 6f 20  sing pointer to 
24d0: 74 68 65 20 6f 6c 64 20 61 6c 6c 6f 63 61 74 69  the old allocati
24e0: 6f 6e 2c 20 69 74 20 69 73 20 0a 2a 2a 20 6d 75  on, it is .** mu
24f0: 63 68 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74  ch more likely t
2500: 6f 20 62 72 65 61 6b 20 61 6e 64 20 77 65 20 61  o break and we a
2510: 72 65 20 6d 75 63 68 20 6d 6f 72 65 20 6c 69 6b  re much more lik
2520: 69 6e 67 20 74 6f 20 66 69 6e 64 0a 2a 2a 20 74  ing to find.** t
2530: 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  he error..*/.sta
2540: 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  tic void *sqlite
2550: 33 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  3MemRealloc(void
2560: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
2570: 79 74 65 29 7b 0a 20 20 73 74 72 75 63 74 20 4d  yte){.  struct M
2580: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 4f 6c 64  emBlockHdr *pOld
2590: 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a 70 4e 65  Hdr;.  void *pNe
25a0: 77 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  w;.  assert( mem
25b0: 2e 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a  .disallow==0 );.
25c0: 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65    assert( (nByte
25d0: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 20 20 20   & 7)==0 );     
25e0: 2f 2a 20 45 56 3a 20 52 2d 34 36 31 39 39 2d 33  /* EV: R-46199-3
25f0: 30 32 34 39 20 2a 2f 0a 20 20 70 4f 6c 64 48 64  0249 */.  pOldHd
2600: 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79  r = sqlite3Memsy
2610: 73 47 65 74 48 65 61 64 65 72 28 70 50 72 69 6f  sGetHeader(pPrio
2620: 72 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  r);.  pNew = sql
2630: 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28 6e 42  ite3MemMalloc(nB
2640: 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  yte);.  if( pNew
2650: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
2660: 4e 65 77 2c 20 70 50 72 69 6f 72 2c 20 6e 42 79  New, pPrior, nBy
2670: 74 65 3c 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a  te<pOldHdr->iSiz
2680: 65 20 3f 20 6e 42 79 74 65 20 3a 20 70 4f 6c 64  e ? nByte : pOld
2690: 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20  Hdr->iSize);.   
26a0: 20 69 66 28 20 6e 42 79 74 65 3e 70 4f 6c 64 48   if( nByte>pOldH
26b0: 64 72 2d 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20  dr->iSize ){.   
26c0: 20 20 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 26 28     randomFill(&(
26d0: 28 63 68 61 72 2a 29 70 4e 65 77 29 5b 70 4f 6c  (char*)pNew)[pOl
26e0: 64 48 64 72 2d 3e 69 53 69 7a 65 5d 2c 20 6e 42  dHdr->iSize], nB
26f0: 79 74 65 20 2d 20 70 4f 6c 64 48 64 72 2d 3e 69  yte - pOldHdr->i
2700: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
2710: 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65 65 28   sqlite3MemFree(
2720: 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 72  pPrior);.  }.  r
2730: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
2740: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
2750: 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f  e low-level memo
2760: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75  ry allocation fu
2770: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  nction pointers 
2780: 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f  in.** sqlite3Glo
2790: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68  balConfig.m with
27a0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
27b0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
27c0: 73 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  s file..*/.void 
27d0: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
27e0: 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  ault(void){.  st
27f0: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2800: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 64  e3_mem_methods d
2810: 65 66 61 75 6c 74 4d 65 74 68 6f 64 73 20 3d 20  efaultMethods = 
2820: 7b 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  {.     sqlite3Me
2830: 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 20 73 71  mMalloc,.     sq
2840: 6c 69 74 65 33 4d 65 6d 46 72 65 65 2c 0a 20 20  lite3MemFree,.  
2850: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 61     sqlite3MemRea
2860: 6c 6c 6f 63 2c 0a 20 20 20 20 20 73 71 6c 69 74  lloc,.     sqlit
2870: 65 33 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 20  e3MemSize,.     
2880: 73 71 6c 69 74 65 33 4d 65 6d 52 6f 75 6e 64 75  sqlite3MemRoundu
2890: 70 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d  p,.     sqlite3M
28a0: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 20 73 71 6c  emInit,.     sql
28b0: 69 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 6e 2c  ite3MemShutdown,
28c0: 0a 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 73  .     0.  };.  s
28d0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
28e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
28f0: 4f 43 2c 20 26 64 65 66 61 75 6c 74 4d 65 74 68  OC, &defaultMeth
2900: 6f 64 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ods);.}../*.** S
2910: 65 74 20 74 68 65 20 22 74 79 70 65 22 20 6f 66  et the "type" of
2920: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a   an allocation..
2930: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
2940: 65 6d 64 65 62 75 67 53 65 74 54 79 70 65 28 76  emdebugSetType(v
2950: 6f 69 64 20 2a 70 2c 20 75 38 20 65 54 79 70 65  oid *p, u8 eType
2960: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 73 71  ){.  if( p && sq
2970: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2980: 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 73 71 6c  g.m.xMalloc==sql
2990: 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 20 29 7b  ite3MemMalloc ){
29a0: 0a 20 20 20 20 73 74 72 75 63 74 20 4d 65 6d 42  .    struct MemB
29b0: 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20  lockHdr *pHdr;. 
29c0: 20 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74 65     pHdr = sqlite
29d0: 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72  3MemsysGetHeader
29e0: 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
29f0: 20 70 48 64 72 2d 3e 69 46 6f 72 65 47 75 61 72   pHdr->iForeGuar
2a00: 64 3d 3d 46 4f 52 45 47 55 41 52 44 20 29 3b 0a  d==FOREGUARD );.
2a10: 20 20 20 20 70 48 64 72 2d 3e 65 54 79 70 65 20      pHdr->eType 
2a20: 3d 20 65 54 79 70 65 3b 0a 20 20 7d 0a 7d 0a 0a  = eType;.  }.}..
2a30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2a40: 45 20 69 66 20 74 68 65 20 6d 61 73 6b 20 6f 66  E if the mask of
2a50: 20 74 79 70 65 20 69 6e 20 65 54 79 70 65 20 6d   type in eType m
2a60: 61 74 63 68 65 73 20 74 68 65 20 74 79 70 65 20  atches the type 
2a70: 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  of the.** alloca
2a80: 74 69 6f 6e 20 70 2e 20 20 41 6c 73 6f 20 72 65  tion p.  Also re
2a90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 3d 3d  turn true if p==
2aa0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
2ab0: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
2ac0: 67 6e 65 64 20 66 6f 72 20 75 73 65 20 77 69 74  gned for use wit
2ad0: 68 69 6e 20 61 6e 20 61 73 73 65 72 74 28 29 20  hin an assert() 
2ae0: 73 74 61 74 65 6d 65 6e 74 2c 20 74 6f 0a 2a 2a  statement, to.**
2af0: 20 76 65 72 69 66 79 20 74 68 65 20 74 79 70 65   verify the type
2b00: 20 6f 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   of an allocatio
2b10: 6e 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  n.  For example:
2b20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  .**.**     asser
2b30: 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  t( sqlite3Memdeb
2b40: 75 67 48 61 73 54 79 70 65 28 70 2c 20 4d 45 4d  ugHasType(p, MEM
2b50: 54 59 50 45 5f 44 42 29 20 29 3b 0a 2a 2f 0a 69  TYPE_DB) );.*/.i
2b60: 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  nt sqlite3Memdeb
2b70: 75 67 48 61 73 54 79 70 65 28 76 6f 69 64 20 2a  ugHasType(void *
2b80: 70 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  p, u8 eType){.  
2b90: 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20 20 69 66  int rc = 1;.  if
2ba0: 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ( p && sqlite3Gl
2bb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
2bc0: 6c 6c 6f 63 3d 3d 73 71 6c 69 74 65 33 4d 65 6d  lloc==sqlite3Mem
2bd0: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74  Malloc ){.    st
2be0: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
2bf0: 20 2a 70 48 64 72 3b 0a 20 20 20 20 70 48 64 72   *pHdr;.    pHdr
2c00: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73   = sqlite3Memsys
2c10: 47 65 74 48 65 61 64 65 72 28 70 29 3b 0a 20 20  GetHeader(p);.  
2c20: 20 20 61 73 73 65 72 74 28 20 70 48 64 72 2d 3e    assert( pHdr->
2c30: 69 46 6f 72 65 47 75 61 72 64 3d 3d 46 4f 52 45  iForeGuard==FORE
2c40: 47 55 41 52 44 20 29 3b 20 20 20 20 20 20 20 20  GUARD );        
2c50: 20 2f 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 69   /* Allocation i
2c60: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69  s valid */.    i
2c70: 66 28 20 28 70 48 64 72 2d 3e 65 54 79 70 65 26  f( (pHdr->eType&
2c80: 65 54 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eType)==0 ){.   
2c90: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
2ca0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2cc0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6d 61  n TRUE if the ma
2cd0: 73 6b 20 6f 66 20 74 79 70 65 20 69 6e 20 65 54  sk of type in eT
2ce0: 79 70 65 20 6d 61 74 63 68 65 73 20 6e 6f 20 62  ype matches no b
2cf0: 69 74 73 20 6f 66 20 74 68 65 20 74 79 70 65 20  its of the type 
2d00: 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  of the.** alloca
2d10: 74 69 6f 6e 20 70 2e 20 20 41 6c 73 6f 20 72 65  tion p.  Also re
2d20: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 3d 3d  turn true if p==
2d30: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
2d40: 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69   routine is desi
2d50: 67 6e 65 64 20 66 6f 72 20 75 73 65 20 77 69 74  gned for use wit
2d60: 68 69 6e 20 61 6e 20 61 73 73 65 72 74 28 29 20  hin an assert() 
2d70: 73 74 61 74 65 6d 65 6e 74 2c 20 74 6f 0a 2a 2a  statement, to.**
2d80: 20 76 65 72 69 66 79 20 74 68 65 20 74 79 70 65   verify the type
2d90: 20 6f 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   of an allocatio
2da0: 6e 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  n.  For example:
2db0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  .**.**     asser
2dc0: 74 28 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  t( sqlite3Memdeb
2dd0: 75 67 4e 6f 54 79 70 65 28 70 2c 20 4d 45 4d 54  ugNoType(p, MEMT
2de0: 59 50 45 5f 44 42 29 20 29 3b 0a 2a 2f 0a 69 6e  YPE_DB) );.*/.in
2df0: 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  t sqlite3Memdebu
2e00: 67 4e 6f 54 79 70 65 28 76 6f 69 64 20 2a 70 2c  gNoType(void *p,
2e10: 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69 6e   u8 eType){.  in
2e20: 74 20 72 63 20 3d 20 31 3b 0a 20 20 69 66 28 20  t rc = 1;.  if( 
2e30: 70 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  p && sqlite3Glob
2e40: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
2e50: 6f 63 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 4d 61  oc==sqlite3MemMa
2e60: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72 75  lloc ){.    stru
2e70: 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a  ct MemBlockHdr *
2e80: 70 48 64 72 3b 0a 20 20 20 20 70 48 64 72 20 3d  pHdr;.    pHdr =
2e90: 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65   sqlite3MemsysGe
2ea0: 74 48 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20  tHeader(p);.    
2eb0: 61 73 73 65 72 74 28 20 70 48 64 72 2d 3e 69 46  assert( pHdr->iF
2ec0: 6f 72 65 47 75 61 72 64 3d 3d 46 4f 52 45 47 55  oreGuard==FOREGU
2ed0: 41 52 44 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ARD );         /
2ee0: 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * Allocation is 
2ef0: 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 66 28  valid */.    if(
2f00: 20 28 70 48 64 72 2d 3e 65 54 79 70 65 26 65 54   (pHdr->eType&eT
2f10: 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ype)!=0 ){.     
2f20: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
2f30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2f50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 61 63 6b 74   number of backt
2f60: 72 61 63 65 20 6c 65 76 65 6c 73 20 6b 65 70 74  race levels kept
2f70: 20 66 6f 72 20 65 61 63 68 20 61 6c 6c 6f 63 61   for each alloca
2f80: 74 69 6f 6e 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  tion..** A value
2f90: 20 6f 66 20 7a 65 72 6f 20 74 75 72 6e 73 20 6f   of zero turns o
2fa0: 66 66 20 62 61 63 6b 74 72 61 63 69 6e 67 2e 20  ff backtracing. 
2fb0: 20 54 68 65 20 6e 75 6d 62 65 72 20 69 73 20 61   The number is a
2fc0: 6c 77 61 79 73 20 72 6f 75 6e 64 65 64 0a 2a 2a  lways rounded.**
2fd0: 20 75 70 20 74 6f 20 61 20 6d 75 6c 74 69 70 6c   up to a multipl
2fe0: 65 20 6f 66 20 32 2e 0a 2a 2f 0a 76 6f 69 64 20  e of 2..*/.void 
2ff0: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42  sqlite3MemdebugB
3000: 61 63 6b 74 72 61 63 65 28 69 6e 74 20 64 65 70  acktrace(int dep
3010: 74 68 29 7b 0a 20 20 69 66 28 20 64 65 70 74 68  th){.  if( depth
3020: 3c 30 20 29 7b 20 64 65 70 74 68 20 3d 20 30 3b  <0 ){ depth = 0;
3030: 20 7d 0a 20 20 69 66 28 20 64 65 70 74 68 3e 32   }.  if( depth>2
3040: 30 20 29 7b 20 64 65 70 74 68 20 3d 20 32 30 3b  0 ){ depth = 20;
3050: 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 28 64 65   }.  depth = (de
3060: 70 74 68 2b 31 29 26 30 78 66 65 3b 0a 20 20 6d  pth+1)&0xfe;.  m
3070: 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20  em.nBacktrace = 
3080: 64 65 70 74 68 3b 0a 7d 0a 0a 76 6f 69 64 20 73  depth;.}..void s
3090: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61  qlite3MemdebugBa
30a0: 63 6b 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28  cktraceCallback(
30b0: 76 6f 69 64 20 28 2a 78 42 61 63 6b 74 72 61 63  void (*xBacktrac
30c0: 65 29 28 69 6e 74 2c 20 69 6e 74 2c 20 76 6f 69  e)(int, int, voi
30d0: 64 20 2a 2a 29 29 7b 0a 20 20 6d 65 6d 2e 78 42  d **)){.  mem.xB
30e0: 61 63 6b 74 72 61 63 65 20 3d 20 78 42 61 63 6b  acktrace = xBack
30f0: 74 72 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  trace;.}../*.** 
3100: 53 65 74 20 74 68 65 20 74 69 74 6c 65 20 73 74  Set the title st
3110: 72 69 6e 67 20 66 6f 72 20 73 75 62 73 65 71 75  ring for subsequ
3120: 65 6e 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e  ent allocations.
3130: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3140: 4d 65 6d 64 65 62 75 67 53 65 74 74 69 74 6c 65  MemdebugSettitle
3150: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69  (const char *zTi
3160: 74 6c 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  tle){.  unsigned
3170: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
3180: 53 74 72 6c 65 6e 33 30 28 7a 54 69 74 6c 65 29  Strlen30(zTitle)
3190: 20 2b 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f   + 1;.  sqlite3_
31a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e  mutex_enter(mem.
31b0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 3e  mutex);.  if( n>
31c0: 3d 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69 74  =sizeof(mem.zTit
31d0: 6c 65 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66  le) ) n = sizeof
31e0: 28 6d 65 6d 2e 7a 54 69 74 6c 65 29 2d 31 3b 0a  (mem.zTitle)-1;.
31f0: 20 20 6d 65 6d 63 70 79 28 6d 65 6d 2e 7a 54 69    memcpy(mem.zTi
3200: 74 6c 65 2c 20 7a 54 69 74 6c 65 2c 20 6e 29 3b  tle, zTitle, n);
3210: 0a 20 20 6d 65 6d 2e 7a 54 69 74 6c 65 5b 6e 5d  .  mem.zTitle[n]
3220: 20 3d 20 30 3b 0a 20 20 6d 65 6d 2e 6e 54 69 74   = 0;.  mem.nTit
3230: 6c 65 20 3d 20 52 4f 55 4e 44 38 28 6e 29 3b 0a  le = ROUND8(n);.
3240: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3250: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
3260: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
3270: 33 4d 65 6d 64 65 62 75 67 53 79 6e 63 28 29 7b  3MemdebugSync(){
3280: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
3290: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 66  ckHdr *pHdr;.  f
32a0: 6f 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46 69 72  or(pHdr=mem.pFir
32b0: 73 74 3b 20 70 48 64 72 3b 20 70 48 64 72 3d 70  st; pHdr; pHdr=p
32c0: 48 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Hdr->pNext){.   
32d0: 20 76 6f 69 64 20 2a 2a 70 42 74 20 3d 20 28 76   void **pBt = (v
32e0: 6f 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20 20 20  oid**)pHdr;.    
32f0: 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61  pBt -= pHdr->nBa
3300: 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20  cktraceSlots;.  
3310: 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63 65    mem.xBacktrace
3320: 28 70 48 64 72 2d 3e 69 53 69 7a 65 2c 20 70 48  (pHdr->iSize, pH
3330: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2d 31  dr->nBacktrace-1
3340: 2c 20 26 70 42 74 5b 31 5d 29 3b 0a 20 20 7d 0a  , &pBt[1]);.  }.
3350: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
3360: 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64  e file indicated
3370: 20 61 6e 64 20 77 72 69 74 65 20 61 20 6c 6f 67   and write a log
3380: 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65 64 20   of all unfreed 
3390: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 61 6c 6c 6f 63  memory .** alloc
33a0: 61 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68 61 74  ations into that
33b0: 20 6c 6f 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   log..*/.void sq
33c0: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 44 75 6d  lite3MemdebugDum
33d0: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  p(const char *zF
33e0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 46 49 4c 45  ilename){.  FILE
33f0: 20 2a 6f 75 74 3b 0a 20 20 73 74 72 75 63 74 20   *out;.  struct 
3400: 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64  MemBlockHdr *pHd
3410: 72 3b 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b  r;.  void **pBt;
3420: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 75 74 20  .  int i;.  out 
3430: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
3440: 65 2c 20 22 77 22 29 3b 0a 20 20 69 66 28 20 6f  e, "w");.  if( o
3450: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ut==0 ){.    fpr
3460: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2a 2a  intf(stderr, "**
3470: 20 55 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70 75   Unable to outpu
3480: 74 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 20 6f  t memory debug o
3490: 75 74 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a 2a  utput log: %s **
34a0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34b0: 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
34c0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  me);.    return;
34d0: 0a 20 20 7d 0a 20 20 66 6f 72 28 70 48 64 72 3d  .  }.  for(pHdr=
34e0: 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48 64 72  mem.pFirst; pHdr
34f0: 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65  ; pHdr=pHdr->pNe
3500: 78 74 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  xt){.    char *z
3510: 20 3d 20 28 63 68 61 72 2a 29 70 48 64 72 3b 0a   = (char*)pHdr;.
3520: 20 20 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e      z -= pHdr->n
3530: 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 2a 73  BacktraceSlots*s
3540: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 70  izeof(void*) + p
3550: 48 64 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20 20 20  Hdr->nTitle;.   
3560: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2a   fprintf(out, "*
3570: 2a 2a 2a 20 25 6c 6c 64 20 62 79 74 65 73 20 61  *** %lld bytes a
3580: 74 20 25 70 20 66 72 6f 6d 20 25 73 20 2a 2a 2a  t %p from %s ***
3590: 2a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  *\n", .         
35a0: 20 20 20 70 48 64 72 2d 3e 69 53 69 7a 65 2c 20     pHdr->iSize, 
35b0: 26 70 48 64 72 5b 31 5d 2c 20 70 48 64 72 2d 3e  &pHdr[1], pHdr->
35c0: 6e 54 69 74 6c 65 20 3f 20 7a 20 3a 20 22 3f 3f  nTitle ? z : "??
35d0: 3f 22 29 3b 0a 20 20 20 20 69 66 28 20 70 48 64  ?");.    if( pHd
35e0: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20 29 7b  r->nBacktrace ){
35f0: 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28 6f 75  .      fflush(ou
3600: 74 29 3b 0a 20 20 20 20 20 20 70 42 74 20 3d 20  t);.      pBt = 
3610: 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b 0a 20 20  (void**)pHdr;.  
3620: 20 20 20 20 70 42 74 20 2d 3d 20 70 48 64 72 2d      pBt -= pHdr-
3630: 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73  >nBacktraceSlots
3640: 3b 0a 20 20 20 20 20 20 62 61 63 6b 74 72 61 63  ;.      backtrac
3650: 65 5f 73 79 6d 62 6f 6c 73 5f 66 64 28 70 42 74  e_symbols_fd(pBt
3660: 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61  , pHdr->nBacktra
3670: 63 65 2c 20 66 69 6c 65 6e 6f 28 6f 75 74 29 29  ce, fileno(out))
3680: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
3690: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
36a0: 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
36b0: 6f 75 74 2c 20 22 43 4f 55 4e 54 53 3a 5c 6e 22  out, "COUNTS:\n"
36c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
36d0: 4e 43 53 49 5a 45 2d 31 3b 20 69 2b 2b 29 7b 0a  NCSIZE-1; i++){.
36e0: 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c      if( mem.nAll
36f0: 6f 63 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 66  oc[i] ){.      f
3700: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
3710: 25 35 64 3a 20 25 31 30 64 20 25 31 30 64 20 25  %5d: %10d %10d %
3720: 31 30 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  10d\n", .       
3730: 20 20 20 20 20 69 2a 38 2c 20 6d 65 6d 2e 6e 41       i*8, mem.nA
3740: 6c 6c 6f 63 5b 69 5d 2c 20 6d 65 6d 2e 6e 43 75  lloc[i], mem.nCu
3750: 72 72 65 6e 74 5b 69 5d 2c 20 6d 65 6d 2e 6d 78  rrent[i], mem.mx
3760: 43 75 72 72 65 6e 74 5b 69 5d 29 3b 0a 20 20 20  Current[i]);.   
3770: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d   }.  }.  if( mem
3780: 2e 6e 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 2d 31  .nAlloc[NCSIZE-1
3790: 5d 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ] ){.    fprintf
37a0: 28 6f 75 74 2c 20 22 20 20 20 25 35 64 3a 20 25  (out, "   %5d: %
37b0: 31 30 64 20 25 31 30 64 20 25 31 30 64 5c 6e 22  10d %10d %10d\n"
37c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 4e  ,.             N
37d0: 43 53 49 5a 45 2a 38 2d 38 2c 20 6d 65 6d 2e 6e  CSIZE*8-8, mem.n
37e0: 41 6c 6c 6f 63 5b 4e 43 53 49 5a 45 2d 31 5d 2c  Alloc[NCSIZE-1],
37f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  .             me
3800: 6d 2e 6e 43 75 72 72 65 6e 74 5b 4e 43 53 49 5a  m.nCurrent[NCSIZ
3810: 45 2d 31 5d 2c 20 6d 65 6d 2e 6d 78 43 75 72 72  E-1], mem.mxCurr
3820: 65 6e 74 5b 4e 43 53 49 5a 45 2d 31 5d 29 3b 0a  ent[NCSIZE-1]);.
3830: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74    }.  fclose(out
3840: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
3850: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3860: 20 74 69 6d 65 73 20 73 71 6c 69 74 65 33 4d 65   times sqlite3Me
3870: 6d 4d 61 6c 6c 6f 63 28 29 20 68 61 73 20 62 65  mMalloc() has be
3880: 65 6e 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e  en called..*/.in
3890: 74 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  t sqlite3Memdebu
38a0: 67 4d 61 6c 6c 6f 63 43 6f 75 6e 74 28 29 7b 0a  gMallocCount(){.
38b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
38c0: 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 66 6f 72  Total = 0;.  for
38d0: 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45 3b 20  (i=0; i<NCSIZE; 
38e0: 69 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 74 61 6c  i++){.    nTotal
38f0: 20 2b 3d 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69   += mem.nAlloc[i
3900: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
3910: 6e 54 6f 74 61 6c 3b 0a 7d 0a 0a 0a 23 65 6e 64  nTotal;.}...#end
3920: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 45 4d  if /* SQLITE_MEM
3930: 44 45 42 55 47 20 2a 2f 0a                       DEBUG */.