/ Hex Artifact Content
Login

Artifact 87381b143530cc377592e868bd548e881c2498a3:


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 2a 0a  hods object..**.
0340: 2a 2a 20 24 49 64 3a 20 6d 65 6d 32 2e 63 2c 76  ** $Id: mem2.c,v
0350: 20 31 2e 33 37 20 32 30 30 38 2f 30 37 2f 32 35   1.37 2008/07/25
0360: 20 30 38 3a 34 39 3a 30 30 20 64 61 6e 69 65 6c   08:49:00 daniel
0370: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23  k1977 Exp $.*/.#
0380: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0390: 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  nt.h"../*.** Thi
03a0: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  s version of the
03b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f   memory allocato
03c0: 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  r is used only i
03d0: 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  f the.** SQLITE_
03e0: 4d 45 4d 44 45 42 55 47 20 6d 61 63 72 6f 20 69  MEMDEBUG macro i
03f0: 73 20 64 65 66 69 6e 65 64 0a 2a 2f 0a 23 69 66  s defined.*/.#if
0400: 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
0410: 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62  BUG../*.** The b
0420: 61 63 6b 74 72 61 63 65 20 66 75 6e 63 74 69 6f  acktrace functio
0430: 6e 61 6c 69 74 79 20 69 73 20 6f 6e 6c 79 20 61  nality is only a
0440: 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 47 4c  vailable with GL
0450: 49 42 43 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  IBC.*/.#ifdef __
0460: 47 4c 49 42 43 5f 5f 0a 20 20 65 78 74 65 72 6e  GLIBC__.  extern
0470: 20 69 6e 74 20 62 61 63 6b 74 72 61 63 65 28 76   int backtrace(v
0480: 6f 69 64 2a 2a 2c 69 6e 74 29 3b 0a 20 20 65 78  oid**,int);.  ex
0490: 74 65 72 6e 20 76 6f 69 64 20 62 61 63 6b 74 72  tern void backtr
04a0: 61 63 65 5f 73 79 6d 62 6f 6c 73 5f 66 64 28 76  ace_symbols_fd(v
04b0: 6f 69 64 2a 63 6f 6e 73 74 2a 2c 69 6e 74 2c 69  oid*const*,int,i
04c0: 6e 74 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66  nt);.#else.# def
04d0: 69 6e 65 20 62 61 63 6b 74 72 61 63 65 28 41 2c  ine backtrace(A,
04e0: 42 29 20 30 0a 23 20 64 65 66 69 6e 65 20 62 61  B) 0.# define ba
04f0: 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f  cktrace_symbols_
0500: 66 64 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66  fd(A,B,C).#endif
0510: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
0520: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .h>../*.** Each 
0530: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0540: 6e 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69  n looks like thi
0550: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d  s:.**.**  ------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 0a 2a 2a 20 20 7c 20 54 69 74 6c 65 20 7c  --.**  | Title |
05b0: 20 20 62 61 63 6b 74 72 61 63 65 20 70 6f 69 6e    backtrace poin
05c0: 74 65 72 73 20 7c 20 20 4d 65 6d 42 6c 6f 63 6b  ters |  MemBlock
05d0: 48 64 72 20 7c 20 20 61 6c 6c 6f 63 61 74 69 6f  Hdr |  allocatio
05e0: 6e 20 7c 20 20 45 6e 64 47 75 61 72 64 20 7c 0a  n |  EndGuard |.
05f0: 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **  ------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
0640: 2a 2a 20 54 68 65 20 61 70 70 6c 69 63 61 74 69  ** The applicati
0650: 6f 6e 20 63 6f 64 65 20 73 65 65 73 20 6f 6e 6c  on code sees onl
0660: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
0670: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  he allocation.  
0680: 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f 20 62 61  We have.** to ba
0690: 63 6b 20 75 70 20 66 72 6f 6d 20 74 68 65 20 61  ck up from the a
06a0: 6c 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74 65  llocation pointe
06b0: 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 4d 65  r to find the Me
06c0: 6d 42 6c 6f 63 6b 48 64 72 2e 20 20 54 68 65 0a  mBlockHdr.  The.
06d0: 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 74  ** MemBlockHdr t
06e0: 65 6c 6c 73 20 75 73 20 74 68 65 20 73 69 7a 65  ells us the size
06f0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
0700: 6f 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  on and the numbe
0710: 72 20 6f 66 0a 2a 2a 20 62 61 63 6b 74 72 61 63  r of.** backtrac
0720: 65 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  e pointers.  The
0730: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 67 75 61  re is also a gua
0740: 72 64 20 77 6f 72 64 20 61 74 20 74 68 65 20 65  rd word at the e
0750: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 4d 65 6d  nd of the.** Mem
0760: 42 6c 6f 63 6b 48 64 72 2e 0a 2a 2f 0a 73 74 72  BlockHdr..*/.str
0770: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
0780: 7b 0a 20 20 69 36 34 20 69 53 69 7a 65 3b 20 20  {.  i64 iSize;  
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
07b0: 6f 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  of this allocati
07c0: 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4d  on */.  struct M
07d0: 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 4e 65 78  emBlockHdr *pNex
07e0: 74 2c 20 2a 70 50 72 65 76 3b 20 20 2f 2a 20 4c  t, *pPrev;  /* L
07f0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
0800: 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  l unfreed memory
0810: 20 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61 63 6b   */.  char nBack
0820: 74 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  trace;          
0830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0840: 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63 65  ber of backtrace
0850: 73 20 6f 6e 20 74 68 69 73 20 61 6c 6c 6f 63 20  s on this alloc 
0860: 2a 2f 0a 20 20 63 68 61 72 20 6e 42 61 63 6b 74  */.  char nBackt
0870: 72 61 63 65 53 6c 6f 74 73 3b 20 20 20 20 20 20  raceSlots;      
0880: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69           /* Avai
0890: 6c 61 62 6c 65 20 62 61 63 6b 74 72 61 63 65 20  lable backtrace 
08a0: 73 6c 6f 74 73 20 2a 2f 0a 20 20 73 68 6f 72 74  slots */.  short
08b0: 20 6e 54 69 74 6c 65 3b 20 20 20 20 20 20 20 20   nTitle;        
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
08d0: 2a 20 42 79 74 65 73 20 6f 66 20 74 69 74 6c 65  * Bytes of title
08e0: 3b 20 69 6e 63 6c 75 64 65 73 20 27 5c 30 27 20  ; includes '\0' 
08f0: 2a 2f 0a 20 20 69 6e 74 20 69 46 6f 72 65 47 75  */.  int iForeGu
0900: 61 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ard;            
0910: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 75 61 72           /* Guar
0920: 64 20 77 6f 72 64 20 66 6f 72 20 73 61 6e 69 74  d word for sanit
0930: 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47  y */.};../*.** G
0940: 75 61 72 64 20 77 6f 72 64 73 0a 2a 2f 0a 23 64  uard words.*/.#d
0950: 65 66 69 6e 65 20 46 4f 52 45 47 55 41 52 44 20  efine FOREGUARD 
0960: 30 78 38 30 46 35 45 31 35 33 0a 23 64 65 66 69  0x80F5E153.#defi
0970: 6e 65 20 52 45 41 52 47 55 41 52 44 20 30 78 45  ne REARGUARD 0xE
0980: 34 36 37 36 42 35 33 0a 0a 2f 2a 0a 2a 2a 20 4e  4676B53../*.** N
0990: 75 6d 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20  umber of malloc 
09a0: 73 69 7a 65 20 69 6e 63 72 65 6d 65 6e 74 73 20  size increments 
09b0: 74 6f 20 74 72 61 63 6b 2e 0a 2a 2f 0a 23 64 65  to track..*/.#de
09c0: 66 69 6e 65 20 4e 43 53 49 5a 45 20 20 31 30 30  fine NCSIZE  100
09d0: 30 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  0../*.** All of 
09e0: 74 68 65 20 73 74 61 74 69 63 20 76 61 72 69 61  the static varia
09f0: 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 69  bles used by thi
0a00: 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c  s module are col
0a10: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  lected.** into a
0a20: 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75 72   single structur
0a30: 65 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e 20 20  e named "mem".  
0a40: 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65 70 20  This is to keep 
0a50: 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20 76 61  the.** static va
0a60: 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65  riables organize
0a70: 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63 65 20  d and to reduce 
0a80: 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75 74  namespace pollut
0a90: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ion.** when this
0aa0: 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 69   module is combi
0ab0: 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72 20 69  ned with other i
0ac0: 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  n the amalgamati
0ad0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  on..*/.static st
0ae0: 72 75 63 74 20 7b 0a 20 20 0a 20 20 2f 2a 0a 20  ruct {.  .  /*. 
0af0: 20 2a 2a 20 4d 75 74 65 78 20 74 6f 20 63 6f 6e   ** Mutex to con
0b00: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74  trol access to t
0b10: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0b20: 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a  tion subsystem..
0b30: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
0b40: 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 0a 20 20  utex *mutex;..  
0b50: 2f 2a 0a 20 20 2a 2a 20 48 65 61 64 20 61 6e 64  /*.  ** Head and
0b60: 20 74 61 69 6c 20 6f 66 20 61 20 6c 69 6e 6b 65   tail of a linke
0b70: 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 75  d list of all ou
0b80: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
0b90: 74 69 6f 6e 73 0a 20 20 2a 2f 0a 20 20 73 74 72  tions.  */.  str
0ba0: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
0bb0: 2a 70 46 69 72 73 74 3b 0a 20 20 73 74 72 75 63  *pFirst;.  struc
0bc0: 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a 70  t MemBlockHdr *p
0bd0: 4c 61 73 74 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20  Last;.  .  /*.  
0be0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
0bf0: 20 6c 65 76 65 6c 73 20 6f 66 20 62 61 63 6b 74   levels of backt
0c00: 72 61 63 65 20 74 6f 20 73 61 76 65 20 69 6e 20  race to save in 
0c10: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e  new allocations.
0c20: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 63  .  */.  int nBac
0c30: 6b 74 72 61 63 65 3b 0a 20 20 76 6f 69 64 20 28  ktrace;.  void (
0c40: 2a 78 42 61 63 6b 74 72 61 63 65 29 28 69 6e 74  *xBacktrace)(int
0c50: 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2a 29 3b  , int, void **);
0c60: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 69 74 6c  ..  /*.  ** Titl
0c70: 65 20 74 65 78 74 20 74 6f 20 69 6e 73 65 72 74  e text to insert
0c80: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 61 63   in front of eac
0c90: 68 20 62 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  h block.  */.  i
0ca0: 6e 74 20 6e 54 69 74 6c 65 3b 20 20 20 20 20 20  nt nTitle;      
0cb0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 54    /* Bytes of zT
0cc0: 69 74 6c 65 20 74 6f 20 73 61 76 65 2e 20 20 49  itle to save.  I
0cd0: 6e 63 6c 75 64 65 73 20 27 5c 30 27 20 61 6e 64  ncludes '\0' and
0ce0: 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20 20 63 68   padding */.  ch
0cf0: 61 72 20 7a 54 69 74 6c 65 5b 31 30 30 5d 3b 20  ar zTitle[100]; 
0d00: 20 2f 2a 20 54 68 65 20 74 69 74 6c 65 20 74 65   /* The title te
0d10: 78 74 20 2a 2f 0a 0a 20 20 2f 2a 20 0a 20 20 2a  xt */..  /* .  *
0d20: 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44  * sqlite3MallocD
0d30: 69 73 61 6c 6c 6f 77 28 29 20 69 6e 63 72 65 6d  isallow() increm
0d40: 65 6e 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ents the followi
0d50: 6e 67 20 63 6f 75 6e 74 65 72 2e 0a 20 20 2a 2a  ng counter..  **
0d60: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c   sqlite3MallocAl
0d70: 6c 6f 77 28 29 20 64 65 63 72 65 6d 65 6e 74 73  low() decrements
0d80: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20   it..  */.  int 
0d90: 64 69 73 61 6c 6c 6f 77 3b 20 2f 2a 20 44 6f 20  disallow; /* Do 
0da0: 6e 6f 74 20 61 6c 6c 6f 77 20 6d 65 6d 6f 72 79  not allow memory
0db0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 0a   allocation */..
0dc0: 20 20 2f 2a 0a 20 20 2a 2a 20 47 61 74 68 65 72    /*.  ** Gather
0dd0: 20 73 74 61 74 69 73 74 69 63 73 20 6f 6e 20 74   statistics on t
0de0: 68 65 20 73 69 7a 65 73 20 6f 66 20 6d 65 6d 6f  he sizes of memo
0df0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a  ry allocations..
0e00: 20 20 2a 2a 20 6e 41 6c 6c 6f 63 5b 69 5d 20 69    ** nAlloc[i] i
0e10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
0e20: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
0e30: 70 74 73 20 6f 66 20 69 2a 38 0a 20 20 2a 2a 20  pts of i*8.  ** 
0e40: 62 79 74 65 73 2e 20 20 69 3d 3d 4e 43 53 49 5a  bytes.  i==NCSIZ
0e50: 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  E is the number 
0e60: 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  of allocation at
0e70: 74 65 6d 70 74 73 20 66 6f 72 0a 20 20 2a 2a 20  tempts for.  ** 
0e80: 73 69 7a 65 73 20 6d 6f 72 65 20 74 68 61 6e 20  sizes more than 
0e90: 4e 43 53 49 5a 45 2a 38 20 62 79 74 65 73 2e 0a  NCSIZE*8 bytes..
0ea0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f    */.  int nAllo
0eb0: 63 5b 4e 43 53 49 5a 45 5d 3b 20 20 20 20 20 20  c[NCSIZE];      
0ec0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
0ed0: 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 2a  of allocations *
0ee0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  /.  int nCurrent
0ef0: 5b 4e 43 53 49 5a 45 5d 3b 20 20 20 20 2f 2a 20  [NCSIZE];    /* 
0f00: 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  Current number o
0f10: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f  f allocations */
0f20: 0a 20 20 69 6e 74 20 6d 78 43 75 72 72 65 6e 74  .  int mxCurrent
0f30: 5b 4e 43 53 49 5a 45 5d 3b 20 20 20 2f 2a 20 48  [NCSIZE];   /* H
0f40: 69 67 68 77 61 74 65 72 20 6d 61 72 6b 20 66 6f  ighwater mark fo
0f50: 72 20 6e 43 75 72 72 65 6e 74 20 2a 2f 0a 0a 7d  r nCurrent */..}
0f60: 20 6d 65 6d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   mem;.../*.** Ad
0f70: 6a 75 73 74 20 6d 65 6d 6f 72 79 20 75 73 61 67  just memory usag
0f80: 65 20 73 74 61 74 69 73 74 69 63 73 0a 2a 2f 0a  e statistics.*/.
0f90: 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 6a 75  static void adju
0fa0: 73 74 53 74 61 74 73 28 69 6e 74 20 69 53 69 7a  stStats(int iSiz
0fb0: 65 2c 20 69 6e 74 20 69 6e 63 72 65 6d 65 6e 74  e, int increment
0fc0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 28 28 69  ){.  int i = ((i
0fd0: 53 69 7a 65 2b 37 29 26 7e 37 29 2f 38 3b 0a 20  Size+7)&~7)/8;. 
0fe0: 20 69 66 28 20 69 3e 4e 43 53 49 5a 45 2d 31 20   if( i>NCSIZE-1 
0ff0: 29 7b 0a 20 20 20 20 69 20 3d 20 4e 43 53 49 5a  ){.    i = NCSIZ
1000: 45 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  E - 1;.  }.  if(
1010: 20 69 6e 63 72 65 6d 65 6e 74 3e 30 20 29 7b 0a   increment>0 ){.
1020: 20 20 20 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69      mem.nAlloc[i
1030: 5d 2b 2b 3b 0a 20 20 20 20 6d 65 6d 2e 6e 43 75  ]++;.    mem.nCu
1040: 72 72 65 6e 74 5b 69 5d 2b 2b 3b 0a 20 20 20 20  rrent[i]++;.    
1050: 69 66 28 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74  if( mem.nCurrent
1060: 5b 69 5d 3e 6d 65 6d 2e 6d 78 43 75 72 72 65 6e  [i]>mem.mxCurren
1070: 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6d 65  t[i] ){.      me
1080: 6d 2e 6d 78 43 75 72 72 65 6e 74 5b 69 5d 20 3d  m.mxCurrent[i] =
1090: 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b 69 5d   mem.nCurrent[i]
10a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
10b0: 0a 20 20 20 20 6d 65 6d 2e 6e 43 75 72 72 65 6e  .    mem.nCurren
10c0: 74 5b 69 5d 2d 2d 3b 0a 20 20 20 20 61 73 73 65  t[i]--;.    asse
10d0: 72 74 28 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74  rt( mem.nCurrent
10e0: 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a  [i]>=0 );.  }.}.
10f0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
1100: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 66 69 6e 64  allocation, find
1110: 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b 48 64 72   the MemBlockHdr
1120: 20 66 6f 72 20 74 68 61 74 20 61 6c 6c 6f 63 61   for that alloca
1130: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
1140: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
1150: 74 68 65 20 67 75 61 72 64 73 20 61 74 20 65 69  the guards at ei
1160: 74 68 65 72 20 65 6e 64 20 6f 66 20 74 68 65 20  ther end of the 
1170: 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 0a 2a  allocation and.*
1180: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 6e  * if they are in
1190: 63 6f 72 72 65 63 74 20 69 74 20 61 73 73 65 72  correct it asser
11a0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ts..*/.static st
11b0: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
11c0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47   *sqlite3MemsysG
11d0: 65 74 48 65 61 64 65 72 28 76 6f 69 64 20 2a 70  etHeader(void *p
11e0: 41 6c 6c 6f 63 61 74 69 6f 6e 29 7b 0a 20 20 73  Allocation){.  s
11f0: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
1200: 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 70 49 6e  r *p;.  int *pIn
1210: 74 3b 0a 20 20 75 38 20 2a 70 55 38 3b 0a 20 20  t;.  u8 *pU8;.  
1220: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 0a 20  int nReserve;.. 
1230: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4d 65 6d   p = (struct Mem
1240: 42 6c 6f 63 6b 48 64 72 2a 29 70 41 6c 6c 6f 63  BlockHdr*)pAlloc
1250: 61 74 69 6f 6e 3b 0a 20 20 70 2d 2d 3b 0a 20 20  ation;.  p--;.  
1260: 61 73 73 65 72 74 28 20 70 2d 3e 69 46 6f 72 65  assert( p->iFore
1270: 47 75 61 72 64 3d 3d 46 4f 52 45 47 55 41 52 44  Guard==FOREGUARD
1280: 20 29 3b 0a 20 20 6e 52 65 73 65 72 76 65 20 3d   );.  nReserve =
1290: 20 28 70 2d 3e 69 53 69 7a 65 2b 37 29 26 7e 37   (p->iSize+7)&~7
12a0: 3b 0a 20 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a  ;.  pInt = (int*
12b0: 29 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20 20  )pAllocation;.  
12c0: 70 55 38 20 3d 20 28 75 38 2a 29 70 41 6c 6c 6f  pU8 = (u8*)pAllo
12d0: 63 61 74 69 6f 6e 3b 0a 20 20 61 73 73 65 72 74  cation;.  assert
12e0: 28 20 70 49 6e 74 5b 6e 52 65 73 65 72 76 65 2f  ( pInt[nReserve/
12f0: 73 69 7a 65 6f 66 28 69 6e 74 29 5d 3d 3d 52 45  sizeof(int)]==RE
1300: 41 52 47 55 41 52 44 20 29 3b 0a 20 20 61 73 73  ARGUARD );.  ass
1310: 65 72 74 28 20 28 6e 52 65 73 65 72 76 65 2d 30  ert( (nReserve-0
1320: 29 3c 3d 70 2d 3e 69 53 69 7a 65 20 7c 7c 20 70  )<=p->iSize || p
1330: 55 38 5b 6e 52 65 73 65 72 76 65 2d 31 5d 3d 3d  U8[nReserve-1]==
1340: 30 78 36 35 20 29 3b 0a 20 20 61 73 73 65 72 74  0x65 );.  assert
1350: 28 20 28 6e 52 65 73 65 72 76 65 2d 31 29 3c 3d  ( (nReserve-1)<=
1360: 70 2d 3e 69 53 69 7a 65 20 7c 7c 20 70 55 38 5b  p->iSize || pU8[
1370: 6e 52 65 73 65 72 76 65 2d 32 5d 3d 3d 30 78 36  nReserve-2]==0x6
1380: 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  5 );.  assert( (
1390: 6e 52 65 73 65 72 76 65 2d 32 29 3c 3d 70 2d 3e  nReserve-2)<=p->
13a0: 69 53 69 7a 65 20 7c 7c 20 70 55 38 5b 6e 52 65  iSize || pU8[nRe
13b0: 73 65 72 76 65 2d 33 5d 3d 3d 30 78 36 35 20 29  serve-3]==0x65 )
13c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
13d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
13f0: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6c 6c 6f  s currently allo
1400: 63 61 74 65 64 20 61 74 20 61 64 64 72 65 73 73  cated at address
1410: 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   p..*/.static in
1420: 74 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65  t sqlite3MemSize
1430: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 74 72  (void *p){.  str
1440: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
1450: 2a 70 48 64 72 3b 0a 20 20 69 66 28 20 21 70 20  *pHdr;.  if( !p 
1460: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1470: 0a 20 20 7d 0a 20 20 70 48 64 72 20 3d 20 73 71  .  }.  pHdr = sq
1480: 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65  lite3MemsysGetHe
1490: 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72  ader(p);.  retur
14a0: 6e 20 70 48 64 72 2d 3e 69 53 69 7a 65 3b 0a 7d  n pHdr->iSize;.}
14b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
14c0: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
14d0: 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74  location subsyst
14e0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  em..*/.static in
14f0: 74 20 73 71 6c 69 74 65 33 4d 65 6d 49 6e 69 74  t sqlite3MemInit
1500: 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b  (void *NotUsed){
1510: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 43  .  if( !sqlite3C
1520: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 29  onfig.bMemstat )
1530: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 65 6d 6f  {.    /* If memo
1540: 72 79 20 73 74 61 74 75 73 20 69 73 20 65 6e 61  ry status is ena
1550: 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6d  bled, then the m
1560: 61 6c 6c 6f 63 2e 63 20 77 72 61 70 70 65 72 20  alloc.c wrapper 
1570: 77 69 6c 6c 20 61 6c 72 65 61 64 79 0a 20 20 20  will already.   
1580: 20 2a 2a 20 68 6f 6c 64 20 74 68 65 20 53 54 41   ** hold the STA
1590: 54 49 43 5f 4d 45 4d 20 6d 75 74 65 78 20 77 68  TIC_MEM mutex wh
15a0: 65 6e 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  en the routines 
15b0: 68 65 72 65 20 61 72 65 20 69 6e 76 6f 6b 65 64  here are invoked
15c0: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 2e 6d 75 74  . */.    mem.mut
15d0: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
15e0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15f0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
1600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1610: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1620: 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  * Deinitialize t
1630: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
1640: 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a  tion subsystem..
1650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1660: 71 6c 69 74 65 33 4d 65 6d 53 68 75 74 64 6f 77  qlite3MemShutdow
1670: 6e 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29  n(void *NotUsed)
1680: 7b 0a 20 20 6d 65 6d 2e 6d 75 74 65 78 20 3d 20  {.  mem.mutex = 
1690: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e  0;.}../*.** Roun
16a0: 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73  d up a request s
16b0: 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ize to the next 
16c0: 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  valid allocation
16d0: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
16e0: 20 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 52   int sqlite3MemR
16f0: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20  oundup(int n){. 
1700: 20 72 65 74 75 72 6e 20 28 6e 2b 37 29 20 26 20   return (n+7) & 
1710: 7e 37 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ~7;.}../*.** All
1720: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
1730: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
1740: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c  static void *sql
1750: 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  ite3MemMalloc(in
1760: 74 20 6e 42 79 74 65 29 7b 0a 20 20 73 74 72 75  t nByte){.  stru
1770: 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 2a  ct MemBlockHdr *
1780: 70 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a 2a 70  pHdr;.  void **p
1790: 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  Bt;.  char *z;. 
17a0: 20 69 6e 74 20 2a 70 49 6e 74 3b 0a 20 20 76 6f   int *pInt;.  vo
17b0: 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74  id *p = 0;.  int
17c0: 20 74 6f 74 61 6c 53 69 7a 65 3b 0a 20 20 69 6e   totalSize;.  in
17d0: 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71  t nReserve;.  sq
17e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17f0: 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20  r(mem.mutex);.  
1800: 61 73 73 65 72 74 28 20 6d 65 6d 2e 64 69 73 61  assert( mem.disa
1810: 6c 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 6e 52 65  llow==0 );.  nRe
1820: 73 65 72 76 65 20 3d 20 28 6e 42 79 74 65 2b 37  serve = (nByte+7
1830: 29 26 7e 37 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  )&~7;.  totalSiz
1840: 65 20 3d 20 6e 52 65 73 65 72 76 65 20 2b 20 73  e = nReserve + s
1850: 69 7a 65 6f 66 28 2a 70 48 64 72 29 20 2b 20 73  izeof(*pHdr) + s
1860: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 0a 20 20 20  izeof(int) +.   
1870: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 2e              mem.
1880: 6e 42 61 63 6b 74 72 61 63 65 2a 73 69 7a 65 6f  nBacktrace*sizeo
1890: 66 28 76 6f 69 64 2a 29 20 2b 20 6d 65 6d 2e 6e  f(void*) + mem.n
18a0: 54 69 74 6c 65 3b 0a 20 20 70 20 3d 20 6d 61 6c  Title;.  p = mal
18b0: 6c 6f 63 28 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  loc(totalSize);.
18c0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 7a    if( p ){.    z
18d0: 20 3d 20 70 3b 0a 20 20 20 20 70 42 74 20 3d 20   = p;.    pBt = 
18e0: 28 76 6f 69 64 2a 2a 29 26 7a 5b 6d 65 6d 2e 6e  (void**)&z[mem.n
18f0: 54 69 74 6c 65 5d 3b 0a 20 20 20 20 70 48 64 72  Title];.    pHdr
1900: 20 3d 20 28 73 74 72 75 63 74 20 4d 65 6d 42 6c   = (struct MemBl
1910: 6f 63 6b 48 64 72 2a 29 26 70 42 74 5b 6d 65 6d  ockHdr*)&pBt[mem
1920: 2e 6e 42 61 63 6b 74 72 61 63 65 5d 3b 0a 20 20  .nBacktrace];.  
1930: 20 20 70 48 64 72 2d 3e 70 4e 65 78 74 20 3d 20    pHdr->pNext = 
1940: 30 3b 0a 20 20 20 20 70 48 64 72 2d 3e 70 50 72  0;.    pHdr->pPr
1950: 65 76 20 3d 20 6d 65 6d 2e 70 4c 61 73 74 3b 0a  ev = mem.pLast;.
1960: 20 20 20 20 69 66 28 20 6d 65 6d 2e 70 4c 61 73      if( mem.pLas
1970: 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 70  t ){.      mem.p
1980: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 48  Last->pNext = pH
1990: 64 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dr;.    }else{. 
19a0: 20 20 20 20 20 6d 65 6d 2e 70 46 69 72 73 74 20       mem.pFirst 
19b0: 3d 20 70 48 64 72 3b 0a 20 20 20 20 7d 0a 20 20  = pHdr;.    }.  
19c0: 20 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70 48    mem.pLast = pH
19d0: 64 72 3b 0a 20 20 20 20 70 48 64 72 2d 3e 69 46  dr;.    pHdr->iF
19e0: 6f 72 65 47 75 61 72 64 20 3d 20 46 4f 52 45 47  oreGuard = FOREG
19f0: 55 41 52 44 3b 0a 20 20 20 20 70 48 64 72 2d 3e  UARD;.    pHdr->
1a00: 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 20  nBacktraceSlots 
1a10: 3d 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65  = mem.nBacktrace
1a20: 3b 0a 20 20 20 20 70 48 64 72 2d 3e 6e 54 69 74  ;.    pHdr->nTit
1a30: 6c 65 20 3d 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b  le = mem.nTitle;
1a40: 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 42 61  .    if( mem.nBa
1a50: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
1a60: 20 76 6f 69 64 20 2a 61 41 64 64 72 5b 34 30 5d   void *aAddr[40]
1a70: 3b 0a 20 20 20 20 20 20 70 48 64 72 2d 3e 6e 42  ;.      pHdr->nB
1a80: 61 63 6b 74 72 61 63 65 20 3d 20 62 61 63 6b 74  acktrace = backt
1a90: 72 61 63 65 28 61 41 64 64 72 2c 20 6d 65 6d 2e  race(aAddr, mem.
1aa0: 6e 42 61 63 6b 74 72 61 63 65 2b 31 29 2d 31 3b  nBacktrace+1)-1;
1ab0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1ac0: 74 2c 20 26 61 41 64 64 72 5b 31 5d 2c 20 70 48  t, &aAddr[1], pH
1ad0: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2a 73  dr->nBacktrace*s
1ae0: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 3b 0a 20  izeof(void*));. 
1af0: 20 20 20 20 20 69 66 28 20 6d 65 6d 2e 78 42 61       if( mem.xBa
1b00: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
1b10: 20 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63     mem.xBacktrac
1b20: 65 28 6e 42 79 74 65 2c 20 70 48 64 72 2d 3e 6e  e(nByte, pHdr->n
1b30: 42 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 61 41  Backtrace-1, &aA
1b40: 64 64 72 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  ddr[1]);.      }
1b50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b60: 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61    pHdr->nBacktra
1b70: 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ce = 0;.    }.  
1b80: 20 20 69 66 28 20 6d 65 6d 2e 6e 54 69 74 6c 65    if( mem.nTitle
1b90: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1ba0: 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20  (z, mem.zTitle, 
1bb0: 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b 0a 20 20 20  mem.nTitle);.   
1bc0: 20 7d 0a 20 20 20 20 70 48 64 72 2d 3e 69 53 69   }.    pHdr->iSi
1bd0: 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze = nByte;.    
1be0: 61 64 6a 75 73 74 53 74 61 74 73 28 6e 42 79 74  adjustStats(nByt
1bf0: 65 2c 20 2b 31 29 3b 0a 20 20 20 20 70 49 6e 74  e, +1);.    pInt
1c00: 20 3d 20 28 69 6e 74 2a 29 26 70 48 64 72 5b 31   = (int*)&pHdr[1
1c10: 5d 3b 0a 20 20 20 20 70 49 6e 74 5b 6e 52 65 73  ];.    pInt[nRes
1c20: 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e 74 29  erve/sizeof(int)
1c30: 5d 20 3d 20 52 45 41 52 47 55 41 52 44 3b 0a 20  ] = REARGUARD;. 
1c40: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 74 2c 20     memset(pInt, 
1c50: 30 78 36 35 2c 20 6e 52 65 73 65 72 76 65 29 3b  0x65, nReserve);
1c60: 0a 20 20 20 20 70 20 3d 20 28 76 6f 69 64 2a 29  .    p = (void*)
1c70: 70 49 6e 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pInt;.  }.  sqli
1c80: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c90: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65  mem.mutex);.  re
1ca0: 74 75 72 6e 20 70 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn p; .}../*.*
1cb0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
1cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1cd0: 6c 69 74 65 33 4d 65 6d 46 72 65 65 28 76 6f 69  lite3MemFree(voi
1ce0: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 73 74  d *pPrior){.  st
1cf0: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
1d00: 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a   *pHdr;.  void *
1d10: 2a 70 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  *pBt;.  char *z;
1d20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d30: 65 33 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  e3Config.bMemsta
1d40: 74 20 7c 7c 20 6d 65 6d 2e 6d 75 74 65 78 21 3d  t || mem.mutex!=
1d50: 30 20 29 3b 0a 20 20 70 48 64 72 20 3d 20 73 71  0 );.  pHdr = sq
1d60: 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65  lite3MemsysGetHe
1d70: 61 64 65 72 28 70 50 72 69 6f 72 29 3b 0a 20 20  ader(pPrior);.  
1d80: 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48  pBt = (void**)pH
1d90: 64 72 3b 0a 20 20 70 42 74 20 2d 3d 20 70 48 64  dr;.  pBt -= pHd
1da0: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f  r->nBacktraceSlo
1db0: 74 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ts;.  sqlite3_mu
1dc0: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75  tex_enter(mem.mu
1dd0: 74 65 78 29 3b 0a 20 20 69 66 28 20 70 48 64 72  tex);.  if( pHdr
1de0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 61  ->pPrev ){.    a
1df0: 73 73 65 72 74 28 20 70 48 64 72 2d 3e 70 50 72  ssert( pHdr->pPr
1e00: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 48 64 72 20  ev->pNext==pHdr 
1e10: 29 3b 0a 20 20 20 20 70 48 64 72 2d 3e 70 50 72  );.    pHdr->pPr
1e20: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 48 64 72  ev->pNext = pHdr
1e30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
1e40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
1e50: 6d 2e 70 46 69 72 73 74 3d 3d 70 48 64 72 20 29  m.pFirst==pHdr )
1e60: 3b 0a 20 20 20 20 6d 65 6d 2e 70 46 69 72 73 74  ;.    mem.pFirst
1e70: 20 3d 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0a   = pHdr->pNext;.
1e80: 20 20 7d 0a 20 20 69 66 28 20 70 48 64 72 2d 3e    }.  if( pHdr->
1e90: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 61 73 73  pNext ){.    ass
1ea0: 65 72 74 28 20 70 48 64 72 2d 3e 70 4e 65 78 74  ert( pHdr->pNext
1eb0: 2d 3e 70 50 72 65 76 3d 3d 70 48 64 72 20 29 3b  ->pPrev==pHdr );
1ec0: 0a 20 20 20 20 70 48 64 72 2d 3e 70 4e 65 78 74  .    pHdr->pNext
1ed0: 2d 3e 70 50 72 65 76 20 3d 20 70 48 64 72 2d 3e  ->pPrev = pHdr->
1ee0: 70 50 72 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPrev;.  }else{.
1ef0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e      assert( mem.
1f00: 70 4c 61 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20  pLast==pHdr );. 
1f10: 20 20 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70     mem.pLast = p
1f20: 48 64 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  Hdr->pPrev;.  }.
1f30: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 42 74    z = (char*)pBt
1f40: 3b 0a 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e  ;.  z -= pHdr->n
1f50: 54 69 74 6c 65 3b 0a 20 20 61 64 6a 75 73 74 53  Title;.  adjustS
1f60: 74 61 74 73 28 70 48 64 72 2d 3e 69 53 69 7a 65  tats(pHdr->iSize
1f70: 2c 20 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28  , -1);.  memset(
1f80: 7a 2c 20 30 78 32 62 2c 20 73 69 7a 65 6f 66 28  z, 0x2b, sizeof(
1f90: 76 6f 69 64 2a 29 2a 70 48 64 72 2d 3e 6e 42 61  void*)*pHdr->nBa
1fa0: 63 6b 74 72 61 63 65 53 6c 6f 74 73 20 2b 20 73  cktraceSlots + s
1fb0: 69 7a 65 6f 66 28 2a 70 48 64 72 29 20 2b 0a 20  izeof(*pHdr) +. 
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 70 48 64 72 2d 3e 69 53 69 7a 65 20 2b 20 73   pHdr->iSize + s
1fe0: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 70 48 64  izeof(int) + pHd
1ff0: 72 2d 3e 6e 54 69 74 6c 65 29 3b 0a 20 20 66 72  r->nTitle);.  fr
2000: 65 65 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(z);.  sqlite3
2010: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
2020: 2e 6d 75 74 65 78 29 3b 20 20 0a 7d 0a 0a 2f 2a  .mutex);  .}../*
2030: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
2040: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
2050: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
2060: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
2070: 74 68 69 73 20 64 65 62 75 67 67 69 6e 67 20 69  this debugging i
2080: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 77  mplementation, w
2090: 65 20 2a 61 6c 77 61 79 73 2a 20 6d 61 6b 65 20  e *always* make 
20a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a  a copy of the.**
20b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 74 6f   allocation into
20c0: 20 61 20 6e 65 77 20 70 6c 61 63 65 20 69 6e 20   a new place in 
20d0: 6d 65 6d 6f 72 79 2e 20 20 49 6e 20 74 68 69 73  memory.  In this
20e0: 20 77 61 79 2c 20 69 66 20 74 68 65 20 0a 2a 2a   way, if the .**
20f0: 20 68 69 67 68 65 72 20 6c 65 76 65 6c 20 63 6f   higher level co
2100: 64 65 20 69 73 20 75 73 69 6e 67 20 70 6f 69 6e  de is using poin
2110: 74 65 72 20 74 6f 20 74 68 65 20 6f 6c 64 20 61  ter to the old a
2120: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 69 73  llocation, it is
2130: 20 0a 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 6c   .** much more l
2140: 69 6b 65 6c 79 20 74 6f 20 62 72 65 61 6b 20 61  ikely to break a
2150: 6e 64 20 77 65 20 61 72 65 20 6d 75 63 68 20 6d  nd we are much m
2160: 6f 72 65 20 6c 69 6b 69 6e 67 20 74 6f 20 66 69  ore liking to fi
2170: 6e 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  nd.** the error.
2180: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2190: 2a 73 71 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c  *sqlite3MemReall
21a0: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
21b0: 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 73   int nByte){.  s
21c0: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
21d0: 72 20 2a 70 4f 6c 64 48 64 72 3b 0a 20 20 76 6f  r *pOldHdr;.  vo
21e0: 69 64 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65  id *pNew;.  asse
21f0: 72 74 28 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77  rt( mem.disallow
2200: 3d 3d 30 20 29 3b 0a 20 20 70 4f 6c 64 48 64 72  ==0 );.  pOldHdr
2210: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73   = sqlite3Memsys
2220: 47 65 74 48 65 61 64 65 72 28 70 50 72 69 6f 72  GetHeader(pPrior
2230: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
2240: 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 28 6e 42 79  te3MemMalloc(nBy
2250: 74 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  te);.  if( pNew 
2260: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e  ){.    memcpy(pN
2270: 65 77 2c 20 70 50 72 69 6f 72 2c 20 6e 42 79 74  ew, pPrior, nByt
2280: 65 3c 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65  e<pOldHdr->iSize
2290: 20 3f 20 6e 42 79 74 65 20 3a 20 70 4f 6c 64 48   ? nByte : pOldH
22a0: 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20 20  dr->iSize);.    
22b0: 69 66 28 20 6e 42 79 74 65 3e 70 4f 6c 64 48 64  if( nByte>pOldHd
22c0: 72 2d 3e 69 53 69 7a 65 20 29 7b 0a 20 20 20 20  r->iSize ){.    
22d0: 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
22e0: 2a 29 70 4e 65 77 29 5b 70 4f 6c 64 48 64 72 2d  *)pNew)[pOldHdr-
22f0: 3e 69 53 69 7a 65 5d 2c 20 30 78 32 62 2c 20 6e  >iSize], 0x2b, n
2300: 42 79 74 65 20 2d 20 70 4f 6c 64 48 64 72 2d 3e  Byte - pOldHdr->
2310: 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iSize);.    }.  
2320: 20 20 73 71 6c 69 74 65 33 4d 65 6d 46 72 65 65    sqlite3MemFree
2330: 28 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  (pPrior);.  }.  
2340: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
2350: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
2360: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
2370: 74 65 33 4d 65 6d 47 65 74 44 65 66 61 75 6c 74  te3MemGetDefault
2380: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2390: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
23a0: 65 6d 5f 6d 65 74 68 6f 64 73 20 64 65 66 61 75  em_methods defau
23b0: 6c 74 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  ltMethods = {.  
23c0: 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c     sqlite3MemMal
23d0: 6c 6f 63 2c 0a 20 20 20 20 20 73 71 6c 69 74 65  loc,.     sqlite
23e0: 33 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 20 73  3MemFree,.     s
23f0: 71 6c 69 74 65 33 4d 65 6d 52 65 61 6c 6c 6f 63  qlite3MemRealloc
2400: 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  ,.     sqlite3Me
2410: 6d 53 69 7a 65 2c 0a 20 20 20 20 20 73 71 6c 69  mSize,.     sqli
2420: 74 65 33 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20  te3MemRoundup,. 
2430: 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 49 6e      sqlite3MemIn
2440: 69 74 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33  it,.     sqlite3
2450: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
2460: 20 20 30 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72    0.  };.  retur
2470: 6e 20 26 64 65 66 61 75 6c 74 4d 65 74 68 6f 64  n &defaultMethod
2480: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  s;.}../*.** Popu
2490: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
24a0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
24b0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
24c0: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
24d0: 69 74 65 33 43 6f 6e 66 69 67 2e 6d 20 77 69 74  ite3Config.m wit
24e0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  h pointers to th
24f0: 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  e routines in th
2500: 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  is file..*/.void
2510: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
2520: 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73  fault(void){.  s
2530: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
2540: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
2550: 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65  OC, sqlite3MemGe
2560: 74 44 65 66 61 75 6c 74 28 29 29 3b 0a 7d 0a 0a  tDefault());.}..
2570: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
2580: 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63  mber of backtrac
2590: 65 20 6c 65 76 65 6c 73 20 6b 65 70 74 20 66 6f  e levels kept fo
25a0: 72 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f  r each allocatio
25b0: 6e 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  n..** A value of
25c0: 20 7a 65 72 6f 20 74 75 72 6e 73 20 6f 66 66 20   zero turns off 
25d0: 62 61 63 6b 74 72 61 63 69 6e 67 2e 20 20 54 68  backtracing.  Th
25e0: 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61  e number is alwa
25f0: 79 73 20 72 6f 75 6e 64 65 64 0a 2a 2a 20 75 70  ys rounded.** up
2600: 20 74 6f 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f   to a multiple o
2610: 66 20 32 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f 2..*/.void sql
2620: 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b  ite3MemdebugBack
2630: 74 72 61 63 65 28 69 6e 74 20 64 65 70 74 68 29  trace(int depth)
2640: 7b 0a 20 20 69 66 28 20 64 65 70 74 68 3c 30 20  {.  if( depth<0 
2650: 29 7b 20 64 65 70 74 68 20 3d 20 30 3b 20 7d 0a  ){ depth = 0; }.
2660: 20 20 69 66 28 20 64 65 70 74 68 3e 32 30 20 29    if( depth>20 )
2670: 7b 20 64 65 70 74 68 20 3d 20 32 30 3b 20 7d 0a  { depth = 20; }.
2680: 20 20 64 65 70 74 68 20 3d 20 28 64 65 70 74 68    depth = (depth
2690: 2b 31 29 26 30 78 66 65 3b 0a 20 20 6d 65 6d 2e  +1)&0xfe;.  mem.
26a0: 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 64 65 70  nBacktrace = dep
26b0: 74 68 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  th;.}..void sqli
26c0: 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b 74  te3MemdebugBackt
26d0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69  raceCallback(voi
26e0: 64 20 28 2a 78 42 61 63 6b 74 72 61 63 65 29 28  d (*xBacktrace)(
26f0: 69 6e 74 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a  int, int, void *
2700: 2a 29 29 7b 0a 20 20 6d 65 6d 2e 78 42 61 63 6b  *)){.  mem.xBack
2710: 74 72 61 63 65 20 3d 20 78 42 61 63 6b 74 72 61  trace = xBacktra
2720: 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ce;.}../*.** Set
2730: 20 74 68 65 20 74 69 74 6c 65 20 73 74 72 69 6e   the title strin
2740: 67 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  g for subsequent
2750: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f   allocations..*/
2760: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
2770: 64 65 62 75 67 53 65 74 74 69 74 6c 65 28 63 6f  debugSettitle(co
2780: 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65  nst char *zTitle
2790: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  ){.  int n = str
27a0: 6c 65 6e 28 7a 54 69 74 6c 65 29 20 2b 20 31 3b  len(zTitle) + 1;
27b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
27c0: 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78  _enter(mem.mutex
27d0: 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65  );.  if( n>=size
27e0: 6f 66 28 6d 65 6d 2e 7a 54 69 74 6c 65 29 20 29  of(mem.zTitle) )
27f0: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 65 6d 2e   n = sizeof(mem.
2800: 7a 54 69 74 6c 65 29 2d 31 3b 0a 20 20 6d 65 6d  zTitle)-1;.  mem
2810: 63 70 79 28 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20  cpy(mem.zTitle, 
2820: 7a 54 69 74 6c 65 2c 20 6e 29 3b 0a 20 20 6d 65  zTitle, n);.  me
2830: 6d 2e 7a 54 69 74 6c 65 5b 6e 5d 20 3d 20 30 3b  m.zTitle[n] = 0;
2840: 0a 20 20 6d 65 6d 2e 6e 54 69 74 6c 65 20 3d 20  .  mem.nTitle = 
2850: 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 73 71 6c 69  (n+7)&~7;.  sqli
2860: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2870: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 76  mem.mutex);.}..v
2880: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 64 65  oid sqlite3Memde
2890: 62 75 67 53 79 6e 63 28 29 7b 0a 20 20 73 74 72  bugSync(){.  str
28a0: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
28b0: 2a 70 48 64 72 3b 0a 20 20 66 6f 72 28 70 48 64  *pHdr;.  for(pHd
28c0: 72 3d 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48  r=mem.pFirst; pH
28d0: 64 72 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70  dr; pHdr=pHdr->p
28e0: 4e 65 78 74 29 7b 0a 20 20 20 20 76 6f 69 64 20  Next){.    void 
28f0: 2a 2a 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29  **pBt = (void**)
2900: 70 48 64 72 3b 0a 20 20 20 20 70 42 74 20 2d 3d  pHdr;.    pBt -=
2910: 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63   pHdr->nBacktrac
2920: 65 53 6c 6f 74 73 3b 0a 20 20 20 20 6d 65 6d 2e  eSlots;.    mem.
2930: 78 42 61 63 6b 74 72 61 63 65 28 70 48 64 72 2d  xBacktrace(pHdr-
2940: 3e 69 53 69 7a 65 2c 20 70 48 64 72 2d 3e 6e 42  >iSize, pHdr->nB
2950: 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 70 42 74  acktrace-1, &pBt
2960: 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  [1]);.  }.}../*.
2970: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
2980: 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77   indicated and w
2990: 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c  rite a log of al
29a0: 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79  l unfreed memory
29b0: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   .** allocations
29c0: 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a   into that log..
29d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
29e0: 65 6d 64 65 62 75 67 44 75 6d 70 28 63 6f 6e 73  emdebugDump(cons
29f0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2a00: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b  e){.  FILE *out;
2a10: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
2a20: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76  ckHdr *pHdr;.  v
2a30: 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 69 6e 74  oid **pBt;.  int
2a40: 20 69 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65   i;.  out = fope
2a50: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22  n(zFilename, "w"
2a60: 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
2a70: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
2a80: 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61 62 6c  tderr, "** Unabl
2a90: 65 20 74 6f 20 6f 75 74 70 75 74 20 6d 65 6d 6f  e to output memo
2aa0: 72 79 20 64 65 62 75 67 20 6f 75 74 70 75 74 20  ry debug output 
2ab0: 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c 0a 20  log: %s **\n",. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
2ae0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2af0: 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d 2e 70 46   for(pHdr=mem.pF
2b00: 69 72 73 74 3b 20 70 48 64 72 3b 20 70 48 64 72  irst; pHdr; pHdr
2b10: 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pHdr->pNext){. 
2b20: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
2b30: 61 72 2a 29 70 48 64 72 3b 0a 20 20 20 20 7a 20  ar*)pHdr;.    z 
2b40: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
2b50: 61 63 65 53 6c 6f 74 73 2a 73 69 7a 65 6f 66 28  aceSlots*sizeof(
2b60: 76 6f 69 64 2a 29 20 2b 20 70 48 64 72 2d 3e 6e  void*) + pHdr->n
2b70: 54 69 74 6c 65 3b 0a 20 20 20 20 66 70 72 69 6e  Title;.    fprin
2b80: 74 66 28 6f 75 74 2c 20 22 2a 2a 2a 2a 20 25 6c  tf(out, "**** %l
2b90: 6c 64 20 62 79 74 65 73 20 61 74 20 25 70 20 66  ld bytes at %p f
2ba0: 72 6f 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22 2c 20  rom %s ****\n", 
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 48 64  .            pHd
2bc0: 72 2d 3e 69 53 69 7a 65 2c 20 26 70 48 64 72 5b  r->iSize, &pHdr[
2bd0: 31 5d 2c 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65  1], pHdr->nTitle
2be0: 20 3f 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b 0a 20   ? z : "???");. 
2bf0: 20 20 20 69 66 28 20 70 48 64 72 2d 3e 6e 42 61     if( pHdr->nBa
2c00: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
2c10: 20 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20   fflush(out);.  
2c20: 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a      pBt = (void*
2c30: 2a 29 70 48 64 72 3b 0a 20 20 20 20 20 20 70 42  *)pHdr;.      pB
2c40: 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b  t -= pHdr->nBack
2c50: 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20  traceSlots;.    
2c60: 20 20 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62    backtrace_symb
2c70: 6f 6c 73 5f 66 64 28 70 42 74 2c 20 70 48 64 72  ols_fd(pBt, pHdr
2c80: 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2c 20 66 69  ->nBacktrace, fi
2c90: 6c 65 6e 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20  leno(out));.    
2ca0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
2cb0: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
2cc0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
2cd0: 43 4f 55 4e 54 53 3a 5c 6e 22 29 3b 0a 20 20 66  COUNTS:\n");.  f
2ce0: 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 53 49 5a 45  or(i=0; i<NCSIZE
2cf0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  -1; i++){.    if
2d00: 28 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 20  ( mem.nAlloc[i] 
2d10: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
2d20: 28 6f 75 74 2c 20 22 20 20 20 25 35 64 3a 20 25  (out, "   %5d: %
2d30: 31 30 64 20 25 31 30 64 20 25 31 30 64 5c 6e 22  10d %10d %10d\n"
2d40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
2d50: 2a 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69  *8, mem.nAlloc[i
2d60: 5d 2c 20 6d 65 6d 2e 6e 43 75 72 72 65 6e 74 5b  ], mem.nCurrent[
2d70: 69 5d 2c 20 6d 65 6d 2e 6d 78 43 75 72 72 65 6e  i], mem.mxCurren
2d80: 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t[i]);.    }.  }
2d90: 0a 20 20 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c 6f  .  if( mem.nAllo
2da0: 63 5b 4e 43 53 49 5a 45 2d 31 5d 20 29 7b 0a 20  c[NCSIZE-1] ){. 
2db0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
2dc0: 22 20 20 20 25 35 64 3a 20 25 31 30 64 20 25 31  "   %5d: %10d %1
2dd0: 30 64 20 25 31 30 64 5c 6e 22 2c 0a 20 20 20 20  0d %10d\n",.    
2de0: 20 20 20 20 20 20 20 20 20 4e 43 53 49 5a 45 2a           NCSIZE*
2df0: 38 2d 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b  8-8, mem.nAlloc[
2e00: 4e 43 53 49 5a 45 2d 31 5d 2c 0a 20 20 20 20 20  NCSIZE-1],.     
2e10: 20 20 20 20 20 20 20 20 6d 65 6d 2e 6e 43 75 72          mem.nCur
2e20: 72 65 6e 74 5b 4e 43 53 49 5a 45 2d 31 5d 2c 20  rent[NCSIZE-1], 
2e30: 6d 65 6d 2e 6d 78 43 75 72 72 65 6e 74 5b 4e 43  mem.mxCurrent[NC
2e40: 53 49 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a 20 20  SIZE-1]);.  }.  
2e50: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a  fclose(out);.}..
2e60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e70: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
2e80: 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f   sqlite3MemMallo
2e90: 63 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  c() has been cal
2ea0: 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  led..*/.int sqli
2eb0: 74 65 33 4d 65 6d 64 65 62 75 67 4d 61 6c 6c 6f  te3MemdebugMallo
2ec0: 63 43 6f 75 6e 74 28 29 7b 0a 20 20 69 6e 74 20  cCount(){.  int 
2ed0: 69 3b 0a 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20  i;.  int nTotal 
2ee0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
2ef0: 69 3c 4e 43 53 49 5a 45 3b 20 69 2b 2b 29 7b 0a  i<NCSIZE; i++){.
2f00: 20 20 20 20 6e 54 6f 74 61 6c 20 2b 3d 20 6d 65      nTotal += me
2f10: 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 3b 0a 20 20 7d  m.nAlloc[i];.  }
2f20: 0a 20 20 72 65 74 75 72 6e 20 6e 54 6f 74 61 6c  .  return nTotal
2f30: 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.}...#endif /* 
2f40: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20  SQLITE_MEMDEBUG 
2f50: 2a 2f 0a                                         */.