/ Hex Artifact Content
Login

Artifact 692c5b50141f49c32d85d7c0c39c751f6d520093:


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 34 34 20 32 30 30 39 2f 30 32 2f 31 39   1.44 2009/02/19
0360: 20 31 34 3a 33 39 3a 32 35 20 64 61 6e 69 65 6c   14:39:25 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 31 0a 23 20 64 65 66 69 6e 65 20 62 61  B) 1.# 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 28 69 6e 74 29 46 4f 52 45  Guard==(int)FORE
1280: 47 55 41 52 44 20 29 3b 0a 20 20 6e 52 65 73 65  GUARD );.  nRese
1290: 72 76 65 20 3d 20 28 70 2d 3e 69 53 69 7a 65 2b  rve = (p->iSize+
12a0: 37 29 26 7e 37 3b 0a 20 20 70 49 6e 74 20 3d 20  7)&~7;.  pInt = 
12b0: 28 69 6e 74 2a 29 70 41 6c 6c 6f 63 61 74 69 6f  (int*)pAllocatio
12c0: 6e 3b 0a 20 20 70 55 38 20 3d 20 28 75 38 2a 29  n;.  pU8 = (u8*)
12d0: 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20 20 61  pAllocation;.  a
12e0: 73 73 65 72 74 28 20 70 49 6e 74 5b 6e 52 65 73  ssert( pInt[nRes
12f0: 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e 74 29  erve/sizeof(int)
1300: 5d 3d 3d 28 69 6e 74 29 52 45 41 52 47 55 41 52  ]==(int)REARGUAR
1310: 44 20 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 63  D );.  /* This c
1320: 68 65 63 6b 73 20 61 6e 79 20 6f 66 20 74 68 65  hecks any of the
1330: 20 22 65 78 74 72 61 22 20 62 79 74 65 73 20 61   "extra" bytes a
1340: 6c 6c 6f 63 61 74 65 64 20 64 75 65 0a 20 20 2a  llocated due.  *
1350: 2a 20 74 6f 20 72 6f 75 6e 64 69 6e 67 20 75 70  * to rounding up
1360: 20 74 6f 20 61 6e 20 38 20 62 79 74 65 20 62 6f   to an 8 byte bo
1370: 75 6e 64 61 72 79 20 74 6f 20 65 6e 73 75 72 65  undary to ensure
1380: 20 0a 20 20 2a 2a 20 74 68 65 79 20 68 61 76 65   .  ** they have
1390: 6e 27 74 20 62 65 65 6e 20 6f 76 65 72 77 72 69  n't been overwri
13a0: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  tten..  */.  whi
13b0: 6c 65 28 20 6e 52 65 73 65 72 76 65 2d 2d 20 3e  le( nReserve-- >
13c0: 20 70 2d 3e 69 53 69 7a 65 20 29 20 61 73 73 65   p->iSize ) asse
13d0: 72 74 28 20 70 55 38 5b 6e 52 65 73 65 72 76 65  rt( pU8[nReserve
13e0: 5d 3d 3d 30 78 36 35 20 29 3b 0a 20 20 72 65 74  ]==0x65 );.  ret
13f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1400: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1410: 72 20 6f 66 20 62 79 74 65 73 20 63 75 72 72 65  r of bytes curre
1420: 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ntly allocated a
1430: 74 20 61 64 64 72 65 73 73 20 70 2e 0a 2a 2f 0a  t address p..*/.
1440: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1450: 65 33 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  e3MemSize(void *
1460: 70 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  p){.  struct Mem
1470: 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a  BlockHdr *pHdr;.
1480: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
1490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14a0: 70 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d 65  pHdr = sqlite3Me
14b0: 6d 73 79 73 47 65 74 48 65 61 64 65 72 28 70 29  msysGetHeader(p)
14c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 48 64 72 2d  ;.  return pHdr-
14d0: 3e 69 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >iSize;.}../*.**
14e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
14f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1500: 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a  n subsystem..*/.
1510: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1520: 65 33 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  e3MemInit(void *
1530: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1540: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1550: 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
1560: 20 28 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20   (sizeof(struct 
1570: 4d 65 6d 42 6c 6f 63 6b 48 64 72 29 26 37 29 20  MemBlockHdr)&7) 
1580: 3d 3d 20 30 20 29 3b 0a 20 20 69 66 28 20 21 73  == 0 );.  if( !s
1590: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15a0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 29 7b 0a 20  ig.bMemstat ){. 
15b0: 20 20 20 2f 2a 20 49 66 20 6d 65 6d 6f 72 79 20     /* If memory 
15c0: 73 74 61 74 75 73 20 69 73 20 65 6e 61 62 6c 65  status is enable
15d0: 64 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 6c 6c  d, then the mall
15e0: 6f 63 2e 63 20 77 72 61 70 70 65 72 20 77 69 6c  oc.c wrapper wil
15f0: 6c 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  l already.    **
1600: 20 68 6f 6c 64 20 74 68 65 20 53 54 41 54 49 43   hold the STATIC
1610: 5f 4d 45 4d 20 6d 75 74 65 78 20 77 68 65 6e 20  _MEM mutex when 
1620: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 68 65 72  the routines her
1630: 65 20 61 72 65 20 69 6e 76 6f 6b 65 64 2e 20 2a  e are invoked. *
1640: 2f 0a 20 20 20 20 6d 65 6d 2e 6d 75 74 65 78 20  /.    mem.mutex 
1650: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1660: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1670: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20  _STATIC_MEM);.  
1680: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1690: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
16a0: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
16b0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
16c0: 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 2a 2f 0a  n subsystem..*/.
16d0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
16e0: 74 65 33 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  te3MemShutdown(v
16f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  oid *NotUsed){. 
1700: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1710: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 6d 65  R(NotUsed);.  me
1720: 6d 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 7d 0a 0a  m.mutex = 0;.}..
1730: 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61  /*.** Round up a
1740: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f   request size to
1750: 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20   the next valid 
1760: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e  allocation size.
1770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1780: 71 6c 69 74 65 33 4d 65 6d 52 6f 75 6e 64 75 70  qlite3MemRoundup
1790: 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72  (int n){.  retur
17a0: 6e 20 28 6e 2b 37 29 20 26 20 7e 37 3b 0a 7d 0a  n (n+7) & ~7;.}.
17b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
17c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 6d  nByte bytes of m
17d0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
17e0: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 65   void *sqlite3Me
17f0: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
1800: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  e){.  struct Mem
1810: 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a  BlockHdr *pHdr;.
1820: 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20    void **pBt;.  
1830: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 2a  char *z;.  int *
1840: 70 49 6e 74 3b 0a 20 20 76 6f 69 64 20 2a 70 20  pInt;.  void *p 
1850: 3d 20 30 3b 0a 20 20 69 6e 74 20 74 6f 74 61 6c  = 0;.  int total
1860: 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 52 65 73  Size;.  int nRes
1870: 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  erve;.  sqlite3_
1880: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e  mutex_enter(mem.
1890: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
18a0: 28 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 3d 3d  ( mem.disallow==
18b0: 30 20 29 3b 0a 20 20 6e 52 65 73 65 72 76 65 20  0 );.  nReserve 
18c0: 3d 20 28 6e 42 79 74 65 2b 37 29 26 7e 37 3b 0a  = (nByte+7)&~7;.
18d0: 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 6e 52    totalSize = nR
18e0: 65 73 65 72 76 65 20 2b 20 73 69 7a 65 6f 66 28  eserve + sizeof(
18f0: 2a 70 48 64 72 29 20 2b 20 73 69 7a 65 6f 66 28  *pHdr) + sizeof(
1900: 69 6e 74 29 20 2b 0a 20 20 20 20 20 20 20 20 20  int) +.         
1910: 20 20 20 20 20 20 6d 65 6d 2e 6e 42 61 63 6b 74        mem.nBackt
1920: 72 61 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64  race*sizeof(void
1930: 2a 29 20 2b 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b  *) + mem.nTitle;
1940: 0a 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f  .  p = malloc(to
1950: 74 61 6c 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  talSize);.  if( 
1960: 70 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 3b 0a  p ){.    z = p;.
1970: 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a      pBt = (void*
1980: 2a 29 26 7a 5b 6d 65 6d 2e 6e 54 69 74 6c 65 5d  *)&z[mem.nTitle]
1990: 3b 0a 20 20 20 20 70 48 64 72 20 3d 20 28 73 74  ;.    pHdr = (st
19a0: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
19b0: 2a 29 26 70 42 74 5b 6d 65 6d 2e 6e 42 61 63 6b  *)&pBt[mem.nBack
19c0: 74 72 61 63 65 5d 3b 0a 20 20 20 20 70 48 64 72  trace];.    pHdr
19d0: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
19e0: 20 70 48 64 72 2d 3e 70 50 72 65 76 20 3d 20 6d   pHdr->pPrev = m
19f0: 65 6d 2e 70 4c 61 73 74 3b 0a 20 20 20 20 69 66  em.pLast;.    if
1a00: 28 20 6d 65 6d 2e 70 4c 61 73 74 20 29 7b 0a 20  ( mem.pLast ){. 
1a10: 20 20 20 20 20 6d 65 6d 2e 70 4c 61 73 74 2d 3e       mem.pLast->
1a20: 70 4e 65 78 74 20 3d 20 70 48 64 72 3b 0a 20 20  pNext = pHdr;.  
1a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
1a40: 65 6d 2e 70 46 69 72 73 74 20 3d 20 70 48 64 72  em.pFirst = pHdr
1a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 2e  ;.    }.    mem.
1a60: 70 4c 61 73 74 20 3d 20 70 48 64 72 3b 0a 20 20  pLast = pHdr;.  
1a70: 20 20 70 48 64 72 2d 3e 69 46 6f 72 65 47 75 61    pHdr->iForeGua
1a80: 72 64 20 3d 20 46 4f 52 45 47 55 41 52 44 3b 0a  rd = FOREGUARD;.
1a90: 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74      pHdr->nBackt
1aa0: 72 61 63 65 53 6c 6f 74 73 20 3d 20 6d 65 6d 2e  raceSlots = mem.
1ab0: 6e 42 61 63 6b 74 72 61 63 65 3b 0a 20 20 20 20  nBacktrace;.    
1ac0: 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20 3d 20 6d  pHdr->nTitle = m
1ad0: 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 20 20 69  em.nTitle;.    i
1ae0: 66 28 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63  f( mem.nBacktrac
1af0: 65 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  e ){.      void 
1b00: 2a 61 41 64 64 72 5b 34 30 5d 3b 0a 20 20 20 20  *aAddr[40];.    
1b10: 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61    pHdr->nBacktra
1b20: 63 65 20 3d 20 62 61 63 6b 74 72 61 63 65 28 61  ce = backtrace(a
1b30: 41 64 64 72 2c 20 6d 65 6d 2e 6e 42 61 63 6b 74  Addr, mem.nBackt
1b40: 72 61 63 65 2b 31 29 2d 31 3b 0a 20 20 20 20 20  race+1)-1;.     
1b50: 20 6d 65 6d 63 70 79 28 70 42 74 2c 20 26 61 41   memcpy(pBt, &aA
1b60: 64 64 72 5b 31 5d 2c 20 70 48 64 72 2d 3e 6e 42  ddr[1], pHdr->nB
1b70: 61 63 6b 74 72 61 63 65 2a 73 69 7a 65 6f 66 28  acktrace*sizeof(
1b80: 76 6f 69 64 2a 29 29 3b 0a 20 20 20 20 20 20 61  void*));.      a
1b90: 73 73 65 72 74 28 70 42 74 5b 30 5d 29 3b 0a 20  ssert(pBt[0]);. 
1ba0: 20 20 20 20 20 69 66 28 20 6d 65 6d 2e 78 42 61       if( mem.xBa
1bb0: 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  cktrace ){.     
1bc0: 20 20 20 6d 65 6d 2e 78 42 61 63 6b 74 72 61 63     mem.xBacktrac
1bd0: 65 28 6e 42 79 74 65 2c 20 70 48 64 72 2d 3e 6e  e(nByte, pHdr->n
1be0: 42 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 61 41  Backtrace-1, &aA
1bf0: 64 64 72 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  ddr[1]);.      }
1c00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c10: 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61    pHdr->nBacktra
1c20: 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ce = 0;.    }.  
1c30: 20 20 69 66 28 20 6d 65 6d 2e 6e 54 69 74 6c 65    if( mem.nTitle
1c40: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1c50: 28 7a 2c 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20  (z, mem.zTitle, 
1c60: 6d 65 6d 2e 6e 54 69 74 6c 65 29 3b 0a 20 20 20  mem.nTitle);.   
1c70: 20 7d 0a 20 20 20 20 70 48 64 72 2d 3e 69 53 69   }.    pHdr->iSi
1c80: 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze = nByte;.    
1c90: 61 64 6a 75 73 74 53 74 61 74 73 28 6e 42 79 74  adjustStats(nByt
1ca0: 65 2c 20 2b 31 29 3b 0a 20 20 20 20 70 49 6e 74  e, +1);.    pInt
1cb0: 20 3d 20 28 69 6e 74 2a 29 26 70 48 64 72 5b 31   = (int*)&pHdr[1
1cc0: 5d 3b 0a 20 20 20 20 70 49 6e 74 5b 6e 52 65 73  ];.    pInt[nRes
1cd0: 65 72 76 65 2f 73 69 7a 65 6f 66 28 69 6e 74 29  erve/sizeof(int)
1ce0: 5d 20 3d 20 52 45 41 52 47 55 41 52 44 3b 0a 20  ] = REARGUARD;. 
1cf0: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 74 2c 20     memset(pInt, 
1d00: 30 78 36 35 2c 20 6e 52 65 73 65 72 76 65 29 3b  0x65, nReserve);
1d10: 0a 20 20 20 20 70 20 3d 20 28 76 6f 69 64 2a 29  .    p = (void*)
1d20: 70 49 6e 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pInt;.  }.  sqli
1d30: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1d40: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65  mem.mutex);.  re
1d50: 74 75 72 6e 20 70 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn p; .}../*.*
1d60: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
1d70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1d80: 6c 69 74 65 33 4d 65 6d 46 72 65 65 28 76 6f 69  lite3MemFree(voi
1d90: 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 73 74  d *pPrior){.  st
1da0: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
1db0: 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69 64 20 2a   *pHdr;.  void *
1dc0: 2a 70 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  *pBt;.  char *z;
1dd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1df0: 4d 65 6d 73 74 61 74 20 7c 7c 20 6d 65 6d 2e 6d  Memstat || mem.m
1e00: 75 74 65 78 21 3d 30 20 29 3b 0a 20 20 70 48 64  utex!=0 );.  pHd
1e10: 72 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 73 79  r = sqlite3Memsy
1e20: 73 47 65 74 48 65 61 64 65 72 28 70 50 72 69 6f  sGetHeader(pPrio
1e30: 72 29 3b 0a 20 20 70 42 74 20 3d 20 28 76 6f 69  r);.  pBt = (voi
1e40: 64 2a 2a 29 70 48 64 72 3b 0a 20 20 70 42 74 20  d**)pHdr;.  pBt 
1e50: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
1e60: 61 63 65 53 6c 6f 74 73 3b 0a 20 20 73 71 6c 69  aceSlots;.  sqli
1e70: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1e80: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 69 66  mem.mutex);.  if
1e90: 28 20 70 48 64 72 2d 3e 70 50 72 65 76 20 29 7b  ( pHdr->pPrev ){
1ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 64  .    assert( pHd
1eb0: 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  r->pPrev->pNext=
1ec0: 3d 70 48 64 72 20 29 3b 0a 20 20 20 20 70 48 64  =pHdr );.    pHd
1ed0: 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1ee0: 3d 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pHdr->pNext;. 
1ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1f00: 72 74 28 20 6d 65 6d 2e 70 46 69 72 73 74 3d 3d  rt( mem.pFirst==
1f10: 70 48 64 72 20 29 3b 0a 20 20 20 20 6d 65 6d 2e  pHdr );.    mem.
1f20: 70 46 69 72 73 74 20 3d 20 70 48 64 72 2d 3e 70  pFirst = pHdr->p
1f30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
1f40: 70 48 64 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pHdr->pNext ){. 
1f50: 20 20 20 61 73 73 65 72 74 28 20 70 48 64 72 2d     assert( pHdr-
1f60: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70  >pNext->pPrev==p
1f70: 48 64 72 20 29 3b 0a 20 20 20 20 70 48 64 72 2d  Hdr );.    pHdr-
1f80: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1f90: 70 48 64 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  pHdr->pPrev;.  }
1fa0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1fb0: 28 20 6d 65 6d 2e 70 4c 61 73 74 3d 3d 70 48 64  ( mem.pLast==pHd
1fc0: 72 20 29 3b 0a 20 20 20 20 6d 65 6d 2e 70 4c 61  r );.    mem.pLa
1fd0: 73 74 20 3d 20 70 48 64 72 2d 3e 70 50 72 65 76  st = pHdr->pPrev
1fe0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1ff0: 72 2a 29 70 42 74 3b 0a 20 20 7a 20 2d 3d 20 70  r*)pBt;.  z -= p
2000: 48 64 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20 20 61  Hdr->nTitle;.  a
2010: 64 6a 75 73 74 53 74 61 74 73 28 70 48 64 72 2d  djustStats(pHdr-
2020: 3e 69 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 6d  >iSize, -1);.  m
2030: 65 6d 73 65 74 28 7a 2c 20 30 78 32 62 2c 20 73  emset(z, 0x2b, s
2040: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 2a 70 48 64  izeof(void*)*pHd
2050: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f  r->nBacktraceSlo
2060: 74 73 20 2b 20 73 69 7a 65 6f 66 28 2a 70 48 64  ts + sizeof(*pHd
2070: 72 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  r) +.           
2080: 20 20 20 20 20 20 20 70 48 64 72 2d 3e 69 53 69         pHdr->iSi
2090: 7a 65 20 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29  ze + sizeof(int)
20a0: 20 2b 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 29   + pHdr->nTitle)
20b0: 3b 0a 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 73  ;.  free(z);.  s
20c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
20d0: 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 20 20  ve(mem.mutex);  
20e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
20f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
2100: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
2110: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  allocation..**.*
2120: 2a 20 46 6f 72 20 74 68 69 73 20 64 65 62 75 67  * For this debug
2130: 67 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ging implementat
2140: 69 6f 6e 2c 20 77 65 20 2a 61 6c 77 61 79 73 2a  ion, we *always*
2150: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2160: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
2170: 6e 20 69 6e 74 6f 20 61 20 6e 65 77 20 70 6c 61  n into a new pla
2180: 63 65 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 49  ce in memory.  I
2190: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
21a0: 68 65 20 0a 2a 2a 20 68 69 67 68 65 72 20 6c 65  he .** higher le
21b0: 76 65 6c 20 63 6f 64 65 20 69 73 20 75 73 69 6e  vel code is usin
21c0: 67 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  g pointer to the
21d0: 20 6f 6c 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   old allocation,
21e0: 20 69 74 20 69 73 20 0a 2a 2a 20 6d 75 63 68 20   it is .** much 
21f0: 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20 62  more likely to b
2200: 72 65 61 6b 20 61 6e 64 20 77 65 20 61 72 65 20  reak and we are 
2210: 6d 75 63 68 20 6d 6f 72 65 20 6c 69 6b 69 6e 67  much more liking
2220: 20 74 6f 20 66 69 6e 64 0a 2a 2a 20 74 68 65 20   to find.** the 
2230: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
2240: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4d 65   void *sqlite3Me
2250: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
2260: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
2270: 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  ){.  struct MemB
2280: 6c 6f 63 6b 48 64 72 20 2a 70 4f 6c 64 48 64 72  lockHdr *pOldHdr
2290: 3b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a  ;.  void *pNew;.
22a0: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 64 69    assert( mem.di
22b0: 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70  sallow==0 );.  p
22c0: 4f 6c 64 48 64 72 20 3d 20 73 71 6c 69 74 65 33  OldHdr = sqlite3
22d0: 4d 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28  MemsysGetHeader(
22e0: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 20  pPrior);.  pNew 
22f0: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c  = sqlite3MemMall
2300: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  oc(nByte);.  if(
2310: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d   pNew ){.    mem
2320: 63 70 79 28 70 4e 65 77 2c 20 70 50 72 69 6f 72  cpy(pNew, pPrior
2330: 2c 20 6e 42 79 74 65 3c 70 4f 6c 64 48 64 72 2d  , nByte<pOldHdr-
2340: 3e 69 53 69 7a 65 20 3f 20 6e 42 79 74 65 20 3a  >iSize ? nByte :
2350: 20 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 29   pOldHdr->iSize)
2360: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3e  ;.    if( nByte>
2370: 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a 65 20 29  pOldHdr->iSize )
2380: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
2390: 28 28 63 68 61 72 2a 29 70 4e 65 77 29 5b 70 4f  ((char*)pNew)[pO
23a0: 6c 64 48 64 72 2d 3e 69 53 69 7a 65 5d 2c 20 30  ldHdr->iSize], 0
23b0: 78 32 62 2c 20 6e 42 79 74 65 20 2d 20 70 4f 6c  x2b, nByte - pOl
23c0: 64 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20  dHdr->iSize);.  
23d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4d    }.    sqlite3M
23e0: 65 6d 46 72 65 65 28 70 50 72 69 6f 72 29 3b 0a  emFree(pPrior);.
23f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
2400: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  w;.}../*.** Popu
2410: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
2420: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
2430: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
2440: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
2450: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2460: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
2470: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
2480: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   in this file..*
2490: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  /.void sqlite3Me
24a0: 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64  mSetDefault(void
24b0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
24c0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
24d0: 74 68 6f 64 73 20 64 65 66 61 75 6c 74 4d 65 74  thods defaultMet
24e0: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 20 73 71  hods = {.     sq
24f0: 6c 69 74 65 33 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a  lite3MemMalloc,.
2500: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 46       sqlite3MemF
2510: 72 65 65 2c 0a 20 20 20 20 20 73 71 6c 69 74 65  ree,.     sqlite
2520: 33 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  3MemRealloc,.   
2530: 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 69 7a 65    sqlite3MemSize
2540: 2c 0a 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  ,.     sqlite3Me
2550: 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 20 73  mRoundup,.     s
2560: 71 6c 69 74 65 33 4d 65 6d 49 6e 69 74 2c 0a 20  qlite3MemInit,. 
2570: 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 53 68      sqlite3MemSh
2580: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 20 30 0a 20  utdown,.     0. 
2590: 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   };.  sqlite3_co
25a0: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
25b0: 49 47 5f 4d 41 4c 4c 4f 43 2c 20 26 64 65 66 61  IG_MALLOC, &defa
25c0: 75 6c 74 4d 65 74 68 6f 64 73 29 3b 0a 7d 0a 0a  ultMethods);.}..
25d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
25e0: 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63  mber of backtrac
25f0: 65 20 6c 65 76 65 6c 73 20 6b 65 70 74 20 66 6f  e levels kept fo
2600: 72 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 69 6f  r each allocatio
2610: 6e 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  n..** A value of
2620: 20 7a 65 72 6f 20 74 75 72 6e 73 20 6f 66 66 20   zero turns off 
2630: 62 61 63 6b 74 72 61 63 69 6e 67 2e 20 20 54 68  backtracing.  Th
2640: 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61  e number is alwa
2650: 79 73 20 72 6f 75 6e 64 65 64 0a 2a 2a 20 75 70  ys rounded.** up
2660: 20 74 6f 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f   to a multiple o
2670: 66 20 32 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f 2..*/.void sql
2680: 69 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b  ite3MemdebugBack
2690: 74 72 61 63 65 28 69 6e 74 20 64 65 70 74 68 29  trace(int depth)
26a0: 7b 0a 20 20 69 66 28 20 64 65 70 74 68 3c 30 20  {.  if( depth<0 
26b0: 29 7b 20 64 65 70 74 68 20 3d 20 30 3b 20 7d 0a  ){ depth = 0; }.
26c0: 20 20 69 66 28 20 64 65 70 74 68 3e 32 30 20 29    if( depth>20 )
26d0: 7b 20 64 65 70 74 68 20 3d 20 32 30 3b 20 7d 0a  { depth = 20; }.
26e0: 20 20 64 65 70 74 68 20 3d 20 28 64 65 70 74 68    depth = (depth
26f0: 2b 31 29 26 30 78 66 65 3b 0a 20 20 6d 65 6d 2e  +1)&0xfe;.  mem.
2700: 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 64 65 70  nBacktrace = dep
2710: 74 68 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  th;.}..void sqli
2720: 74 65 33 4d 65 6d 64 65 62 75 67 42 61 63 6b 74  te3MemdebugBackt
2730: 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69  raceCallback(voi
2740: 64 20 28 2a 78 42 61 63 6b 74 72 61 63 65 29 28  d (*xBacktrace)(
2750: 69 6e 74 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a  int, int, void *
2760: 2a 29 29 7b 0a 20 20 6d 65 6d 2e 78 42 61 63 6b  *)){.  mem.xBack
2770: 74 72 61 63 65 20 3d 20 78 42 61 63 6b 74 72 61  trace = xBacktra
2780: 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ce;.}../*.** Set
2790: 20 74 68 65 20 74 69 74 6c 65 20 73 74 72 69 6e   the title strin
27a0: 67 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e 74  g for subsequent
27b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a 2a 2f   allocations..*/
27c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
27d0: 64 65 62 75 67 53 65 74 74 69 74 6c 65 28 63 6f  debugSettitle(co
27e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65  nst char *zTitle
27f0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
2800: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
2810: 6c 65 6e 33 30 28 7a 54 69 74 6c 65 29 20 2b 20  len30(zTitle) + 
2820: 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  1;.  sqlite3_mut
2830: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74  ex_enter(mem.mut
2840: 65 78 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 73 69  ex);.  if( n>=si
2850: 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69 74 6c 65 29  zeof(mem.zTitle)
2860: 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 65   ) n = sizeof(me
2870: 6d 2e 7a 54 69 74 6c 65 29 2d 31 3b 0a 20 20 6d  m.zTitle)-1;.  m
2880: 65 6d 63 70 79 28 6d 65 6d 2e 7a 54 69 74 6c 65  emcpy(mem.zTitle
2890: 2c 20 7a 54 69 74 6c 65 2c 20 6e 29 3b 0a 20 20  , zTitle, n);.  
28a0: 6d 65 6d 2e 7a 54 69 74 6c 65 5b 6e 5d 20 3d 20  mem.zTitle[n] = 
28b0: 30 3b 0a 20 20 6d 65 6d 2e 6e 54 69 74 6c 65 20  0;.  mem.nTitle 
28c0: 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 73 71  = (n+7)&~7;.  sq
28d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
28e0: 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a  e(mem.mutex);.}.
28f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
2900: 64 65 62 75 67 53 79 6e 63 28 29 7b 0a 20 20 73  debugSync(){.  s
2910: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
2920: 72 20 2a 70 48 64 72 3b 0a 20 20 66 6f 72 28 70  r *pHdr;.  for(p
2930: 48 64 72 3d 6d 65 6d 2e 70 46 69 72 73 74 3b 20  Hdr=mem.pFirst; 
2940: 70 48 64 72 3b 20 70 48 64 72 3d 70 48 64 72 2d  pHdr; pHdr=pHdr-
2950: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 76 6f 69  >pNext){.    voi
2960: 64 20 2a 2a 70 42 74 20 3d 20 28 76 6f 69 64 2a  d **pBt = (void*
2970: 2a 29 70 48 64 72 3b 0a 20 20 20 20 70 42 74 20  *)pHdr;.    pBt 
2980: 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  -= pHdr->nBacktr
2990: 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20 6d 65  aceSlots;.    me
29a0: 6d 2e 78 42 61 63 6b 74 72 61 63 65 28 70 48 64  m.xBacktrace(pHd
29b0: 72 2d 3e 69 53 69 7a 65 2c 20 70 48 64 72 2d 3e  r->iSize, pHdr->
29c0: 6e 42 61 63 6b 74 72 61 63 65 2d 31 2c 20 26 70  nBacktrace-1, &p
29d0: 42 74 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Bt[1]);.  }.}../
29e0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69  *.** Open the fi
29f0: 6c 65 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64  le indicated and
2a00: 20 77 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20   write a log of 
2a10: 61 6c 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f  all unfreed memo
2a20: 72 79 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ry .** allocatio
2a30: 6e 73 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67  ns into that log
2a40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a50: 33 4d 65 6d 64 65 62 75 67 44 75 6d 70 28 63 6f  3MemdebugDump(co
2a60: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2a70: 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  ame){.  FILE *ou
2a80: 74 3b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  t;.  struct MemB
2a90: 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20  lockHdr *pHdr;. 
2aa0: 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 69   void **pBt;.  i
2ab0: 6e 74 20 69 3b 0a 20 20 6f 75 74 20 3d 20 66 6f  nt i;.  out = fo
2ac0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  pen(zFilename, "
2ad0: 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  w");.  if( out==
2ae0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
2af0: 28 73 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e 61  (stderr, "** Una
2b00: 62 6c 65 20 74 6f 20 6f 75 74 70 75 74 20 6d 65  ble to output me
2b10: 6d 6f 72 79 20 64 65 62 75 67 20 6f 75 74 70 75  mory debug outpu
2b20: 74 20 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22 2c  t log: %s **\n",
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b40: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
2b50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2b60: 0a 20 20 66 6f 72 28 70 48 64 72 3d 6d 65 6d 2e  .  for(pHdr=mem.
2b70: 70 46 69 72 73 74 3b 20 70 48 64 72 3b 20 70 48  pFirst; pHdr; pH
2b80: 64 72 3d 70 48 64 72 2d 3e 70 4e 65 78 74 29 7b  dr=pHdr->pNext){
2b90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
2ba0: 63 68 61 72 2a 29 70 48 64 72 3b 0a 20 20 20 20  char*)pHdr;.    
2bb0: 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b  z -= pHdr->nBack
2bc0: 74 72 61 63 65 53 6c 6f 74 73 2a 73 69 7a 65 6f  traceSlots*sizeo
2bd0: 66 28 76 6f 69 64 2a 29 20 2b 20 70 48 64 72 2d  f(void*) + pHdr-
2be0: 3e 6e 54 69 74 6c 65 3b 0a 20 20 20 20 66 70 72  >nTitle;.    fpr
2bf0: 69 6e 74 66 28 6f 75 74 2c 20 22 2a 2a 2a 2a 20  intf(out, "**** 
2c00: 25 6c 6c 64 20 62 79 74 65 73 20 61 74 20 25 70  %lld bytes at %p
2c10: 20 66 72 6f 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22   from %s ****\n"
2c20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
2c30: 48 64 72 2d 3e 69 53 69 7a 65 2c 20 26 70 48 64  Hdr->iSize, &pHd
2c40: 72 5b 31 5d 2c 20 70 48 64 72 2d 3e 6e 54 69 74  r[1], pHdr->nTit
2c50: 6c 65 20 3f 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b  le ? z : "???");
2c60: 0a 20 20 20 20 69 66 28 20 70 48 64 72 2d 3e 6e  .    if( pHdr->n
2c70: 42 61 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20  Backtrace ){.   
2c80: 20 20 20 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a     fflush(out);.
2c90: 20 20 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69        pBt = (voi
2ca0: 64 2a 2a 29 70 48 64 72 3b 0a 20 20 20 20 20 20  d**)pHdr;.      
2cb0: 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61  pBt -= pHdr->nBa
2cc0: 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20  cktraceSlots;.  
2cd0: 20 20 20 20 62 61 63 6b 74 72 61 63 65 5f 73 79      backtrace_sy
2ce0: 6d 62 6f 6c 73 5f 66 64 28 70 42 74 2c 20 70 48  mbols_fd(pBt, pH
2cf0: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2c 20  dr->nBacktrace, 
2d00: 66 69 6c 65 6e 6f 28 6f 75 74 29 29 3b 0a 20 20  fileno(out));.  
2d10: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
2d20: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20   "\n");.    }.  
2d30: 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
2d40: 20 22 43 4f 55 4e 54 53 3a 5c 6e 22 29 3b 0a 20   "COUNTS:\n");. 
2d50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 43 53 49   for(i=0; i<NCSI
2d60: 5a 45 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ZE-1; i++){.    
2d70: 69 66 28 20 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69  if( mem.nAlloc[i
2d80: 5d 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ] ){.      fprin
2d90: 74 66 28 6f 75 74 2c 20 22 20 20 20 25 35 64 3a  tf(out, "   %5d:
2da0: 20 25 31 30 64 20 25 31 30 64 20 25 31 30 64 5c   %10d %10d %10d\
2db0: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
2dc0: 20 69 2a 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f 63   i*8, mem.nAlloc
2dd0: 5b 69 5d 2c 20 6d 65 6d 2e 6e 43 75 72 72 65 6e  [i], mem.nCurren
2de0: 74 5b 69 5d 2c 20 6d 65 6d 2e 6d 78 43 75 72 72  t[i], mem.mxCurr
2df0: 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ent[i]);.    }. 
2e00: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 2e 6e 41 6c   }.  if( mem.nAl
2e10: 6c 6f 63 5b 4e 43 53 49 5a 45 2d 31 5d 20 29 7b  loc[NCSIZE-1] ){
2e20: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
2e30: 2c 20 22 20 20 20 25 35 64 3a 20 25 31 30 64 20  , "   %5d: %10d 
2e40: 25 31 30 64 20 25 31 30 64 5c 6e 22 2c 0a 20 20  %10d %10d\n",.  
2e50: 20 20 20 20 20 20 20 20 20 20 20 4e 43 53 49 5a             NCSIZ
2e60: 45 2a 38 2d 38 2c 20 6d 65 6d 2e 6e 41 6c 6c 6f  E*8-8, mem.nAllo
2e70: 63 5b 4e 43 53 49 5a 45 2d 31 5d 2c 0a 20 20 20  c[NCSIZE-1],.   
2e80: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 2e 6e 43            mem.nC
2e90: 75 72 72 65 6e 74 5b 4e 43 53 49 5a 45 2d 31 5d  urrent[NCSIZE-1]
2ea0: 2c 20 6d 65 6d 2e 6d 78 43 75 72 72 65 6e 74 5b  , mem.mxCurrent[
2eb0: 4e 43 53 49 5a 45 2d 31 5d 29 3b 0a 20 20 7d 0a  NCSIZE-1]);.  }.
2ec0: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d    fclose(out);.}
2ed0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ee0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
2ef0: 65 73 20 73 71 6c 69 74 65 33 4d 65 6d 4d 61 6c  es sqlite3MemMal
2f00: 6c 6f 63 28 29 20 68 61 73 20 62 65 65 6e 20 63  loc() has been c
2f10: 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  alled..*/.int sq
2f20: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 4d 61 6c  lite3MemdebugMal
2f30: 6c 6f 63 43 6f 75 6e 74 28 29 7b 0a 20 20 69 6e  locCount(){.  in
2f40: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 6f 74 61  t i;.  int nTota
2f50: 6c 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  l = 0;.  for(i=0
2f60: 3b 20 69 3c 4e 43 53 49 5a 45 3b 20 69 2b 2b 29  ; i<NCSIZE; i++)
2f70: 7b 0a 20 20 20 20 6e 54 6f 74 61 6c 20 2b 3d 20  {.    nTotal += 
2f80: 6d 65 6d 2e 6e 41 6c 6c 6f 63 5b 69 5d 3b 0a 20  mem.nAlloc[i];. 
2f90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 54 6f 74   }.  return nTot
2fa0: 61 6c 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f  al;.}...#endif /
2fb0: 2a 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  * SQLITE_MEMDEBU
2fc0: 47 20 2a 2f 0a                                   G */.