/ Hex Artifact Content
Login

Artifact 9e5f72e38573db9598fe60d3fa530d473cc8714e:


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 70 4f 6c 64 48 64 72 20 3d 20 73 71 6c 69    pOldHdr = sqli
25d0: 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64  te3MemsysGetHead
25e0: 65 72 28 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  er(pPrior);.  pN
25f0: 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4d  ew = sqlite3MemM
2600: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
2610: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
2620: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 50 72  memcpy(pNew, pPr
2630: 69 6f 72 2c 20 6e 42 79 74 65 3c 70 4f 6c 64 48  ior, nByte<pOldH
2640: 64 72 2d 3e 69 53 69 7a 65 20 3f 20 6e 42 79 74  dr->iSize ? nByt
2650: 65 20 3a 20 70 4f 6c 64 48 64 72 2d 3e 69 53 69  e : pOldHdr->iSi
2660: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  ze);.    if( nBy
2670: 74 65 3e 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a  te>pOldHdr->iSiz
2680: 65 20 29 7b 0a 20 20 20 20 20 20 72 61 6e 64 6f  e ){.      rando
2690: 6d 46 69 6c 6c 28 26 28 28 63 68 61 72 2a 29 70  mFill(&((char*)p
26a0: 4e 65 77 29 5b 70 4f 6c 64 48 64 72 2d 3e 69 53  New)[pOldHdr->iS
26b0: 69 7a 65 5d 2c 20 6e 42 79 74 65 20 2d 20 70 4f  ize], nByte - pO
26c0: 6c 64 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20  ldHdr->iSize);. 
26d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26e0: 4d 65 6d 46 72 65 65 28 70 50 72 69 6f 72 29 3b  MemFree(pPrior);
26f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
2700: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  ew;.}../*.** Pop
2710: 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65  ulate the low-le
2720: 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  vel memory alloc
2730: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70  ation function p
2740: 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71  ointers in.** sq
2750: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2760: 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72  g.m with pointer
2770: 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65  s to the routine
2780: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a  s in this file..
2790: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
27a0: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69  emSetDefault(voi
27b0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
27c0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
27d0: 65 74 68 6f 64 73 20 64 65 66 61 75 6c 74 4d 65  ethods defaultMe
27e0: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 20 73  thods = {.     s
27f0: 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 2c  qlite3MemMalloc,
2800: 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d  .     sqlite3Mem
2810: 46 72 65 65 2c 0a 20 20 20 20 20 73 71 6c 69 74  Free,.     sqlit
2820: 65 33 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  e3MemRealloc,.  
2830: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a     sqlite3MemSiz
2840: 65 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d  e,.     sqlite3M
2850: 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 20  emRoundup,.     
2860: 73 71 6c 69 74 65 33 4d 65 6d 49 6e 69 74 2c 0a  sqlite3MemInit,.
2870: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 53       sqlite3MemS
2880: 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 20 30 0a  hutdown,.     0.
2890: 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63    };.  sqlite3_c
28a0: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
28b0: 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 26 64 65 66  FIG_MALLOC, &def
28c0: 61 75 6c 74 4d 65 74 68 6f 64 73 29 3b 0a 7d 0a  aultMethods);.}.
28d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 22  ./*.** Set the "
28e0: 74 79 70 65 22 20 6f 66 20 61 6e 20 61 6c 6c 6f  type" of an allo
28f0: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  cation..*/.void 
2900: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 53  sqlite3MemdebugS
2910: 65 74 54 79 70 65 28 76 6f 69 64 20 2a 70 2c 20  etType(void *p, 
2920: 75 38 20 65 54 79 70 65 29 7b 0a 20 20 69 66 28  u8 eType){.  if(
2930: 20 70 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f   p && sqlite3Glo
2940: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
2950: 6c 6f 63 3d 3d 73 71 6c 69 74 65 33 4d 65 6d 4d  loc==sqlite3MemM
2960: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 73 74 72  alloc ){.    str
2970: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
2980: 2a 70 48 64 72 3b 0a 20 20 20 20 70 48 64 72 20  *pHdr;.    pHdr 
2990: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47  = sqlite3MemsysG
29a0: 65 74 48 65 61 64 65 72 28 70 29 3b 0a 20 20 20  etHeader(p);.   
29b0: 20 61 73 73 65 72 74 28 20 70 48 64 72 2d 3e 69   assert( pHdr->i
29c0: 46 6f 72 65 47 75 61 72 64 3d 3d 46 4f 52 45 47  ForeGuard==FOREG
29d0: 55 41 52 44 20 29 3b 0a 20 20 20 20 70 48 64 72  UARD );.    pHdr
29e0: 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b  ->eType = eType;
29f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2a00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2a10: 20 6d 61 73 6b 20 6f 66 20 74 79 70 65 20 69 6e   mask of type in
2a20: 20 65 54 79 70 65 20 6d 61 74 63 68 65 73 20 74   eType matches t
2a30: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
2a40: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 2e 20  * allocation p. 
2a50: 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
2a60: 65 20 69 66 20 70 3d 3d 4e 55 4c 4c 2e 0a 2a 2a  e if p==NULL..**
2a70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a80: 20 69 73 20 64 65 73 69 67 6e 65 64 20 66 6f 72   is designed for
2a90: 20 75 73 65 20 77 69 74 68 69 6e 20 61 6e 20 61   use within an a
2aa0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2ab0: 74 2c 20 74 6f 0a 2a 2a 20 76 65 72 69 66 79 20  t, to.** verify 
2ac0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 6e 20 61  the type of an a
2ad0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 46 6f 72 20  llocation.  For 
2ae0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2af0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2b00: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
2b10: 65 28 70 2c 20 4d 45 4d 54 59 50 45 5f 44 42 29  e(p, MEMTYPE_DB)
2b20: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
2b30: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
2b40: 65 28 76 6f 69 64 20 2a 70 2c 20 75 38 20 65 54  e(void *p, u8 eT
2b50: 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
2b60: 20 31 3b 0a 20 20 69 66 28 20 70 20 26 26 20 73   1;.  if( p && s
2b70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2b80: 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 73 71  ig.m.xMalloc==sq
2b90: 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 20 29  lite3MemMalloc )
2ba0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 4d 65 6d  {.    struct Mem
2bb0: 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a  BlockHdr *pHdr;.
2bc0: 20 20 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74      pHdr = sqlit
2bd0: 65 33 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65  e3MemsysGetHeade
2be0: 72 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r(p);.    assert
2bf0: 28 20 70 48 64 72 2d 3e 69 46 6f 72 65 47 75 61  ( pHdr->iForeGua
2c00: 72 64 3d 3d 46 4f 52 45 47 55 41 52 44 20 29 3b  rd==FOREGUARD );
2c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2c20: 63 61 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20  cation is valid 
2c30: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 48 64 72  */.    if( (pHdr
2c40: 2d 3e 65 54 79 70 65 26 65 54 79 70 65 29 3d 3d  ->eType&eType)==
2c50: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2c60: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2c70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c80: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2c90: 66 20 74 68 65 20 6d 61 73 6b 20 6f 66 20 74 79  f the mask of ty
2ca0: 70 65 20 69 6e 20 65 54 79 70 65 20 6d 61 74 63  pe in eType matc
2cb0: 68 65 73 20 6e 6f 20 62 69 74 73 20 6f 66 20 74  hes no bits of t
2cc0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
2cd0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 2e 20  * allocation p. 
2ce0: 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72 75   Also return tru
2cf0: 65 20 69 66 20 70 3d 3d 4e 55 4c 4c 2e 0a 2a 2a  e if p==NULL..**
2d00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2d10: 20 69 73 20 64 65 73 69 67 6e 65 64 20 66 6f 72   is designed for
2d20: 20 75 73 65 20 77 69 74 68 69 6e 20 61 6e 20 61   use within an a
2d30: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2d40: 74 2c 20 74 6f 0a 2a 2a 20 76 65 72 69 66 79 20  t, to.** verify 
2d50: 74 68 65 20 74 79 70 65 20 6f 66 20 61 6e 20 61  the type of an a
2d60: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 46 6f 72 20  llocation.  For 
2d70: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
2d80: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2d90: 65 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 65  e3MemdebugNoType
2da0: 28 70 2c 20 4d 45 4d 54 59 50 45 5f 44 42 29 20  (p, MEMTYPE_DB) 
2db0: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2dc0: 33 4d 65 6d 64 65 62 75 67 4e 6f 54 79 70 65 28  3MemdebugNoType(
2dd0: 76 6f 69 64 20 2a 70 2c 20 75 38 20 65 54 79 70  void *p, u8 eTyp
2de0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31  e){.  int rc = 1
2df0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 73 71 6c  ;.  if( p && sql
2e00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e10: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 73 71 6c 69  .m.xMalloc==sqli
2e20: 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 20 29 7b 0a  te3MemMalloc ){.
2e30: 20 20 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c      struct MemBl
2e40: 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20  ockHdr *pHdr;.  
2e50: 20 20 70 48 64 72 20 3d 20 73 71 6c 69 74 65 33    pHdr = sqlite3
2e60: 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28  MemsysGetHeader(
2e70: 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
2e80: 70 48 64 72 2d 3e 69 46 6f 72 65 47 75 61 72 64  pHdr->iForeGuard
2e90: 3d 3d 46 4f 52 45 47 55 41 52 44 20 29 3b 20 20  ==FOREGUARD );  
2ea0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
2eb0: 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 2a 2f  tion is valid */
2ec0: 0a 20 20 20 20 69 66 28 20 28 70 48 64 72 2d 3e  .    if( (pHdr->
2ed0: 65 54 79 70 65 26 65 54 79 70 65 29 21 3d 30 20  eType&eType)!=0 
2ee0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
2ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2f00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f10: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
2f20: 6f 66 20 62 61 63 6b 74 72 61 63 65 20 6c 65 76  of backtrace lev
2f30: 65 6c 73 20 6b 65 70 74 20 66 6f 72 20 65 61 63  els kept for eac
2f40: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  h allocation..**
2f50: 20 41 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f   A value of zero
2f60: 20 74 75 72 6e 73 20 6f 66 66 20 62 61 63 6b 74   turns off backt
2f70: 72 61 63 69 6e 67 2e 20 20 54 68 65 20 6e 75 6d  racing.  The num
2f80: 62 65 72 20 69 73 20 61 6c 77 61 79 73 20 72 6f  ber is always ro
2f90: 75 6e 64 65 64 0a 2a 2a 20 75 70 20 74 6f 20 61  unded.** up to a
2fa0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 32 2e 0a   multiple of 2..
2fb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
2fc0: 65 6d 64 65 62 75 67 42 61 63 6b 74 72 61 63 65  emdebugBacktrace
2fd0: 28 69 6e 74 20 64 65 70 74 68 29 7b 0a 20 20 69  (int depth){.  i
2fe0: 66 28 20 64 65 70 74 68 3c 30 20 29 7b 20 64 65  f( depth<0 ){ de
2ff0: 70 74 68 20 3d 20 30 3b 20 7d 0a 20 20 69 66 28  pth = 0; }.  if(
3000: 20 64 65 70 74 68 3e 32 30 20 29 7b 20 64 65 70   depth>20 ){ dep
3010: 74 68 20 3d 20 32 30 3b 20 7d 0a 20 20 64 65 70  th = 20; }.  dep
3020: 74 68 20 3d 20 28 64 65 70 74 68 2b 31 29 26 30  th = (depth+1)&0
3030: 78 66 65 3b 0a 20 20 6d 65 6d 2e 6e 42 61 63 6b  xfe;.  mem.nBack
3040: 74 72 61 63 65 20 3d 20 64 65 70 74 68 3b 0a 7d  trace = depth;.}
3050: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  ..void sqlite3Me
3060: 6d 64 65 62 75 67 42 61 63 6b 74 72 61 63 65 43  mdebugBacktraceC
3070: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 28 2a 78  allback(void (*x
3080: 42 61 63 6b 74 72 61 63 65 29 28 69 6e 74 2c 20  Backtrace)(int, 
3090: 69 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 29 7b 0a  int, void **)){.
30a0: 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63 65    mem.xBacktrace
30b0: 20 3d 20 78 42 61 63 6b 74 72 61 63 65 3b 0a 7d   = xBacktrace;.}
30c0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
30d0: 74 69 74 6c 65 20 73 74 72 69 6e 67 20 66 6f 72  title string for
30e0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 6c 6c 6f   subsequent allo
30f0: 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  cations..*/.void
3100: 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67   sqlite3Memdebug
3110: 53 65 74 74 69 74 6c 65 28 63 6f 6e 73 74 20 63  Settitle(const c
3120: 68 61 72 20 2a 7a 54 69 74 6c 65 29 7b 0a 20 20  har *zTitle){.  
3130: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 20 3d  unsigned int n =
3140: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
3150: 28 7a 54 69 74 6c 65 29 20 2b 20 31 3b 0a 20 20  (zTitle) + 1;.  
3160: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
3170: 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ter(mem.mutex);.
3180: 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28    if( n>=sizeof(
3190: 6d 65 6d 2e 7a 54 69 74 6c 65 29 20 29 20 6e 20  mem.zTitle) ) n 
31a0: 3d 20 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69  = sizeof(mem.zTi
31b0: 74 6c 65 29 2d 31 3b 0a 20 20 6d 65 6d 63 70 79  tle)-1;.  memcpy
31c0: 28 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 7a 54 69  (mem.zTitle, zTi
31d0: 74 6c 65 2c 20 6e 29 3b 0a 20 20 6d 65 6d 2e 7a  tle, n);.  mem.z
31e0: 54 69 74 6c 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  Title[n] = 0;.  
31f0: 6d 65 6d 2e 6e 54 69 74 6c 65 20 3d 20 52 4f 55  mem.nTitle = ROU
3200: 4e 44 38 28 6e 29 3b 0a 20 20 73 71 6c 69 74 65  ND8(n);.  sqlite
3210: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
3220: 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 76 6f 69  m.mutex);.}..voi
3230: 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75  d sqlite3Memdebu
3240: 67 53 79 6e 63 28 29 7b 0a 20 20 73 74 72 75 63  gSync(){.  struc
3250: 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70  t MemBlockHdr *p
3260: 48 64 72 3b 0a 20 20 66 6f 72 28 70 48 64 72 3d  Hdr;.  for(pHdr=
3270: 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48 64 72  mem.pFirst; pHdr
3280: 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65  ; pHdr=pHdr->pNe
3290: 78 74 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  xt){.    void **
32a0: 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48  pBt = (void**)pH
32b0: 64 72 3b 0a 20 20 20 20 70 42 74 20 2d 3d 20 70  dr;.    pBt -= p
32c0: 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53  Hdr->nBacktraceS
32d0: 6c 6f 74 73 3b 0a 20 20 20 20 6d 65 6d 2e 78 42  lots;.    mem.xB
32e0: 61 63 6b 74 72 61 63 65 28 70 48 64 72 2d 3e 69  acktrace(pHdr->i
32f0: 53 69 7a 65 2c 20 70 48 64 72 2d 3e 6e 42 61 63  Size, pHdr->nBac
3300: 6b 74 72 61 63 65 2d 31 2c 20 26 70 42 74 5b 31  ktrace-1, &pBt[1
3310: 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ]);.  }.}../*.**
3320: 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 69   Open the file i
3330: 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77 72 69  ndicated and wri
3340: 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c 6c 20  te a log of all 
3350: 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 0a  unfreed memory .
3360: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69  ** allocations i
3370: 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a 2a 2f  nto that log..*/
3380: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
3390: 64 65 62 75 67 44 75 6d 70 28 63 6f 6e 73 74 20  debugDump(const 
33a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
33b0: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20  {.  FILE *out;. 
33c0: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
33d0: 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69  Hdr *pHdr;.  voi
33e0: 64 20 2a 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69  d **pBt;.  int i
33f0: 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28  ;.  out = fopen(
3400: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22 29 3b  zFilename, "w");
3410: 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b  .  if( out==0 ){
3420: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
3430: 65 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c 65 20  err, "** Unable 
3440: 74 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 79  to output memory
3450: 20 64 65 62 75 67 20 6f 75 74 70 75 74 20 6c 6f   debug output lo
3460: 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0a 20 20 20  g: %s **\n",.   
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
3490: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
34a0: 6f 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46 69 72  or(pHdr=mem.pFir
34b0: 73 74 3b 20 70 48 64 72 3b 20 70 48 64 72 3d 70  st; pHdr; pHdr=p
34c0: 48 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Hdr->pNext){.   
34d0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
34e0: 2a 29 70 48 64 72 3b 0a 20 20 20 20 7a 20 2d 3d  *)pHdr;.    z -=
34f0: 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63   pHdr->nBacktrac
3500: 65 53 6c 6f 74 73 2a 73 69 7a 65 6f 66 28 76 6f  eSlots*sizeof(vo
3510: 69 64 2a 29 20 2b 20 70 48 64 72 2d 3e 6e 54 69  id*) + pHdr->nTi
3520: 74 6c 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  tle;.    fprintf
3530: 28 6f 75 74 2c 20 22 2a 2a 2a 2a 20 25 6c 6c 64  (out, "**** %lld
3540: 20 62 79 74 65 73 20 61 74 20 25 70 20 66 72 6f   bytes at %p fro
3550: 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 20 0a 20  m %s ****\n", . 
3560: 20 20 20 20 20 20 20 20 20 20 20 70 48 64 72 2d             pHdr-
3570: 3e 69 53 69 7a 65 2c 20 26 70 48 64 72 5b 31 5d  >iSize, &pHdr[1]
3580: 2c 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3f  , pHdr->nTitle ?
3590: 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20 20 20   z : "???");.   
35a0: 20 69 66 28 20 70 48 64 72 2d 3e 6e 42 61 63 6b   if( pHdr->nBack
35b0: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 66  trace ){.      f
35c0: 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20 20 20  flush(out);.    
35d0: 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29    pBt = (void**)
35e0: 70 48 64 72 3b 0a 20 20 20 20 20 20 70 42 74 20  pHdr;.      pBt 
35f0: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
3600: 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20 20 20  aceSlots;.      
3610: 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c  backtrace_symbol
3620: 73 5f 66 64 28 70 42 74 2c 20 70 48 64 72 2d 3e  s_fd(pBt, pHdr->
3630: 6e 42 61 63 6b 74 72 61 63 65 2c 20 66 69 6c 65  nBacktrace, file
3640: 6e 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20 20 20  no(out));.      
3650: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
3660: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
3670: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 4f  fprintf(out, "CO
3680: 55 4e 54 53 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72  UNTS:\n");.  for
3690: 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45 2d 31  (i=0; i<NCSIZE-1
36a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
36b0: 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 20 29 7b  mem.nAlloc[i] ){
36c0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
36d0: 75 74 2c 20 22 20 20 20 25 35 64 3a 20 25 31 30  ut, "   %5d: %10
36e0: 64 20 25 31 30 64 20 25 31 30 64 5c 6e 22 2c 20  d %10d %10d\n", 
36f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2a 38  .            i*8
3700: 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 2c  , mem.nAlloc[i],
3710: 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 5d   mem.nCurrent[i]
3720: 2c 20 6d 65 6d 2e 6d 78 43 75 72 72 65 6e 74 5b  , mem.mxCurrent[
3730: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i]);.    }.  }. 
3740: 20 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b   if( mem.nAlloc[
3750: 4e 43 53 49 5a 45 2d 31 5d 20 29 7b 0a 20 20 20  NCSIZE-1] ){.   
3760: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
3770: 20 20 25 35 64 3a 20 25 31 30 64 20 25 31 30 64    %5d: %10d %10d
3780: 20 25 31 30 64 5c 6e 22 2c 0a 20 20 20 20 20 20   %10d\n",.      
3790: 20 20 20 20 20 20 20 4e 43 53 49 5a 45 2a 38 2d         NCSIZE*8-
37a0: 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 4e 43  8, mem.nAlloc[NC
37b0: 53 49 5a 45 2d 31 5d 2c 0a 20 20 20 20 20 20 20  SIZE-1],.       
37c0: 20 20 20 20 20 20 6d 65 6d 2e 6e 43 75 72 72 65        mem.nCurre
37d0: 6e 74 5b 4e 43 53 49 5a 45 2d 31 5d 2c 20 6d 65  nt[NCSIZE-1], me
37e0: 6d 2e 6d 78 43 75 72 72 65 6e 74 5b 4e 43 53 49  m.mxCurrent[NCSI
37f0: 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20 66 63  ZE-1]);.  }.  fc
3800: 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a  lose(out);.}../*
3810: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
3820: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 73  umber of times s
3830: 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28  qlite3MemMalloc(
3840: 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
3850: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3860: 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f 63 43  3MemdebugMallocC
3870: 6f 75 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b  ount(){.  int i;
3880: 0a 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20  .  int nTotal = 
3890: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
38a0: 4e 43 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20  NCSIZE; i++){.  
38b0: 20 20 6e 54 6f 74 61 6c 20 2b 3d 20 6d 65 6d 2e    nTotal += mem.
38c0: 6e 41 6c 6c 6f 63 5b 69 5d 3b 0a 20 20 7d 0a 20  nAlloc[i];.  }. 
38d0: 20 72 65 74 75 72 6e 20 6e 54 6f 74 61 6c 3b 0a   return nTotal;.
38e0: 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }...#endif /* SQ
38f0: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20 2a 2f  LITE_MEMDEBUG */
3900: 0a                                               .