/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact dce31758da87ec2cfa52ba4c5df1aed6e07d8e8f:


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 28 69 6e  p);.  return (in
14d0: 74 29 70 48 64 72 2d 3e 69 53 69 7a 65 3b 0a 7d  t)pHdr->iSize;.}
14e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
14f0: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
1500: 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74  location subsyst
1510: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  em..*/.static in
1520: 74 20 73 71 6c 69 74 65 33 4d 65 6d 49 6e 69 74  t sqlite3MemInit
1530: 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b  (void *NotUsed){
1540: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1550: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
1560: 61 73 73 65 72 74 28 20 28 73 69 7a 65 6f 66 28  assert( (sizeof(
1570: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
1580: 64 72 29 26 37 29 20 3d 3d 20 30 20 29 3b 0a 20  dr)&7) == 0 );. 
1590: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
15a0: 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74  balConfig.bMemst
15b0: 61 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  at ){.    /* If 
15c0: 6d 65 6d 6f 72 79 20 73 74 61 74 75 73 20 69 73  memory status is
15d0: 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
15e0: 68 65 20 6d 61 6c 6c 6f 63 2e 63 20 77 72 61 70  he malloc.c wrap
15f0: 70 65 72 20 77 69 6c 6c 20 61 6c 72 65 61 64 79  per will already
1600: 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 20 74 68 65  .    ** hold the
1610: 20 53 54 41 54 49 43 5f 4d 45 4d 20 6d 75 74 65   STATIC_MEM mute
1620: 78 20 77 68 65 6e 20 74 68 65 20 72 6f 75 74 69  x when the routi
1630: 6e 65 73 20 68 65 72 65 20 61 72 65 20 69 6e 76  nes here are inv
1640: 6f 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  oked. */.    mem
1650: 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  .mutex = sqlite3
1660: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
1670: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1680: 45 4d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  EM);.  }.  retur
1690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16a0: 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69  /*.** Deinitiali
16b0: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
16c0: 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74  location subsyst
16d0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  em..*/.static vo
16e0: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 68 75  id sqlite3MemShu
16f0: 74 64 6f 77 6e 28 76 6f 69 64 20 2a 4e 6f 74 55  tdown(void *NotU
1700: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
1710: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
1720: 29 3b 0a 20 20 6d 65 6d 2e 6d 75 74 65 78 20 3d  );.  mem.mutex =
1730: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75   0;.}../*.** Rou
1740: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
1750: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
1760: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
1770: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
1780: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  c int sqlite3Mem
1790: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
17a0: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
17b0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  n);.}../*.** Fil
17c0: 6c 20 61 20 62 75 66 66 65 72 20 77 69 74 68 20  l a buffer with 
17d0: 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 62 79  pseudo-random by
17e0: 74 65 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  tes.  This is us
17f0: 65 64 20 74 6f 20 70 72 65 73 65 74 0a 2a 2a 20  ed to preset.** 
1800: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
1810: 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   new memory allo
1820: 63 61 74 69 6f 6e 20 74 6f 20 75 6e 70 72 65 64  cation to unpred
1830: 69 63 74 61 62 6c 65 20 76 61 6c 75 65 73 20 61  ictable values a
1840: 6e 64 0a 2a 2a 20 74 6f 20 63 6c 65 61 72 20 74  nd.** to clear t
1850: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1860: 66 72 65 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  freed allocation
1870: 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c   to unpredictabl
1880: 65 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  e values..*/.sta
1890: 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46  tic void randomF
18a0: 69 6c 6c 28 63 68 61 72 20 2a 70 42 75 66 2c 20  ill(char *pBuf, 
18b0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  int nByte){.  un
18c0: 73 69 67 6e 65 64 20 69 6e 74 20 78 2c 20 79 2c  signed int x, y,
18d0: 20 72 3b 0a 20 20 78 20 3d 20 53 51 4c 49 54 45   r;.  x = SQLITE
18e0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 42 75 66  _PTR_TO_INT(pBuf
18f0: 29 3b 0a 20 20 79 20 3d 20 6e 42 79 74 65 20 7c  );.  y = nByte |
1900: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6e 42 79   1;.  while( nBy
1910: 74 65 20 3e 3d 20 34 20 29 7b 0a 20 20 20 20 78  te >= 4 ){.    x
1920: 20 3d 20 28 78 3e 3e 31 29 20 5e 20 28 2d 28 69   = (x>>1) ^ (-(i
1930: 6e 74 29 28 78 26 31 29 20 26 20 30 78 64 30 30  nt)(x&1) & 0xd00
1940: 30 30 30 30 31 29 3b 0a 20 20 20 20 79 20 3d 20  00001);.    y = 
1950: 79 2a 31 31 30 33 35 31 35 32 34 35 20 2b 20 31  y*1103515245 + 1
1960: 32 33 34 35 3b 0a 20 20 20 20 72 20 3d 20 78 20  2345;.    r = x 
1970: 5e 20 79 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  ^ y;.    *(int*)
1980: 70 42 75 66 20 3d 20 72 3b 0a 20 20 20 20 70 42  pBuf = r;.    pB
1990: 75 66 20 2b 3d 20 34 3b 0a 20 20 20 20 6e 42 79  uf += 4;.    nBy
19a0: 74 65 20 2d 3d 20 34 3b 0a 20 20 7d 0a 20 20 77  te -= 4;.  }.  w
19b0: 68 69 6c 65 28 20 6e 42 79 74 65 2d 2d 20 3e 20  hile( nByte-- > 
19c0: 30 20 29 7b 0a 20 20 20 20 78 20 3d 20 28 78 3e  0 ){.    x = (x>
19d0: 3e 31 29 20 5e 20 28 2d 28 69 6e 74 29 28 78 26  >1) ^ (-(int)(x&
19e0: 31 29 20 26 20 30 78 64 30 30 30 30 30 30 31 29  1) & 0xd0000001)
19f0: 3b 0a 20 20 20 20 79 20 3d 20 79 2a 31 31 30 33  ;.    y = y*1103
1a00: 35 31 35 32 34 35 20 2b 20 31 32 33 34 35 3b 0a  515245 + 12345;.
1a10: 20 20 20 20 72 20 3d 20 78 20 5e 20 79 3b 0a 20      r = x ^ y;. 
1a20: 20 20 20 2a 28 70 42 75 66 2b 2b 29 20 3d 20 72     *(pBuf++) = r
1a30: 20 26 20 30 78 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   & 0xff;.  }.}..
1a40: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
1a50: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 6d 65  Byte bytes of me
1a60: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
1a70: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 65 6d  void *sqlite3Mem
1a80: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
1a90: 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  ){.  struct MemB
1aa0: 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20  lockHdr *pHdr;. 
1ab0: 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 63   void **pBt;.  c
1ac0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 2a 70  har *z;.  int *p
1ad0: 49 6e 74 3b 0a 20 20 76 6f 69 64 20 2a 70 20 3d  Int;.  void *p =
1ae0: 20 30 3b 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53   0;.  int totalS
1af0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65  ize;.  int nRese
1b00: 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rve;.  sqlite3_m
1b10: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d  utex_enter(mem.m
1b20: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
1b30: 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 3d 3d 30   mem.disallow==0
1b40: 20 29 3b 0a 20 20 6e 52 65 73 65 72 76 65 20 3d   );.  nReserve =
1b50: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
1b60: 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 6e 52    totalSize = nR
1b70: 65 73 65 72 76 65 20 2b 20 73 69 7a 65 6f 66 28  eserve + sizeof(
1b80: 2a 70 48 64 72 29 20 2b 20 73 69 7a 65 6f 66 28  *pHdr) + sizeof(
1b90: 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20  int) +.         
1ba0: 20 20 20 20 20 20 6d 65 6d 2e 6e 42 61 63 6b 74        mem.nBackt
1bb0: 72 61 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64  race*sizeof(void
1bc0: 2a 29 20 2b 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b  *) + mem.nTitle;
1bd0: 0a 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f  .  p = malloc(to
1be0: 74 61 6c 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  talSize);.  if( 
1bf0: 70 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 3b 0a  p ){.    z = p;.
1c00: 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a      pBt = (void*
1c10: 2a 29 26 7a 5b 6d 65 6d 2e 6e 54 69 74 6c 65 5d  *)&z[mem.nTitle]
1c20: 3b 0a 20 20 20 20 70 48 64 72 20 3d 20 28 73 74  ;.    pHdr = (st
1c30: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
1c40: 2a 29 26 70 42 74 5b 6d 65 6d 2e 6e 42 61 63 6b  *)&pBt[mem.nBack
1c50: 74 72 61 63 65 5d 3b 0a 20 20 20 20 70 48 64 72  trace];.    pHdr
1c60: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
1c70: 20 70 48 64 72 2d 3e 70 50 72 65 76 20 3d 20 6d   pHdr->pPrev = m
1c80: 65 6d 2e 70 4c 61 73 74 3b 0a 20 20 20 20 69 66  em.pLast;.    if
1c90: 28 20 6d 65 6d 2e 70 4c 61 73 74 20 29 7b 0a 20  ( mem.pLast ){. 
1ca0: 20 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 2d 3e       mem.pLast->
1cb0: 70 4e 65 78 74 20 3d 20 70 48 64 72 3b 0a 20 20  pNext = pHdr;.  
1cc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
1cd0: 65 6d 2e 70 46 69 72 73 74 20 3d 20 70 48 64 72  em.pFirst = pHdr
1ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 2e  ;.    }.    mem.
1cf0: 70 4c 61 73 74 20 3d 20 70 48 64 72 3b 0a 20 20  pLast = pHdr;.  
1d00: 20 20 70 48 64 72 2d 3e 69 46 6f 72 65 47 75 61    pHdr->iForeGua
1d10: 72 64 20 3d 20 46 4f 52 45 47 55 41 52 44 3b 0a  rd = FOREGUARD;.
1d20: 20 20 20 20 70 48 64 72 2d 3e 65 54 79 70 65 20      pHdr->eType 
1d30: 3d 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 3b 0a  = MEMTYPE_HEAP;.
1d40: 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74      pHdr->nBackt
1d50: 72 61 63 65 53 6c 6f 74 73 20 3d 20 6d 65 6d 2e  raceSlots = mem.
1d60: 6e 42 61 63 6b 74 72 61 63 65 3b 0a 20 20 20 20  nBacktrace;.    
1d70: 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3d 20 6d  pHdr->nTitle = m
1d80: 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 20 20 69  em.nTitle;.    i
1d90: 66 28 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63  f( mem.nBacktrac
1da0: 65 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  e ){.      void 
1db0: 2a 61 41 64 64 72 5b 34 30 5d 3b 0a 20 20 20 20  *aAddr[40];.    
1dc0: 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61    pHdr->nBacktra
1dd0: 63 65 20 3d 20 62 61 63 6b 74 72 61 63 65 28 61  ce = backtrace(a
1de0: 41 64 64 72 2c 20 6d 65 6d 2e 6e 42 61 63 6b 74  Addr, mem.nBackt
1df0: 72 61 63 65 2b 31 29 2d 31 3b 0a 20 20 20 20 20  race+1)-1;.     
1e00: 20 6d 65 6d 63 70 79 28 70 42 74 2c 20 26 61 41   memcpy(pBt, &aA
1e10: 64 64 72 5b 31 5d 2c 20 70 48 64 72 2d 3e 6e 42  ddr[1], pHdr->nB
1e20: 61 63 6b 74 72 61 63 65 2a 73 69 7a 65 6f 66 28  acktrace*sizeof(
1e30: 76 6f 69 64 2a 29 29 3b 0a 20 20 20 20 20 20 61  void*));.      a
1e40: 73 73 65 72 74 28 70 42 74 5b 30 5d 29 3b 0a 20  ssert(pBt[0]);. 
1e50: 20 20 20 20 20 69 66 28 20 6d 65 6d 2e 78 42 61       if( mem.xBa
1e60: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
1e70: 20 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63     mem.xBacktrac
1e80: 65 28 6e 42 79 74 65 2c 20 70 48 64 72 2d 3e 6e  e(nByte, pHdr->n
1e90: 42 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 61 41  Backtrace-1, &aA
1ea0: 64 64 72 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  ddr[1]);.      }
1eb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ec0: 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61    pHdr->nBacktra
1ed0: 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ce = 0;.    }.  
1ee0: 20 20 69 66 28 20 6d 65 6d 2e 6e 54 69 74 6c 65    if( mem.nTitle
1ef0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1f00: 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20  (z, mem.zTitle, 
1f10: 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b 0a 20 20 20  mem.nTitle);.   
1f20: 20 7d 0a 20 20 20 20 70 48 64 72 2d 3e 69 53 69   }.    pHdr->iSi
1f30: 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze = nByte;.    
1f40: 61 64 6a 75 73 74 53 74 61 74 73 28 6e 42 79 74  adjustStats(nByt
1f50: 65 2c 20 2b 31 29 3b 0a 20 20 20 20 70 49 6e 74  e, +1);.    pInt
1f60: 20 3d 20 28 69 6e 74 2a 29 26 70 48 64 72 5b 31   = (int*)&pHdr[1
1f70: 5d 3b 0a 20 20 20 20 70 49 6e 74 5b 6e 52 65 73  ];.    pInt[nRes
1f80: 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e 74 29  erve/sizeof(int)
1f90: 5d 20 3d 20 52 45 41 52 47 55 41 52 44 3b 0a 20  ] = REARGUARD;. 
1fa0: 20 20 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 28 63     randomFill((c
1fb0: 68 61 72 2a 29 70 49 6e 74 2c 20 6e 42 79 74 65  har*)pInt, nByte
1fc0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 28 28  );.    memset(((
1fd0: 63 68 61 72 2a 29 70 49 6e 74 29 2b 6e 42 79 74  char*)pInt)+nByt
1fe0: 65 2c 20 30 78 36 35 2c 20 6e 52 65 73 65 72 76  e, 0x65, nReserv
1ff0: 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 20  e-nByte);.    p 
2000: 3d 20 28 76 6f 69 64 2a 29 70 49 6e 74 3b 0a 20  = (void*)pInt;. 
2010: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
2020: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
2030: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ex);.  return p;
2040: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20   .}../*.** Free 
2050: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
2060: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  c void sqlite3Me
2070: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
2080: 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65  or){.  struct Me
2090: 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b  mBlockHdr *pHdr;
20a0: 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20  .  void **pBt;. 
20b0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 61 73 73 65   char *z;.  asse
20c0: 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  rt( sqlite3Globa
20d0: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
20e0: 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
20f0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
2100: 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ex==0 .       ||
2110: 20 6d 65 6d 2e 6d 75 74 65 78 21 3d 30 20 29 3b   mem.mutex!=0 );
2120: 0a 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74 65  .  pHdr = sqlite
2130: 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72  3MemsysGetHeader
2140: 28 70 50 72 69 6f 72 29 3b 0a 20 20 70 42 74 20  (pPrior);.  pBt 
2150: 3d 20 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b 0a  = (void**)pHdr;.
2160: 20 20 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e 6e    pBt -= pHdr->n
2170: 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b 0a  BacktraceSlots;.
2180: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2190: 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29  enter(mem.mutex)
21a0: 3b 0a 20 20 69 66 28 20 70 48 64 72 2d 3e 70 50  ;.  if( pHdr->pP
21b0: 72 65 76 20 29 7b 0a 20 20 20 20 61 73 73 65 72  rev ){.    asser
21c0: 74 28 20 70 48 64 72 2d 3e 70 50 72 65 76 2d 3e  t( pHdr->pPrev->
21d0: 70 4e 65 78 74 3d 3d 70 48 64 72 20 29 3b 0a 20  pNext==pHdr );. 
21e0: 20 20 20 70 48 64 72 2d 3e 70 50 72 65 76 2d 3e     pHdr->pPrev->
21f0: 70 4e 65 78 74 20 3d 20 70 48 64 72 2d 3e 70 4e  pNext = pHdr->pN
2200: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
2210: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 46    assert( mem.pF
2220: 69 72 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20  irst==pHdr );.  
2230: 20 20 6d 65 6d 2e 70 46 69 72 73 74 20 3d 20 70    mem.pFirst = p
2240: 48 64 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  Hdr->pNext;.  }.
2250: 20 20 69 66 28 20 70 48 64 72 2d 3e 70 4e 65 78    if( pHdr->pNex
2260: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
2270: 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pHdr->pNext->pP
2280: 72 65 76 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20  rev==pHdr );.   
2290: 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pHdr->pNext->pP
22a0: 72 65 76 20 3d 20 70 48 64 72 2d 3e 70 50 72 65  rev = pHdr->pPre
22b0: 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  v;.  }else{.    
22c0: 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 4c 61 73  assert( mem.pLas
22d0: 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 6d  t==pHdr );.    m
22e0: 65 6d 2e 70 4c 61 73 74 20 3d 20 70 48 64 72 2d  em.pLast = pHdr-
22f0: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 7a 20  >pPrev;.  }.  z 
2300: 3d 20 28 63 68 61 72 2a 29 70 42 74 3b 0a 20 20  = (char*)pBt;.  
2310: 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 54 69 74 6c  z -= pHdr->nTitl
2320: 65 3b 0a 20 20 61 64 6a 75 73 74 53 74 61 74 73  e;.  adjustStats
2330: 28 28 69 6e 74 29 70 48 64 72 2d 3e 69 53 69 7a  ((int)pHdr->iSiz
2340: 65 2c 20 2d 31 29 3b 0a 20 20 72 61 6e 64 6f 6d  e, -1);.  random
2350: 46 69 6c 6c 28 7a 2c 20 73 69 7a 65 6f 66 28 76  Fill(z, sizeof(v
2360: 6f 69 64 2a 29 2a 70 48 64 72 2d 3e 6e 42 61 63  oid*)*pHdr->nBac
2370: 6b 74 72 61 63 65 53 6c 6f 74 73 20 2b 20 73 69  ktraceSlots + si
2380: 7a 65 6f 66 28 2a 70 48 64 72 29 20 2b 0a 20 20  zeof(*pHdr) +.  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
23a0: 6e 74 29 70 48 64 72 2d 3e 69 53 69 7a 65 20 2b  nt)pHdr->iSize +
23b0: 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 70   sizeof(int) + p
23c0: 48 64 72 2d 3e 6e 54 69 74 6c 65 29 3b 0a 20 20  Hdr->nTitle);.  
23d0: 66 72 65 65 28 7a 29 3b 0a 20 20 73 71 6c 69 74  free(z);.  sqlit
23e0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
23f0: 65 6d 2e 6d 75 74 65 78 29 3b 20 20 0a 7d 0a 0a  em.mutex);  .}..
2400: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2410: 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73   size of an exis
2420: 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ting memory allo
2430: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
2440: 72 20 74 68 69 73 20 64 65 62 75 67 67 69 6e 67  r this debugging
2450: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
2460: 20 77 65 20 2a 61 6c 77 61 79 73 2a 20 6d 61 6b   we *always* mak
2470: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  e a copy of the.
2480: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e  ** allocation in
2490: 74 6f 20 61 20 6e 65 77 20 70 6c 61 63 65 20 69  to a new place i
24a0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 49 6e 20 74 68  n memory.  In th
24b0: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 20 0a  is way, if the .
24c0: 2a 2a 20 68 69 67 68 65 72 20 6c 65 76 65 6c 20  ** higher level 
24d0: 63 6f 64 65 20 69 73 20 75 73 69 6e 67 20 70 6f  code is using po
24e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 6c 64  inter to the old
24f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
2500: 69 73 20 0a 2a 2a 20 6d 75 63 68 20 6d 6f 72 65  is .** much more
2510: 20 6c 69 6b 65 6c 79 20 74 6f 20 62 72 65 61 6b   likely to break
2520: 20 61 6e 64 20 77 65 20 61 72 65 20 6d 75 63 68   and we are much
2530: 20 6d 6f 72 65 20 6c 69 6b 69 6e 67 20 74 6f 20   more liking to 
2540: 66 69 6e 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  find.** the erro
2550: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2560: 64 20 2a 73 71 6c 69 74 65 33 4d 65 6d 52 65 61  d *sqlite3MemRea
2570: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
2580: 72 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  r, int nByte){. 
2590: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
25a0: 48 64 72 20 2a 70 4f 6c 64 48 64 72 3b 0a 20 20  Hdr *pOldHdr;.  
25b0: 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 61 73  void *pNew;.  as
25c0: 73 65 72 74 28 20 6d 65 6d 2e 64 69 73 61 6c 6c  sert( mem.disall
25d0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
25e0: 74 28 20 28 6e 42 79 74 65 20 26 20 37 29 3d 3d  t( (nByte & 7)==
25f0: 30 20 29 3b 20 20 20 20 20 2f 2a 20 45 56 3a 20  0 );     /* EV: 
2600: 52 2d 34 36 31 39 39 2d 33 30 32 34 39 20 2a 2f  R-46199-30249 */
2610: 0a 20 20 70 4f 6c 64 48 64 72 20 3d 20 73 71 6c  .  pOldHdr = sql
2620: 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61  ite3MemsysGetHea
2630: 64 65 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70  der(pPrior);.  p
2640: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  New = sqlite3Mem
2650: 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  Malloc(nByte);. 
2660: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2670: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 50   memcpy(pNew, pP
2680: 72 69 6f 72 2c 20 28 69 6e 74 29 28 6e 42 79 74  rior, (int)(nByt
2690: 65 3c 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65  e<pOldHdr->iSize
26a0: 20 3f 20 6e 42 79 74 65 20 3a 20 70 4f 6c 64 48   ? nByte : pOldH
26b0: 64 72 2d 3e 69 53 69 7a 65 29 29 3b 0a 20 20 20  dr->iSize));.   
26c0: 20 69 66 28 20 6e 42 79 74 65 3e 70 4f 6c 64 48   if( nByte>pOldH
26d0: 64 72 2d 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20  dr->iSize ){.   
26e0: 20 20 20 72 61 6e 64 6f 6d 46 69 6c 6c 28 26 28     randomFill(&(
26f0: 28 63 68 61 72 2a 29 70 4e 65 77 29 5b 70 4f 6c  (char*)pNew)[pOl
2700: 64 48 64 72 2d 3e 69 53 69 7a 65 5d 2c 20 6e 42  dHdr->iSize], nB
2710: 79 74 65 20 2d 20 28 69 6e 74 29 70 4f 6c 64 48  yte - (int)pOldH
2720: 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20 20  dr->iSize);.    
2730: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d  }.    sqlite3Mem
2740: 46 72 65 65 28 70 50 72 69 6f 72 29 3b 0a 20 20  Free(pPrior);.  
2750: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
2770: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
2780: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2790: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
27a0: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
27b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
27c0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
27d0: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
27e0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a  n this file..*/.
27f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
2800: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
2810: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2820: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
2830: 6f 64 73 20 64 65 66 61 75 6c 74 4d 65 74 68 6f  ods defaultMetho
2840: 64 73 20 3d 20 7b 0a 20 20 20 20 20 73 71 6c 69  ds = {.     sqli
2850: 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20  te3MemMalloc,.  
2860: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65     sqlite3MemFre
2870: 65 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d  e,.     sqlite3M
2880: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 20  emRealloc,.     
2890: 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65 2c 0a  sqlite3MemSize,.
28a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 52       sqlite3MemR
28b0: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 20 73 71 6c  oundup,.     sql
28c0: 69 74 65 33 4d 65 6d 49 6e 69 74 2c 0a 20 20 20  ite3MemInit,.   
28d0: 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 68 75 74    sqlite3MemShut
28e0: 64 6f 77 6e 2c 0a 20 20 20 20 20 30 0a 20 20 7d  down,.     0.  }
28f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
2900: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
2910: 5f 4d 41 4c 4c 4f 43 2c 20 26 64 65 66 61 75 6c  _MALLOC, &defaul
2920: 74 4d 65 74 68 6f 64 73 29 3b 0a 7d 0a 0a 2f 2a  tMethods);.}../*
2930: 0a 2a 2a 20 53 65 74 20 74 68 65 20 22 74 79 70  .** Set the "typ
2940: 65 22 20 6f 66 20 61 6e 20 61 6c 6c 6f 63 61 74  e" of an allocat
2950: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2960: 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74 54  ite3MemdebugSetT
2970: 79 70 65 28 76 6f 69 64 20 2a 70 2c 20 75 38 20  ype(void *p, u8 
2980: 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 70 20  eType){.  if( p 
2990: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
29a0: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
29b0: 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c  ==sqlite3MemMall
29c0: 6f 63 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  oc ){.    struct
29d0: 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48   MemBlockHdr *pH
29e0: 64 72 3b 0a 20 20 20 20 70 48 64 72 20 3d 20 73  dr;.    pHdr = s
29f0: 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48  qlite3MemsysGetH
2a00: 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 61 73  eader(p);.    as
2a10: 73 65 72 74 28 20 70 48 64 72 2d 3e 69 46 6f 72  sert( pHdr->iFor
2a20: 65 47 75 61 72 64 3d 3d 46 4f 52 45 47 55 41 52  eGuard==FOREGUAR
2a30: 44 20 29 3b 0a 20 20 20 20 70 48 64 72 2d 3e 65  D );.    pHdr->e
2a40: 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20  Type = eType;.  
2a50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2a60: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6d 61  n TRUE if the ma
2a70: 73 6b 20 6f 66 20 74 79 70 65 20 69 6e 20 65 54  sk of type in eT
2a80: 79 70 65 20 6d 61 74 63 68 65 73 20 74 68 65 20  ype matches the 
2a90: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 61  type of the.** a
2aa0: 6c 6c 6f 63 61 74 69 6f 6e 20 70 2e 20 20 41 6c  llocation p.  Al
2ab0: 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2ac0: 66 20 70 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  f p==NULL..**.**
2ad0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2ae0: 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73   designed for us
2af0: 65 20 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65  e within an asse
2b00: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2c 20  rt() statement, 
2b10: 74 6f 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 65  to.** verify the
2b20: 20 74 79 70 65 20 6f 66 20 61 6e 20 61 6c 6c 6f   type of an allo
2b30: 63 61 74 69 6f 6e 2e 20 20 46 6f 72 20 65 78 61  cation.  For exa
2b40: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2b50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d  assert( sqlite3M
2b60: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 70  emdebugHasType(p
2b70: 2c 20 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b  , MEMTYPE_DB) );
2b80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
2b90: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 76  emdebugHasType(v
2ba0: 6f 69 64 20 2a 70 2c 20 75 38 20 65 54 79 70 65  oid *p, u8 eType
2bb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  ){.  int rc = 1;
2bc0: 0a 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69  .  if( p && sqli
2bd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2be0: 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69 74  m.xMalloc==sqlit
2bf0: 65 33 4d 65 6d 4d 61 6c 6c 6f 63 20 29 7b 0a 20  e3MemMalloc ){. 
2c00: 20 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f     struct MemBlo
2c10: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 20  ckHdr *pHdr;.   
2c20: 20 70 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d   pHdr = sqlite3M
2c30: 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28 70  emsysGetHeader(p
2c40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c50: 48 64 72 2d 3e 69 46 6f 72 65 47 75 61 72 64 3d  Hdr->iForeGuard=
2c60: 3d 46 4f 52 45 47 55 41 52 44 20 29 3b 20 20 20  =FOREGUARD );   
2c70: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
2c80: 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ion is valid */.
2c90: 20 20 20 20 69 66 28 20 28 70 48 64 72 2d 3e 65      if( (pHdr->e
2ca0: 54 79 70 65 26 65 54 79 70 65 29 3d 3d 30 20 29  Type&eType)==0 )
2cb0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
2cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2cd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2ce0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2cf0: 68 65 20 6d 61 73 6b 20 6f 66 20 74 79 70 65 20  he mask of type 
2d00: 69 6e 20 65 54 79 70 65 20 6d 61 74 63 68 65 73  in eType matches
2d10: 20 6e 6f 20 62 69 74 73 20 6f 66 20 74 68 65 20   no bits of the 
2d20: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 61  type of the.** a
2d30: 6c 6c 6f 63 61 74 69 6f 6e 20 70 2e 20 20 41 6c  llocation p.  Al
2d40: 73 6f 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  so return true i
2d50: 66 20 70 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  f p==NULL..**.**
2d60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2d70: 20 64 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73   designed for us
2d80: 65 20 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65  e within an asse
2d90: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2c 20  rt() statement, 
2da0: 74 6f 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 65  to.** verify the
2db0: 20 74 79 70 65 20 6f 66 20 61 6e 20 61 6c 6c 6f   type of an allo
2dc0: 63 61 74 69 6f 6e 2e 20 20 46 6f 72 20 65 78 61  cation.  For exa
2dd0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
2de0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4d  assert( sqlite3M
2df0: 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 70 2c  emdebugNoType(p,
2e00: 20 4d 45 4d 54 59 50 45 5f 44 42 29 20 29 3b 0a   MEMTYPE_DB) );.
2e10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
2e20: 6d 64 65 62 75 67 4e 6f 54 79 70 65 28 76 6f 69  mdebugNoType(voi
2e30: 64 20 2a 70 2c 20 75 38 20 65 54 79 70 65 29 7b  d *p, u8 eType){
2e40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20  .  int rc = 1;. 
2e50: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
2e60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
2e70: 78 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69 74 65 33  xMalloc==sqlite3
2e80: 4d 65 6d 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  MemMalloc ){.   
2e90: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
2ea0: 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 20 20 70  Hdr *pHdr;.    p
2eb0: 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  Hdr = sqlite3Mem
2ec0: 73 79 73 47 65 74 48 65 61 64 65 72 28 70 29 3b  sysGetHeader(p);
2ed0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 64  .    assert( pHd
2ee0: 72 2d 3e 69 46 6f 72 65 47 75 61 72 64 3d 3d 46  r->iForeGuard==F
2ef0: 4f 52 45 47 55 41 52 44 20 29 3b 20 20 20 20 20  OREGUARD );     
2f00: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 69 6f      /* Allocatio
2f10: 6e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  n is valid */.  
2f20: 20 20 69 66 28 20 28 70 48 64 72 2d 3e 65 54 79    if( (pHdr->eTy
2f30: 70 65 26 65 54 79 70 65 29 21 3d 30 20 29 7b 0a  pe&eType)!=0 ){.
2f40: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
2f50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2f60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
2f70: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2f80: 62 61 63 6b 74 72 61 63 65 20 6c 65 76 65 6c 73  backtrace levels
2f90: 20 6b 65 70 74 20 66 6f 72 20 65 61 63 68 20 61   kept for each a
2fa0: 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 41 20  llocation..** A 
2fb0: 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 20 74 75  value of zero tu
2fc0: 72 6e 73 20 6f 66 66 20 62 61 63 6b 74 72 61 63  rns off backtrac
2fd0: 69 6e 67 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ing.  The number
2fe0: 20 69 73 20 61 6c 77 61 79 73 20 72 6f 75 6e 64   is always round
2ff0: 65 64 0a 2a 2a 20 75 70 20 74 6f 20 61 20 6d 75  ed.** up to a mu
3000: 6c 74 69 70 6c 65 20 6f 66 20 32 2e 0a 2a 2f 0a  ltiple of 2..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64  void sqlite3Memd
3020: 65 62 75 67 42 61 63 6b 74 72 61 63 65 28 69 6e  ebugBacktrace(in
3030: 74 20 64 65 70 74 68 29 7b 0a 20 20 69 66 28 20  t depth){.  if( 
3040: 64 65 70 74 68 3c 30 20 29 7b 20 64 65 70 74 68  depth<0 ){ depth
3050: 20 3d 20 30 3b 20 7d 0a 20 20 69 66 28 20 64 65   = 0; }.  if( de
3060: 70 74 68 3e 32 30 20 29 7b 20 64 65 70 74 68 20  pth>20 ){ depth 
3070: 3d 20 32 30 3b 20 7d 0a 20 20 64 65 70 74 68 20  = 20; }.  depth 
3080: 3d 20 28 64 65 70 74 68 2b 31 29 26 30 78 66 65  = (depth+1)&0xfe
3090: 3b 0a 20 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61  ;.  mem.nBacktra
30a0: 63 65 20 3d 20 64 65 70 74 68 3b 0a 7d 0a 0a 76  ce = depth;.}..v
30b0: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  oid sqlite3Memde
30c0: 62 75 67 42 61 63 6b 74 72 61 63 65 43 61 6c 6c  bugBacktraceCall
30d0: 62 61 63 6b 28 76 6f 69 64 20 28 2a 78 42 61 63  back(void (*xBac
30e0: 6b 74 72 61 63 65 29 28 69 6e 74 2c 20 69 6e 74  ktrace)(int, int
30f0: 2c 20 76 6f 69 64 20 2a 2a 29 29 7b 0a 20 20 6d  , void **)){.  m
3100: 65 6d 2e 78 42 61 63 6b 74 72 61 63 65 20 3d 20  em.xBacktrace = 
3110: 78 42 61 63 6b 74 72 61 63 65 3b 0a 7d 0a 0a 2f  xBacktrace;.}../
3120: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 69 74  *.** Set the tit
3130: 6c 65 20 73 74 72 69 6e 67 20 66 6f 72 20 73 75  le string for su
3140: 62 73 65 71 75 65 6e 74 20 61 6c 6c 6f 63 61 74  bsequent allocat
3150: 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ions..*/.void sq
3160: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 65 74  lite3MemdebugSet
3170: 74 69 74 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  title(const char
3180: 20 2a 7a 54 69 74 6c 65 29 7b 0a 20 20 75 6e 73   *zTitle){.  uns
3190: 69 67 6e 65 64 20 69 6e 74 20 6e 20 3d 20 73 71  igned int n = sq
31a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
31b0: 69 74 6c 65 29 20 2b 20 31 3b 0a 20 20 73 71 6c  itle) + 1;.  sql
31c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
31d0: 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 69  (mem.mutex);.  i
31e0: 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 6d 65 6d  f( n>=sizeof(mem
31f0: 2e 7a 54 69 74 6c 65 29 20 29 20 6e 20 3d 20 73  .zTitle) ) n = s
3200: 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69 74 6c 65  izeof(mem.zTitle
3210: 29 2d 31 3b 0a 20 20 6d 65 6d 63 70 79 28 6d 65  )-1;.  memcpy(me
3220: 6d 2e 7a 54 69 74 6c 65 2c 20 7a 54 69 74 6c 65  m.zTitle, zTitle
3230: 2c 20 6e 29 3b 0a 20 20 6d 65 6d 2e 7a 54 69 74  , n);.  mem.zTit
3240: 6c 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  le[n] = 0;.  mem
3250: 2e 6e 54 69 74 6c 65 20 3d 20 52 4f 55 4e 44 38  .nTitle = ROUND8
3260: 28 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  (n);.  sqlite3_m
3270: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d  utex_leave(mem.m
3280: 75 74 65 78 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73  utex);.}..void s
3290: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53 79  qlite3MemdebugSy
32a0: 6e 63 28 29 7b 0a 20 20 73 74 72 75 63 74 20 4d  nc(){.  struct M
32b0: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72  emBlockHdr *pHdr
32c0: 3b 0a 20 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d  ;.  for(pHdr=mem
32d0: 2e 70 46 69 72 73 74 3b 20 70 48 64 72 3b 20 70  .pFirst; pHdr; p
32e0: 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29  Hdr=pHdr->pNext)
32f0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 70 42 74  {.    void **pBt
3300: 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48 64 72 3b   = (void**)pHdr;
3310: 0a 20 20 20 20 70 42 74 20 2d 3d 20 70 48 64 72  .    pBt -= pHdr
3320: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74  ->nBacktraceSlot
3330: 73 3b 0a 20 20 20 20 6d 65 6d 2e 78 42 61 63 6b  s;.    mem.xBack
3340: 74 72 61 63 65 28 28 69 6e 74 29 70 48 64 72 2d  trace((int)pHdr-
3350: 3e 69 53 69 7a 65 2c 20 70 48 64 72 2d 3e 6e 42  >iSize, pHdr->nB
3360: 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 70 42 74  acktrace-1, &pBt
3370: 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  [1]);.  }.}../*.
3380: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
3390: 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77   indicated and w
33a0: 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c  rite a log of al
33b0: 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  l unfreed memory
33c0: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   .** allocations
33d0: 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a   into that log..
33e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
33f0: 65 6d 64 65 62 75 67 44 75 6d 70 28 63 6f 6e 73  emdebugDump(cons
3400: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
3410: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b  e){.  FILE *out;
3420: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
3430: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76  ckHdr *pHdr;.  v
3440: 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 69 6e 74  oid **pBt;.  int
3450: 20 69 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65   i;.  out = fope
3460: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22  n(zFilename, "w"
3470: 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
3480: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
3490: 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c  tderr, "** Unabl
34a0: 65 20 74 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f  e to output memo
34b0: 72 79 20 64 65 62 75 67 20 6f 75 74 70 75 74 20  ry debug output 
34c0: 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0a 20  log: %s **\n",. 
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
34f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3500: 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46   for(pHdr=mem.pF
3510: 69 72 73 74 3b 20 70 48 64 72 3b 20 70 48 64 72  irst; pHdr; pHdr
3520: 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pHdr->pNext){. 
3530: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
3540: 61 72 2a 29 70 48 64 72 3b 0a 20 20 20 20 7a 20  ar*)pHdr;.    z 
3550: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
3560: 61 63 65 53 6c 6f 74 73 2a 73 69 7a 65 6f 66 28  aceSlots*sizeof(
3570: 76 6f 69 64 2a 29 20 2b 20 70 48 64 72 2d 3e 6e  void*) + pHdr->n
3580: 54 69 74 6c 65 3b 0a 20 20 20 20 66 70 72 69 6e  Title;.    fprin
3590: 74 66 28 6f 75 74 2c 20 22 2a 2a 2a 2a 20 25 6c  tf(out, "**** %l
35a0: 6c 64 20 62 79 74 65 73 20 61 74 20 25 70 20 66  ld bytes at %p f
35b0: 72 6f 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 20  rom %s ****\n", 
35c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 48 64  .            pHd
35d0: 72 2d 3e 69 53 69 7a 65 2c 20 26 70 48 64 72 5b  r->iSize, &pHdr[
35e0: 31 5d 2c 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65  1], pHdr->nTitle
35f0: 20 3f 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20   ? z : "???");. 
3600: 20 20 20 69 66 28 20 70 48 64 72 2d 3e 6e 42 61     if( pHdr->nBa
3610: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
3620: 20 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20   fflush(out);.  
3630: 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a      pBt = (void*
3640: 2a 29 70 48 64 72 3b 0a 20 20 20 20 20 20 70 42  *)pHdr;.      pB
3650: 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b  t -= pHdr->nBack
3660: 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20  traceSlots;.    
3670: 20 20 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62    backtrace_symb
3680: 6f 6c 73 5f 66 64 28 70 42 74 2c 20 70 48 64 72  ols_fd(pBt, pHdr
3690: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2c 20 66 69  ->nBacktrace, fi
36a0: 6c 65 6e 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20  leno(out));.    
36b0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
36c0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
36d0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
36e0: 43 4f 55 4e 54 53 3a 5c 6e 22 29 3b 0a 20 20 66  COUNTS:\n");.  f
36f0: 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45  or(i=0; i<NCSIZE
3700: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  -1; i++){.    if
3710: 28 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 20  ( mem.nAlloc[i] 
3720: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
3730: 28 6f 75 74 2c 20 22 20 20 20 25 35 64 3a 20 25  (out, "   %5d: %
3740: 31 30 64 20 25 31 30 64 20 25 31 30 64 5c 6e 22  10d %10d %10d\n"
3750: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
3760: 2a 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69  *8, mem.nAlloc[i
3770: 5d 2c 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b  ], mem.nCurrent[
3780: 69 5d 2c 20 6d 65 6d 2e 6d 78 43 75 72 72 65 6e  i], mem.mxCurren
3790: 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t[i]);.    }.  }
37a0: 0a 20 20 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c 6f  .  if( mem.nAllo
37b0: 63 5b 4e 43 53 49 5a 45 2d 31 5d 20 29 7b 0a 20  c[NCSIZE-1] ){. 
37c0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
37d0: 22 20 20 20 25 35 64 3a 20 25 31 30 64 20 25 31  "   %5d: %10d %1
37e0: 30 64 20 25 31 30 64 5c 6e 22 2c 0a 20 20 20 20  0d %10d\n",.    
37f0: 20 20 20 20 20 20 20 20 20 4e 43 53 49 5a 45 2a           NCSIZE*
3800: 38 2d 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b  8-8, mem.nAlloc[
3810: 4e 43 53 49 5a 45 2d 31 5d 2c 0a 20 20 20 20 20  NCSIZE-1],.     
3820: 20 20 20 20 20 20 20 20 6d 65 6d 2e 6e 43 75 72          mem.nCur
3830: 72 65 6e 74 5b 4e 43 53 49 5a 45 2d 31 5d 2c 20  rent[NCSIZE-1], 
3840: 6d 65 6d 2e 6d 78 43 75 72 72 65 6e 74 5b 4e 43  mem.mxCurrent[NC
3850: 53 49 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20  SIZE-1]);.  }.  
3860: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a  fclose(out);.}..
3870: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3880: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
3890: 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f   sqlite3MemMallo
38a0: 63 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  c() has been cal
38b0: 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  led..*/.int sqli
38c0: 74 65 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f  te3MemdebugMallo
38d0: 63 43 6f 75 6e 74 28 29 7b 0a 20 20 69 6e 74 20  cCount(){.  int 
38e0: 69 3b 0a 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20  i;.  int nTotal 
38f0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
3900: 69 3c 4e 43 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a  i<NCSIZE; i++){.
3910: 20 20 20 20 6e 54 6f 74 61 6c 20 2b 3d 20 6d 65      nTotal += me
3920: 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 3b 0a 20 20 7d  m.nAlloc[i];.  }
3930: 0a 20 20 72 65 74 75 72 6e 20 6e 54 6f 74 61 6c  .  return nTotal
3940: 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.}...#endif /* 
3950: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20  SQLITE_MEMDEBUG 
3960: 2a 2f 0a                                         */.