/ Hex Artifact Content
Login

Artifact 48919353f72b8f6e957a0021eb9deaf863998189:


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 20 54 68 69 73 20 66 69 6c 65  ***.** This file
0180: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 20   contains the C 
0190: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69  functions that i
01a0: 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
01b0: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
01c0: 73 75 62 73 79 73 74 65 6d 20 66 6f 72 20 75 73  subsystem for us
01d0: 65 20 62 79 20 53 51 4c 69 74 65 2e 20 20 0a 2a  e by SQLite.  .*
01e0: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 65 6d 32 2e 63  *.** $Id: mem2.c
01f0: 2c 76 20 31 2e 38 20 32 30 30 37 2f 30 38 2f 32  ,v 1.8 2007/08/2
0200: 33 20 30 32 3a 34 37 3a 35 33 20 64 72 68 20 45  3 02:47:53 drh E
0210: 78 70 20 24 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  xp $.*/../*.** T
0220: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  his version of t
0230: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0240: 74 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  tor is used only
0250: 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54   if the.** SQLIT
0260: 45 5f 4d 45 4d 44 45 42 55 47 20 6d 61 63 72 6f  E_MEMDEBUG macro
0270: 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e 64 20   is defined and 
0280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
0290: 52 59 5f 41 4c 4c 4f 43 41 54 49 4f 4e 0a 2a 2a  RY_ALLOCATION.**
02a0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
02b0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02c0: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 29  SQLITE_MEMDEBUG)
02d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
02e0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f  ITE_OMIT_MEMORY_
02f0: 41 4c 4c 4f 43 41 54 49 4f 4e 29 0a 0a 2f 2a 0a  ALLOCATION)../*.
0300: 2a 2a 20 57 65 20 77 69 6c 6c 20 65 76 65 6e 74  ** We will event
0310: 75 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 20  ually construct 
0320: 6d 75 6c 74 69 70 6c 65 20 6d 65 6d 6f 72 79 20  multiple memory 
0330: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
0340: 73 74 65 6d 73 0a 2a 2a 20 73 75 69 74 61 62 6c  stems.** suitabl
0350: 65 20 66 6f 72 20 75 73 65 20 69 6e 20 76 61 72  e for use in var
0360: 69 6f 75 73 20 63 6f 6e 74 65 78 74 73 3a 0a 2a  ious contexts:.*
0370: 2a 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 72 6d 61  *.**    *  Norma
0380: 6c 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  l multi-threaded
0390: 20 62 75 69 6c 64 73 0a 2a 2a 20 20 20 20 2a 20   builds.**    * 
03a0: 20 4e 6f 72 6d 61 6c 20 73 69 6e 67 6c 65 2d 74   Normal single-t
03b0: 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 0a 2a  hreaded builds.*
03c0: 2a 20 20 20 20 2a 20 20 44 65 62 75 67 67 69 6e  *    *  Debuggin
03d0: 67 20 62 75 69 6c 64 73 0a 2a 2a 0a 2a 2a 20 54  g builds.**.** T
03e0: 68 69 73 20 76 65 72 73 69 6f 6e 20 69 73 20 73  his version is s
03f0: 75 69 74 61 62 6c 65 20 66 6f 72 20 75 73 65 20  uitable for use 
0400: 69 6e 20 64 65 62 75 67 67 69 6e 67 20 62 75 69  in debugging bui
0410: 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75  lds..**.** Featu
0420: 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  res:.**.**    * 
0430: 45 76 65 72 79 20 61 6c 6c 6f 63 61 74 65 20 68  Every allocate h
0440: 61 73 20 67 75 61 72 64 73 20 61 74 20 62 6f 74  as guards at bot
0450: 68 20 65 6e 64 73 2e 0a 2a 2a 20 20 20 20 2a 20  h ends..**    * 
0460: 4e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  New allocations 
0470: 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
0480: 77 69 74 68 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  with randomness.
0490: 2a 2a 20 20 20 20 2a 20 41 6c 6c 6f 63 61 74 69  **    * Allocati
04a0: 6f 6e 73 20 61 72 65 20 6f 76 65 72 77 72 69 74  ons are overwrit
04b0: 74 65 6e 20 77 69 74 68 20 72 61 6e 64 6f 6d 6e  ten with randomn
04c0: 65 73 73 20 77 68 65 6e 20 66 72 65 65 64 0a 2a  ess when freed.*
04d0: 2a 20 20 20 20 2a 20 4f 70 74 69 6f 6e 61 6c 20  *    * Optional 
04e0: 6c 6f 67 73 20 6f 66 20 6d 61 6c 6c 6f 63 20 61  logs of malloc a
04f0: 63 74 69 76 69 74 79 20 67 65 6e 65 72 61 74 65  ctivity generate
0500: 64 0a 2a 2a 20 20 20 20 2a 20 53 75 6d 6d 61 72  d.**    * Summar
0510: 79 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  y of outstanding
0520: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74   allocations wit
0530: 68 20 62 61 63 6b 74 72 61 63 65 73 20 74 6f 20  h backtraces to 
0540: 74 68 65 0a 2a 2a 20 20 20 20 20 20 70 6f 69 6e  the.**      poin
0550: 74 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  t of allocation.
0560: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 61 62 69  .**    * The abi
0570: 6c 69 74 79 20 74 6f 20 73 69 6d 75 6c 61 74 65  lity to simulate
0580: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0590: 6f 6e 20 66 61 69 6c 75 72 65 0a 2a 2f 0a 23 69  on failure.*/.#i
05a0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
05b0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h".#include <s
05c0: 74 64 69 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54  tdio.h>../*.** T
05d0: 68 65 20 62 61 63 6b 74 72 61 63 65 20 66 75 6e  he backtrace fun
05e0: 63 74 69 6f 6e 61 6c 69 74 79 20 69 73 20 6f 6e  ctionality is on
05f0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  ly available wit
0600: 68 20 47 4c 49 42 43 0a 2a 2f 0a 23 69 66 64 65  h GLIBC.*/.#ifde
0610: 66 20 5f 5f 47 4c 49 42 43 5f 5f 0a 20 20 65 78  f __GLIBC__.  ex
0620: 74 65 72 6e 20 69 6e 74 20 62 61 63 6b 74 72 61  tern int backtra
0630: 63 65 28 76 6f 69 64 2a 2a 2c 69 6e 74 29 3b 0a  ce(void**,int);.
0640: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 62 61    extern void ba
0650: 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f  cktrace_symbols_
0660: 66 64 28 76 6f 69 64 2a 63 6f 6e 73 74 2a 2c 69  fd(void*const*,i
0670: 6e 74 2c 69 6e 74 29 3b 0a 23 65 6c 73 65 0a 23  nt,int);.#else.#
0680: 20 64 65 66 69 6e 65 20 62 61 63 6b 74 72 61 63   define backtrac
0690: 65 28 41 2c 42 29 20 30 0a 23 20 64 65 66 69 6e  e(A,B) 0.# defin
06a0: 65 20 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62  e backtrace_symb
06b0: 6f 6c 73 5f 66 64 28 41 2c 42 2c 43 29 0a 23 65  ols_fd(A,B,C).#e
06c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ndif../*.** Each
06d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
06e0: 6f 6e 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  on looks like th
06f0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 2d 2d 2d 2d 2d  is:.**.**  -----
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 0a 2a 2a 20 20 7c 20 54 69 74 6c 65 20  ---.**  | Title 
0750: 7c 20 20 62 61 63 6b 74 72 61 63 65 20 70 6f 69  |  backtrace poi
0760: 6e 74 65 72 73 20 7c 20 20 4d 65 6d 42 6c 6f 63  nters |  MemBloc
0770: 6b 48 64 72 20 7c 20 20 61 6c 6c 6f 63 61 74 69  kHdr |  allocati
0780: 6f 6e 20 7c 20 20 45 6e 64 47 75 61 72 64 20 7c  on |  EndGuard |
0790: 0a 2a 2a 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**  -----------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
07e0: 0a 2a 2a 20 54 68 65 20 61 70 70 6c 69 63 61 74  .** The applicat
07f0: 69 6f 6e 20 63 6f 64 65 20 73 65 65 73 20 6f 6e  ion code sees on
0800: 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
0810: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  the allocation. 
0820: 20 57 65 20 68 61 76 65 0a 2a 2a 20 74 6f 20 62   We have.** to b
0830: 61 63 6b 20 75 70 20 66 72 6f 6d 20 74 68 65 20  ack up from the 
0840: 61 6c 6c 6f 63 61 74 69 6f 6e 20 70 6f 69 6e 74  allocation point
0850: 65 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 4d  er to find the M
0860: 65 6d 42 6c 6f 63 6b 48 64 72 2e 20 20 54 68 65  emBlockHdr.  The
0870: 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  .** MemBlockHdr 
0880: 74 65 6c 6c 73 20 75 73 20 74 68 65 20 73 69 7a  tells us the siz
0890: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
08a0: 69 6f 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ion and the numb
08b0: 65 72 20 6f 66 0a 2a 2a 20 62 61 63 6b 74 72 61  er of.** backtra
08c0: 63 65 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68  ce pointers.  Th
08d0: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 67 75  ere is also a gu
08e0: 61 72 64 20 77 6f 72 64 20 61 74 20 74 68 65 20  ard word at the 
08f0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 4d 65  end of the.** Me
0900: 6d 42 6c 6f 63 6b 48 64 72 2e 0a 2a 2f 0a 73 74  mBlockHdr..*/.st
0910: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
0920: 20 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42   {.  struct MemB
0930: 6c 6f 63 6b 48 64 72 20 2a 70 4e 65 78 74 2c 20  lockHdr *pNext, 
0940: 2a 70 50 72 65 76 3b 20 20 2f 2a 20 4c 69 6e 6b  *pPrev;  /* Link
0950: 65 64 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 75  ed list of all u
0960: 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  nfreed memory */
0970: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
0980: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
0990: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
09a0: 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
09b0: 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
09c0: 63 68 61 72 20 6e 42 61 63 6b 74 72 61 63 65 3b  char nBacktrace;
09d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
09e0: 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61 63  mber of backtrac
09f0: 65 73 20 6f 6e 20 74 68 69 73 20 61 6c 6c 6f 63  es on this alloc
0a00: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
0a10: 68 61 72 20 6e 42 61 63 6b 74 72 61 63 65 53 6c  har nBacktraceSl
0a20: 6f 74 73 3b 20 20 20 20 20 20 2f 2a 20 41 76 61  ots;      /* Ava
0a30: 69 6c 61 62 6c 65 20 62 61 63 6b 74 72 61 63 65  ilable backtrace
0a40: 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 75 6e 73 69   slots */.  unsi
0a50: 67 6e 65 64 20 73 68 6f 72 74 20 6e 54 69 74 6c  gned short nTitl
0a60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0a70: 2f 2a 20 42 79 74 65 73 20 6f 66 20 74 69 74 6c  /* Bytes of titl
0a80: 65 3b 20 69 6e 63 6c 75 64 65 73 20 27 5c 30 27  e; includes '\0'
0a90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
0aa0: 6e 74 20 69 46 6f 72 65 47 75 61 72 64 3b 20 20  nt iForeGuard;  
0ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 75 61            /* Gua
0ac0: 72 64 20 77 6f 72 64 20 66 6f 72 20 73 61 6e 69  rd word for sani
0ad0: 74 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ty */.};../*.** 
0ae0: 47 75 61 72 64 20 77 6f 72 64 73 0a 2a 2f 0a 23  Guard words.*/.#
0af0: 64 65 66 69 6e 65 20 46 4f 52 45 47 55 41 52 44  define FOREGUARD
0b00: 20 30 78 38 30 46 35 45 31 35 33 0a 23 64 65 66   0x80F5E153.#def
0b10: 69 6e 65 20 52 45 41 52 47 55 41 52 44 20 30 78  ine REARGUARD 0x
0b20: 45 34 36 37 36 42 35 33 0a 0a 2f 2a 0a 2a 2a 20  E4676B53../*.** 
0b30: 41 6c 6c 20 6f 66 20 74 68 65 20 73 74 61 74 69  All of the stati
0b40: 63 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64  c variables used
0b50: 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 20   by this module 
0b60: 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a  are collected.**
0b70: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73   into a single s
0b80: 74 72 75 63 74 75 72 65 20 6e 61 6d 65 64 20 22  tructure named "
0b90: 6d 65 6d 22 2e 20 20 54 68 69 73 20 69 73 20 74  mem".  This is t
0ba0: 6f 20 6b 65 65 70 20 74 68 65 0a 2a 2a 20 73 74  o keep the.** st
0bb0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 6f  atic variables o
0bc0: 72 67 61 6e 69 7a 65 64 20 61 6e 64 20 74 6f 20  rganized and to 
0bd0: 72 65 64 75 63 65 20 6e 61 6d 65 73 70 61 63 65  reduce namespace
0be0: 20 70 6f 6c 6c 75 74 69 6f 6e 0a 2a 2a 20 77 68   pollution.** wh
0bf0: 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  en this module i
0c00: 73 20 63 6f 6d 62 69 6e 65 64 20 77 69 74 68 20  s combined with 
0c10: 6f 74 68 65 72 20 69 6e 20 74 68 65 20 61 6d 61  other in the ama
0c20: 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  lgamation..*/.st
0c30: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
0c40: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 61 6c 61 72  /*.  ** The alar
0c50: 6d 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 69  m callback and i
0c60: 74 73 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  ts arguments.  T
0c70: 68 65 20 6d 65 6d 2e 6d 75 74 65 78 20 6c 6f 63  he mem.mutex loc
0c80: 6b 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 68  k will.  ** be h
0c90: 65 6c 64 20 77 68 69 6c 65 20 74 68 65 20 63 61  eld while the ca
0ca0: 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e  llback is runnin
0cb0: 67 2e 20 20 52 65 63 75 72 73 69 76 65 20 63 61  g.  Recursive ca
0cc0: 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  lls into.  ** th
0cd0: 65 20 6d 65 6d 6f 72 79 20 73 75 62 73 79 73 74  e memory subsyst
0ce0: 65 6d 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20  em are allowed, 
0cf0: 62 75 74 20 6e 6f 20 6e 65 77 20 63 61 6c 6c 62  but no new callb
0d00: 61 63 6b 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  acks will be.  *
0d10: 2a 20 69 73 73 75 65 64 2e 20 20 54 68 65 20 61  * issued.  The a
0d20: 6c 61 72 6d 42 75 73 79 20 76 61 72 69 61 62 6c  larmBusy variabl
0d30: 65 20 69 73 20 73 65 74 20 74 6f 20 70 72 65 76  e is set to prev
0d40: 65 6e 74 20 72 65 63 75 72 73 69 76 65 0a 20 20  ent recursive.  
0d50: 2a 2a 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  ** callbacks..  
0d60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  */.  sqlite3_uin
0d70: 74 36 34 20 61 6c 61 72 6d 54 68 72 65 73 68 6f  t64 alarmThresho
0d80: 6c 64 3b 0a 20 20 76 6f 69 64 20 28 2a 61 6c 61  ld;.  void (*ala
0d90: 72 6d 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  rmCallback)(void
0da0: 2a 2c 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  *, sqlite3_uint6
0db0: 34 2c 20 75 6e 73 69 67 6e 65 64 29 3b 0a 20 20  4, unsigned);.  
0dc0: 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67 3b 0a  void *alarmArg;.
0dd0: 20 20 69 6e 74 20 61 6c 61 72 6d 42 75 73 79 3b    int alarmBusy;
0de0: 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 75  .  .  /*.  ** Mu
0df0: 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  tex to control a
0e00: 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d 65 6d  ccess to the mem
0e10: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  ory allocation s
0e20: 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  ubsystem..  */. 
0e30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
0e40: 6d 75 74 65 78 3b 0a 20 20 0a 20 20 2f 2a 0a 20  mutex;.  .  /*. 
0e50: 20 2a 2a 20 43 75 72 72 65 6e 74 20 61 6c 6c 6f   ** Current allo
0e60: 63 61 74 69 6f 6e 20 61 6e 64 20 68 69 67 68 2d  cation and high-
0e70: 77 61 74 65 72 20 6d 61 72 6b 2e 0a 20 20 2a 2f  water mark..  */
0e80: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
0e90: 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20 73 71 6c  4 nowUsed;.  sql
0ea0: 69 74 65 33 5f 75 69 6e 74 36 34 20 6d 78 55 73  ite3_uint64 mxUs
0eb0: 65 64 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  ed;.  .  /*.  **
0ec0: 20 48 65 61 64 20 61 6e 64 20 74 61 69 6c 20 6f   Head and tail o
0ed0: 66 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  f a linked list 
0ee0: 6f 66 20 61 6c 6c 20 6f 75 74 73 74 61 6e 64 69  of all outstandi
0ef0: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 20  ng allocations. 
0f00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4d 65 6d   */.  struct Mem
0f10: 42 6c 6f 63 6b 48 64 72 20 2a 70 46 69 72 73 74  BlockHdr *pFirst
0f20: 3b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c  ;.  struct MemBl
0f30: 6f 63 6b 48 64 72 20 2a 70 4c 61 73 74 3b 0a 20  ockHdr *pLast;. 
0f40: 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20   .  /*.  ** The 
0f50: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0f60: 20 6f 66 20 62 61 63 6b 74 72 61 63 65 20 74 6f   of backtrace to
0f70: 20 73 61 76 65 20 69 6e 20 6e 65 77 20 61 6c 6c   save in new all
0f80: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
0f90: 20 69 6e 74 20 6e 42 61 63 6b 74 72 61 63 65 3b   int nBacktrace;
0fa0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 69 74 6c  ..  /*.  ** Titl
0fb0: 65 20 74 65 78 74 20 74 6f 20 69 6e 73 65 72 74  e text to insert
0fc0: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 61 63   in front of eac
0fd0: 68 20 62 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  h block.  */.  i
0fe0: 6e 74 20 6e 54 69 74 6c 65 3b 20 20 20 20 20 20  nt nTitle;      
0ff0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 54    /* Bytes of zT
1000: 69 74 6c 65 20 74 6f 20 73 61 76 65 2e 20 20 49  itle to save.  I
1010: 6e 63 6c 75 64 65 73 20 27 5c 30 27 20 61 6e 64  ncludes '\0' and
1020: 20 70 61 64 64 69 6e 67 20 2a 2f 0a 20 20 63 68   padding */.  ch
1030: 61 72 20 7a 54 69 74 6c 65 5b 31 30 30 5d 3b 20  ar zTitle[100]; 
1040: 20 2f 2a 20 54 68 65 20 74 69 74 6c 65 20 74 65   /* The title te
1050: 78 74 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  xt */..  /*.  **
1060: 20 54 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   These values ar
1070: 65 20 75 73 65 64 20 74 6f 20 73 69 6d 75 6c 61  e used to simula
1080: 74 65 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  te malloc failur
1090: 65 73 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 69  es.  When.  ** i
10a0: 46 61 69 6c 20 69 73 20 31 2c 20 73 69 6d 75 6c  Fail is 1, simul
10b0: 61 74 65 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69  ate a malloc fai
10c0: 6c 75 72 65 73 20 61 6e 64 20 72 65 73 65 74 20  lures and reset 
10d0: 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
10e0: 6f 20 69 52 65 73 65 74 2e 0a 20 20 2a 2f 0a 20  o iReset..  */. 
10f0: 20 69 6e 74 20 69 46 61 69 6c 3b 20 20 20 20 2f   int iFail;    /
1100: 2a 20 44 65 63 72 65 6d 65 6e 74 20 61 6e 64 20  * Decrement and 
1110: 66 61 69 6c 20 6d 61 6c 6c 6f 63 20 77 68 65 6e  fail malloc when
1120: 20 74 68 69 73 20 69 73 20 31 20 2a 2f 0a 20 20   this is 1 */.  
1130: 69 6e 74 20 69 52 65 73 65 74 3b 20 20 20 2f 2a  int iReset;   /*
1140: 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   When malloc fai
1150: 6c 73 20 73 65 74 20 69 69 46 61 69 6c 20 74 6f  ls set iiFail to
1160: 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
1170: 20 69 6e 74 20 69 46 61 69 6c 43 6e 74 3b 20 2f   int iFailCnt; /
1180: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 61 69 6c  * Number of fail
1190: 75 72 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 0a 20  ures */..  /* . 
11a0: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   ** sqlite3Mallo
11b0: 63 44 69 73 61 6c 6c 6f 77 28 29 20 69 6e 63 72  cDisallow() incr
11c0: 65 6d 65 6e 74 73 20 74 68 65 20 66 6f 6c 6c 6f  ements the follo
11d0: 77 69 6e 67 20 63 6f 75 6e 74 65 72 2e 0a 20 20  wing counter..  
11e0: 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ** sqlite3Malloc
11f0: 41 6c 6c 6f 77 28 29 20 64 65 63 72 65 6d 65 6e  Allow() decremen
1200: 74 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ts it..  */.  in
1210: 74 20 64 69 73 61 6c 6c 6f 77 3b 20 2f 2a 20 44  t disallow; /* D
1220: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6d 65 6d 6f  o not allow memo
1230: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  ry allocation */
1240: 0a 20 20 0a 20 20 0a 7d 20 6d 65 6d 20 3d 20 7b  .  .  .} mem = {
1250: 20 20 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62    /* This variab
1260: 6c 65 20 68 6f 6c 64 73 20 61 6c 6c 20 6f 66 20  le holds all of 
1270: 74 68 65 20 6c 6f 63 61 6c 20 64 61 74 61 20 2a  the local data *
1280: 2f 0a 20 20 20 28 28 73 71 6c 69 74 65 33 5f 75  /.   ((sqlite3_u
1290: 69 6e 74 36 34 29 31 29 3c 3c 36 33 2c 20 20 20  int64)1)<<63,   
12a0: 20 2f 2a 20 61 6c 61 72 6d 54 68 72 65 73 68 6f   /* alarmThresho
12b0: 6c 64 20 2a 2f 0a 20 20 20 2f 2a 20 45 76 65 72  ld */.   /* Ever
12c0: 79 74 68 69 6e 67 20 65 6c 73 65 20 69 73 20 69  ything else is i
12d0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
12e0: 72 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 0a 2f 2a 0a 2a  ro */.};..../*.*
12f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f  * Return the amo
1300: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75  unt of memory cu
1310: 72 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20  rrently checked 
1320: 6f 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  out..*/.sqlite3_
1330: 75 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d  uint64 sqlite3_m
1340: 65 6d 6f 72 79 5f 75 73 65 64 28 76 6f 69 64 29  emory_used(void)
1350: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  {.  sqlite3_uint
1360: 36 34 20 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 2e  64 n;.  if( mem.
1370: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
1380: 6d 65 6d 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69  mem.mutex = sqli
1390: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
13a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13b0: 54 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  TIC_MEM);.  }.  
13c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13d0: 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a  ter(mem.mutex);.
13e0: 20 20 6e 20 3d 20 6d 65 6d 2e 6e 6f 77 55 73 65    n = mem.nowUse
13f0: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
1400: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
1410: 65 78 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20  ex);  .  return 
1420: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
1430: 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  rn the maximum a
1440: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
1450: 74 68 61 74 20 68 61 73 20 65 76 65 72 20 62 65  that has ever be
1460: 65 6e 0a 2a 2a 20 63 68 65 63 6b 65 64 20 6f 75  en.** checked ou
1470: 74 20 73 69 6e 63 65 20 65 69 74 68 65 72 20 74  t since either t
1480: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1490: 74 68 69 73 20 70 72 6f 63 65 73 73 0a 2a 2a 20  this process.** 
14a0: 6f 72 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73  or since the mos
14b0: 74 20 72 65 63 65 6e 74 20 72 65 73 65 74 2e 0a  t recent reset..
14c0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  */.sqlite3_uint6
14d0: 34 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  4 sqlite3_memory
14e0: 5f 68 69 67 68 77 61 74 65 72 28 69 6e 74 20 72  _highwater(int r
14f0: 65 73 65 74 46 6c 61 67 29 7b 0a 20 20 73 71 6c  esetFlag){.  sql
1500: 69 74 65 33 5f 75 69 6e 74 36 34 20 6e 3b 0a 20  ite3_uint64 n;. 
1510: 20 69 66 28 20 6d 65 6d 2e 6d 75 74 65 78 3d 3d   if( mem.mutex==
1520: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 2e 6d 75 74  0 ){.    mem.mut
1530: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
1540: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1550: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
1560: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1570: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
1580: 2e 6d 75 74 65 78 29 3b 0a 20 20 6e 20 3d 20 6d  .mutex);.  n = m
1590: 65 6d 2e 6d 78 55 73 65 64 3b 0a 20 20 69 66 28  em.mxUsed;.  if(
15a0: 20 72 65 73 65 74 46 6c 61 67 20 29 7b 0a 20 20   resetFlag ){.  
15b0: 20 20 6d 65 6d 2e 6d 78 55 73 65 64 20 3d 20 6d    mem.mxUsed = m
15c0: 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20 7d 0a  em.nowUsed;.  }.
15d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15e0: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
15f0: 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ;  .  return n;.
1600: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1610: 74 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61  the alarm callba
1620: 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ck.*/.int sqlite
1630: 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72 6d 28 0a  3_memory_alarm(.
1640: 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63    void(*xCallbac
1650: 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 73  k)(void *pArg, s
1660: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 73  qlite3_uint64 us
1670: 65 64 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ed, unsigned int
1680: 20 4e 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72   N),.  void *pAr
1690: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  g,.  sqlite3_uin
16a0: 74 36 34 20 69 54 68 72 65 73 68 6f 6c 64 0a 29  t64 iThreshold.)
16b0: 7b 0a 20 20 69 66 28 20 6d 65 6d 2e 6d 75 74 65  {.  if( mem.mute
16c0: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 2e  x==0 ){.    mem.
16d0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
16e0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
16f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1700: 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  MEM);.  }.  sqli
1710: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1720: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65  mem.mutex);.  me
1730: 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 20  m.alarmCallback 
1740: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 6d  = xCallback;.  m
1750: 65 6d 2e 61 6c 61 72 6d 41 72 67 20 3d 20 70 41  em.alarmArg = pA
1760: 72 67 3b 0a 20 20 6d 65 6d 2e 61 6c 61 72 6d 54  rg;.  mem.alarmT
1770: 68 72 65 73 68 6f 6c 64 20 3d 20 69 54 68 72 65  hreshold = iThre
1780: 73 68 6f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  shold;.  sqlite3
1790: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
17a0: 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  .mutex);.  retur
17b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17c0: 2f 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 74 68  /*.** Trigger th
17d0: 65 20 61 6c 61 72 6d 20 0a 2a 2f 0a 73 74 61 74  e alarm .*/.stat
17e0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  ic void sqlite3M
17f0: 65 6d 73 79 73 41 6c 61 72 6d 28 75 6e 73 69 67  emsysAlarm(unsig
1800: 6e 65 64 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f  ned nByte){.  vo
1810: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
1820: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 5f 75 69  void*,sqlite3_ui
1830: 6e 74 36 34 2c 75 6e 73 69 67 6e 65 64 29 3b 0a  nt64,unsigned);.
1840: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
1850: 20 6e 6f 77 55 73 65 64 3b 0a 20 20 76 6f 69 64   nowUsed;.  void
1860: 20 2a 70 41 72 67 3b 0a 20 20 69 66 28 20 6d 65   *pArg;.  if( me
1870: 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3d  m.alarmCallback=
1880: 3d 30 20 7c 7c 20 6d 65 6d 2e 61 6c 61 72 6d 42  =0 || mem.alarmB
1890: 75 73 79 20 20 29 20 72 65 74 75 72 6e 3b 0a 20  usy  ) return;. 
18a0: 20 6d 65 6d 2e 61 6c 61 72 6d 42 75 73 79 20 3d   mem.alarmBusy =
18b0: 20 31 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 20   1;.  xCallback 
18c0: 3d 20 6d 65 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62  = mem.alarmCallb
18d0: 61 63 6b 3b 0a 20 20 6e 6f 77 55 73 65 64 20 3d  ack;.  nowUsed =
18e0: 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20   mem.nowUsed;.  
18f0: 70 41 72 67 20 3d 20 6d 65 6d 2e 61 6c 61 72 6d  pArg = mem.alarm
1900: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
1910: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d  utex_leave(mem.m
1920: 75 74 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62 61  utex);.  xCallba
1930: 63 6b 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64  ck(pArg, nowUsed
1940: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c 69  , nByte);.  sqli
1950: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1960: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65  mem.mutex);.  me
1970: 6d 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 30 3b  m.alarmBusy = 0;
1980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1990: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 66  an allocation, f
19a0: 69 6e 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b  ind the MemBlock
19b0: 48 64 72 20 66 6f 72 20 74 68 61 74 20 61 6c 6c  Hdr for that all
19c0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
19d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
19e0: 6b 73 20 74 68 65 20 67 75 61 72 64 73 20 61 74  ks the guards at
19f0: 20 65 69 74 68 65 72 20 65 6e 64 20 6f 66 20 74   either end of t
1a00: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e  he allocation an
1a10: 64 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65  d.** if they are
1a20: 20 69 6e 63 6f 72 72 65 63 74 20 69 74 20 61 73   incorrect it as
1a30: 73 65 72 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  serts..*/.static
1a40: 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b   struct MemBlock
1a50: 48 64 72 20 2a 73 71 6c 69 74 65 33 4d 65 6d 73  Hdr *sqlite3Mems
1a60: 79 73 47 65 74 48 65 61 64 65 72 28 76 6f 69 64  ysGetHeader(void
1a70: 20 2a 70 41 6c 6c 6f 63 61 74 69 6f 6e 29 7b 0a   *pAllocation){.
1a80: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
1a90: 6b 48 64 72 20 2a 70 3b 0a 20 20 75 6e 73 69 67  kHdr *p;.  unsig
1aa0: 6e 65 64 20 69 6e 74 20 2a 70 49 6e 74 3b 0a 0a  ned int *pInt;..
1ab0: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4d 65    p = (struct Me
1ac0: 6d 42 6c 6f 63 6b 48 64 72 2a 29 70 41 6c 6c 6f  mBlockHdr*)pAllo
1ad0: 63 61 74 69 6f 6e 3b 0a 20 20 70 2d 2d 3b 0a 20  cation;.  p--;. 
1ae0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 46 6f 72   assert( p->iFor
1af0: 65 47 75 61 72 64 3d 3d 46 4f 52 45 47 55 41 52  eGuard==FOREGUAR
1b00: 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
1b10: 70 2d 3e 69 53 69 7a 65 20 26 20 33 29 3d 3d 30  p->iSize & 3)==0
1b20: 20 29 3b 0a 20 20 70 49 6e 74 20 3d 20 28 75 6e   );.  pInt = (un
1b30: 73 69 67 6e 65 64 20 69 6e 74 2a 29 70 41 6c 6c  signed int*)pAll
1b40: 6f 63 61 74 69 6f 6e 3b 0a 20 20 61 73 73 65 72  ocation;.  asser
1b50: 74 28 20 70 49 6e 74 5b 70 2d 3e 69 53 69 7a 65  t( pInt[p->iSize
1b60: 2f 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65 64  /sizeof(unsigned
1b70: 20 69 6e 74 29 5d 3d 3d 52 45 41 52 47 55 41 52   int)]==REARGUAR
1b80: 44 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  D );.  return p;
1b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1ba0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1bb0: 20 6f 6e 63 65 20 74 68 65 20 66 69 72 73 74 20   once the first 
1bc0: 74 69 6d 65 20 61 20 73 69 6d 75 6c 61 74 65 64  time a simulated
1bd0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 61 69 6c 75   memory.** failu
1be0: 72 65 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20  re occurs.  The 
1bf0: 73 6f 6c 65 20 70 75 72 70 6f 73 65 20 6f 66 20  sole purpose of 
1c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c10: 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 61 20  to provide.** a 
1c20: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
1c30: 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67   to set a debugg
1c40: 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 68  er breakpoint wh
1c50: 65 6e 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  en debugging.** 
1c60: 65 72 72 6f 72 73 20 72 65 6c 61 74 65 64 20 74  errors related t
1c70: 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  o malloc() failu
1c80: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  res..*/.static v
1c90: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 73 79  oid sqlite3Memsy
1ca0: 73 46 61 69 6c 65 64 28 76 6f 69 64 29 7b 0a 20  sFailed(void){. 
1cb0: 20 6d 65 6d 2e 69 46 61 69 6c 43 6e 74 20 3d 20   mem.iFailCnt = 
1cc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  0;.}../*.** Allo
1cd0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
1ce0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76   of memory..*/.v
1cf0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c  oid *sqlite3_mal
1d00: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a  loc(int nByte){.
1d10: 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63    struct MemBloc
1d20: 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f  kHdr *pHdr;.  vo
1d30: 69 64 20 2a 2a 70 42 74 3b 0a 20 20 63 68 61 72  id **pBt;.  char
1d40: 20 2a 7a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   *z;.  unsigned 
1d50: 69 6e 74 20 2a 70 49 6e 74 3b 0a 20 20 76 6f 69  int *pInt;.  voi
1d60: 64 20 2a 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64  d *p;.  unsigned
1d70: 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 0a   int totalSize;.
1d80: 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 30 20  .  if( nByte<=0 
1d90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1da0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 2e 6d  .  }.  if( mem.m
1db0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  utex==0 ){.    m
1dc0: 65 6d 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  em.mutex = sqlit
1dd0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1de0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1df0: 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 73  IC_MEM);.  }.  s
1e00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1e10: 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20  er(mem.mutex);. 
1e20: 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 64 69 73   assert( mem.dis
1e30: 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 69 66  allow==0 );.  if
1e40: 28 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 2b 6e 42  ( mem.nowUsed+nB
1e50: 79 74 65 3e 3d 6d 65 6d 2e 61 6c 61 72 6d 54 68  yte>=mem.alarmTh
1e60: 72 65 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 73  reshold ){.    s
1e70: 71 6c 69 74 65 33 4d 65 6d 73 79 73 41 6c 61 72  qlite3MemsysAlar
1e80: 6d 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  m(nByte);.  }.  
1e90: 6e 42 79 74 65 20 3d 20 28 6e 42 79 74 65 2b 33  nByte = (nByte+3
1ea0: 29 26 7e 33 3b 0a 20 20 74 6f 74 61 6c 53 69 7a  )&~3;.  totalSiz
1eb0: 65 20 3d 20 6e 42 79 74 65 20 2b 20 73 69 7a 65  e = nByte + size
1ec0: 6f 66 28 2a 70 48 64 72 29 20 2b 20 73 69 7a 65  of(*pHdr) + size
1ed0: 6f 66 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  of(unsigned int)
1ee0: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
1ef0: 20 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65    mem.nBacktrace
1f00: 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b  *sizeof(void*) +
1f10: 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 69   mem.nTitle;.  i
1f20: 66 28 20 6d 65 6d 2e 69 46 61 69 6c 3e 30 20 29  f( mem.iFail>0 )
1f30: 7b 0a 20 20 20 20 69 66 28 20 6d 65 6d 2e 69 46  {.    if( mem.iF
1f40: 61 69 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ail==1 ){.      
1f50: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d  p = 0;.      mem
1f60: 2e 69 46 61 69 6c 20 3d 20 6d 65 6d 2e 69 52 65  .iFail = mem.iRe
1f70: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  set;.      if( m
1f80: 65 6d 2e 69 46 61 69 6c 43 6e 74 3d 3d 30 20 29  em.iFailCnt==0 )
1f90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1fa0: 33 4d 65 6d 73 79 73 46 61 69 6c 65 64 28 29 3b  3MemsysFailed();
1fb0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
1fc0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
1fd0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1fe0: 20 20 6d 65 6d 2e 69 46 61 69 6c 43 6e 74 2b 2b    mem.iFailCnt++
1ff0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2000: 20 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f     p = malloc(to
2010: 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  talSize);.      
2020: 6d 65 6d 2e 69 46 61 69 6c 2d 2d 3b 0a 20 20 20  mem.iFail--;.   
2030: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2040: 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f 74 61 6c  p = malloc(total
2050: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
2060: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2070: 69 74 65 33 4d 65 6d 73 79 73 41 6c 61 72 6d 28  ite3MemsysAlarm(
2080: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 20  nByte);.      p 
2090: 3d 20 6d 61 6c 6c 6f 63 28 74 6f 74 61 6c 53 69  = malloc(totalSi
20a0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ze);.    }.  }. 
20b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 7a 20   if( p ){.    z 
20c0: 3d 20 70 3b 0a 20 20 20 20 70 42 74 20 3d 20 28  = p;.    pBt = (
20d0: 76 6f 69 64 2a 2a 29 26 7a 5b 6d 65 6d 2e 6e 54  void**)&z[mem.nT
20e0: 69 74 6c 65 5d 3b 0a 20 20 20 20 70 48 64 72 20  itle];.    pHdr 
20f0: 3d 20 28 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  = (struct MemBlo
2100: 63 6b 48 64 72 2a 29 26 70 42 74 5b 6d 65 6d 2e  ckHdr*)&pBt[mem.
2110: 6e 42 61 63 6b 74 72 61 63 65 5d 3b 0a 20 20 20  nBacktrace];.   
2120: 20 70 48 64 72 2d 3e 70 4e 65 78 74 20 3d 20 30   pHdr->pNext = 0
2130: 3b 0a 20 20 20 20 70 48 64 72 2d 3e 70 50 72 65  ;.    pHdr->pPre
2140: 76 20 3d 20 6d 65 6d 2e 70 4c 61 73 74 3b 0a 20  v = mem.pLast;. 
2150: 20 20 20 69 66 28 20 6d 65 6d 2e 70 4c 61 73 74     if( mem.pLast
2160: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 70 4c   ){.      mem.pL
2170: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 48 64  ast->pNext = pHd
2180: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
2190: 20 20 20 20 6d 65 6d 2e 70 46 69 72 73 74 20 3d      mem.pFirst =
21a0: 20 70 48 64 72 3b 0a 20 20 20 20 7d 0a 20 20 20   pHdr;.    }.   
21b0: 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70 48 64   mem.pLast = pHd
21c0: 72 3b 0a 20 20 20 20 70 48 64 72 2d 3e 69 46 6f  r;.    pHdr->iFo
21d0: 72 65 47 75 61 72 64 20 3d 20 46 4f 52 45 47 55  reGuard = FOREGU
21e0: 41 52 44 3b 0a 20 20 20 20 70 48 64 72 2d 3e 6e  ARD;.    pHdr->n
21f0: 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 20 3d  BacktraceSlots =
2200: 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 3b   mem.nBacktrace;
2210: 0a 20 20 20 20 70 48 64 72 2d 3e 6e 54 69 74 6c  .    pHdr->nTitl
2220: 65 20 3d 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a  e = mem.nTitle;.
2230: 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 42 61 63      if( mem.nBac
2240: 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  ktrace ){.      
2250: 76 6f 69 64 20 2a 61 41 64 64 72 5b 34 30 5d 3b  void *aAddr[40];
2260: 0a 20 20 20 20 20 20 70 48 64 72 2d 3e 6e 42 61  .      pHdr->nBa
2270: 63 6b 74 72 61 63 65 20 3d 20 62 61 63 6b 74 72  cktrace = backtr
2280: 61 63 65 28 61 41 64 64 72 2c 20 6d 65 6d 2e 6e  ace(aAddr, mem.n
2290: 42 61 63 6b 74 72 61 63 65 2b 31 29 2d 31 3b 0a  Backtrace+1)-1;.
22a0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 74        memcpy(pBt
22b0: 2c 20 26 61 41 64 64 72 5b 31 5d 2c 20 70 48 64  , &aAddr[1], pHd
22c0: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2a 73 69  r->nBacktrace*si
22d0: 7a 65 6f 66 28 76 6f 69 64 2a 29 29 3b 0a 20 20  zeof(void*));.  
22e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22f0: 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 20  Hdr->nBacktrace 
2300: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
2310: 66 28 20 6d 65 6d 2e 6e 54 69 74 6c 65 20 29 7b  f( mem.nTitle ){
2320: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
2330: 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 6d 65 6d   mem.zTitle, mem
2340: 2e 6e 54 69 74 6c 65 29 3b 0a 20 20 20 20 7d 0a  .nTitle);.    }.
2350: 20 20 20 20 70 48 64 72 2d 3e 69 53 69 7a 65 20      pHdr->iSize 
2360: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  = nByte;.    pIn
2370: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  t = (unsigned in
2380: 74 20 2a 29 26 70 48 64 72 5b 31 5d 3b 0a 20 20  t *)&pHdr[1];.  
2390: 20 20 70 49 6e 74 5b 6e 42 79 74 65 2f 73 69 7a    pInt[nByte/siz
23a0: 65 6f 66 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  eof(unsigned int
23b0: 29 5d 20 3d 20 52 45 41 52 47 55 41 52 44 3b 0a  )] = REARGUARD;.
23c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 74 2c      memset(pInt,
23d0: 20 30 78 36 35 2c 20 6e 42 79 74 65 29 3b 0a 20   0x65, nByte);. 
23e0: 20 20 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 20 2b     mem.nowUsed +
23f0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28  = nByte;.    if(
2400: 20 6d 65 6d 2e 6e 6f 77 55 73 65 64 3e 6d 65 6d   mem.nowUsed>mem
2410: 2e 6d 78 55 73 65 64 20 29 7b 0a 20 20 20 20 20  .mxUsed ){.     
2420: 20 6d 65 6d 2e 6d 78 55 73 65 64 20 3d 20 6d 65   mem.mxUsed = me
2430: 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20 20 20 7d  m.nowUsed;.    }
2440: 0a 20 20 20 20 70 20 3d 20 28 76 6f 69 64 2a 29  .    p = (void*)
2450: 70 49 6e 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  pInt;.  }.  sqli
2460: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2470: 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 72 65  mem.mutex);.  re
2480: 74 75 72 6e 20 70 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  turn p; .}../*.*
2490: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
24a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 66  /.void sqlite3_f
24b0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
24c0: 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42  ){.  struct MemB
24d0: 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20  lockHdr *pHdr;. 
24e0: 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 63   void **pBt;.  c
24f0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 70 50  har *z;.  if( pP
2500: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rior==0 ){.    r
2510: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
2520: 65 72 74 28 20 6d 65 6d 2e 6d 75 74 65 78 21 3d  ert( mem.mutex!=
2530: 30 20 29 3b 0a 20 20 70 48 64 72 20 3d 20 73 71  0 );.  pHdr = sq
2540: 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74 48 65  lite3MemsysGetHe
2550: 61 64 65 72 28 70 50 72 69 6f 72 29 3b 0a 20 20  ader(pPrior);.  
2560: 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 70 48  pBt = (void**)pH
2570: 64 72 3b 0a 20 20 70 42 74 20 2d 3d 20 70 48 64  dr;.  pBt -= pHd
2580: 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f  r->nBacktraceSlo
2590: 74 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ts;.  sqlite3_mu
25a0: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75  tex_enter(mem.mu
25b0: 74 65 78 29 3b 0a 20 20 6d 65 6d 2e 6e 6f 77 55  tex);.  mem.nowU
25c0: 73 65 64 20 2d 3d 20 70 48 64 72 2d 3e 69 53 69  sed -= pHdr->iSi
25d0: 7a 65 3b 0a 20 20 69 66 28 20 70 48 64 72 2d 3e  ze;.  if( pHdr->
25e0: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 61 73 73  pPrev ){.    ass
25f0: 65 72 74 28 20 70 48 64 72 2d 3e 70 50 72 65 76  ert( pHdr->pPrev
2600: 2d 3e 70 4e 65 78 74 3d 3d 70 48 64 72 20 29 3b  ->pNext==pHdr );
2610: 0a 20 20 20 20 70 48 64 72 2d 3e 70 50 72 65 76  .    pHdr->pPrev
2620: 2d 3e 70 4e 65 78 74 20 3d 20 70 48 64 72 2d 3e  ->pNext = pHdr->
2630: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
2640: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e      assert( mem.
2650: 70 46 69 72 73 74 3d 3d 70 48 64 72 20 29 3b 0a  pFirst==pHdr );.
2660: 20 20 20 20 6d 65 6d 2e 70 46 69 72 73 74 20 3d      mem.pFirst =
2670: 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pHdr->pNext;.  
2680: 7d 0a 20 20 69 66 28 20 70 48 64 72 2d 3e 70 4e  }.  if( pHdr->pN
2690: 65 78 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ext ){.    asser
26a0: 74 28 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e  t( pHdr->pNext->
26b0: 70 50 72 65 76 3d 3d 70 48 64 72 20 29 3b 0a 20  pPrev==pHdr );. 
26c0: 20 20 20 70 48 64 72 2d 3e 70 4e 65 78 74 2d 3e     pHdr->pNext->
26d0: 70 50 72 65 76 20 3d 20 70 48 64 72 2d 3e 70 50  pPrev = pHdr->pP
26e0: 72 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rev;.  }else{.  
26f0: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 70 4c    assert( mem.pL
2700: 61 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20 20 20  ast==pHdr );.   
2710: 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70 48 64   mem.pLast = pHd
2720: 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  r->pPrev;.  }.  
2730: 7a 20 3d 20 28 63 68 61 72 2a 29 70 42 74 3b 0a  z = (char*)pBt;.
2740: 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 54 69    z -= pHdr->nTi
2750: 74 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 2c  tle;.  memset(z,
2760: 20 30 78 32 62 2c 20 73 69 7a 65 6f 66 28 76 6f   0x2b, sizeof(vo
2770: 69 64 2a 29 2a 70 48 64 72 2d 3e 6e 42 61 63 6b  id*)*pHdr->nBack
2780: 74 72 61 63 65 53 6c 6f 74 73 20 2b 20 73 69 7a  traceSlots + siz
2790: 65 6f 66 28 2a 70 48 64 72 29 20 2b 0a 20 20 20  eof(*pHdr) +.   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27b0: 48 64 72 2d 3e 69 53 69 7a 65 20 2b 20 73 69 7a  Hdr->iSize + siz
27c0: 65 6f 66 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  eof(unsigned int
27d0: 29 20 2b 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65  ) + pHdr->nTitle
27e0: 29 3b 0a 20 20 66 72 65 65 28 7a 29 3b 0a 20 20  );.  free(z);.  
27f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2800: 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 20  ave(mem.mutex); 
2810: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   .}../*.** Chang
2820: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  e the size of an
2830: 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79   existing memory
2840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   allocation..**.
2850: 2a 2a 20 46 6f 72 20 74 68 69 73 20 64 65 62 75  ** For this debu
2860: 67 67 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  gging implementa
2870: 74 69 6f 6e 2c 20 77 65 20 2a 61 6c 77 61 79 73  tion, we *always
2880: 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * make a copy of
2890: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
28a0: 6f 6e 20 69 6e 74 6f 20 61 20 6e 65 77 20 70 6c  on into a new pl
28b0: 61 63 65 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ace in memory.  
28c0: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
28d0: 74 68 65 20 0a 2a 2a 20 68 69 67 68 65 72 20 6c  the .** higher l
28e0: 65 76 65 6c 20 63 6f 64 65 20 69 73 20 75 73 69  evel code is usi
28f0: 6e 67 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ng pointer to th
2900: 65 20 6f 6c 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  e old allocation
2910: 2c 20 69 74 20 69 73 20 0a 2a 2a 20 6d 75 63 68  , it is .** much
2920: 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74 6f 20   more likely to 
2930: 62 72 65 61 6b 20 61 6e 64 20 77 65 20 61 72 65  break and we are
2940: 20 6d 75 63 68 20 6d 6f 72 65 20 6c 69 6b 69 6e   much more likin
2950: 67 20 74 6f 20 66 69 6e 64 0a 2a 2a 20 74 68 65  g to find.** the
2960: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20   error..*/.void 
2970: 2a 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  *sqlite3_realloc
2980: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
2990: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 73 74 72  nt nByte){.  str
29a0: 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20  uct MemBlockHdr 
29b0: 2a 70 4f 6c 64 48 64 72 3b 0a 20 20 76 6f 69 64  *pOldHdr;.  void
29c0: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 50   *pNew;.  if( pP
29d0: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rior==0 ){.    r
29e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 61  eturn sqlite3_ma
29f0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d  lloc(nByte);.  }
2a00: 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 30 20  .  if( nByte<=0 
2a10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2a20: 72 65 65 28 70 50 72 69 6f 72 29 3b 0a 20 20 20  ree(pPrior);.   
2a30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2a40: 20 61 73 73 65 72 74 28 20 6d 65 6d 2e 64 69 73   assert( mem.dis
2a50: 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 4f  allow==0 );.  pO
2a60: 6c 64 48 64 72 20 3d 20 73 71 6c 69 74 65 33 4d  ldHdr = sqlite3M
2a70: 65 6d 73 79 73 47 65 74 48 65 61 64 65 72 28 70  emsysGetHeader(p
2a80: 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 20 3d  Prior);.  pNew =
2a90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2aa0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70 4e  nByte);.  if( pN
2ab0: 65 77 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ew ){.    memcpy
2ac0: 28 70 4e 65 77 2c 20 70 50 72 69 6f 72 2c 20 6e  (pNew, pPrior, n
2ad0: 42 79 74 65 3c 70 4f 6c 64 48 64 72 2d 3e 69 53  Byte<pOldHdr->iS
2ae0: 69 7a 65 20 3f 20 6e 42 79 74 65 20 3a 20 70 4f  ize ? nByte : pO
2af0: 6c 64 48 64 72 2d 3e 69 53 69 7a 65 29 3b 0a 20  ldHdr->iSize);. 
2b00: 20 20 20 69 66 28 20 6e 42 79 74 65 3e 70 4f 6c     if( nByte>pOl
2b10: 64 48 64 72 2d 3e 69 53 69 7a 65 20 29 7b 0a 20  dHdr->iSize ){. 
2b20: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63       memset(&((c
2b30: 68 61 72 2a 29 70 4e 65 77 29 5b 70 4f 6c 64 48  har*)pNew)[pOldH
2b40: 64 72 2d 3e 69 53 69 7a 65 5d 2c 20 30 78 32 62  dr->iSize], 0x2b
2b50: 2c 20 6e 42 79 74 65 20 2d 20 70 4f 6c 64 48 64  , nByte - pOldHd
2b60: 72 2d 3e 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d  r->iSize);.    }
2b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b80: 65 28 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  e(pPrior);.  }. 
2b90: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
2ba0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
2bb0: 75 6d 62 65 72 20 6f 66 20 62 61 63 6b 74 72 61  umber of backtra
2bc0: 63 65 20 6c 65 76 65 6c 73 20 6b 65 70 74 20 66  ce levels kept f
2bd0: 6f 72 20 65 61 63 68 20 61 6c 6c 6f 63 61 74 69  or each allocati
2be0: 6f 6e 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  on..** A value o
2bf0: 66 20 7a 65 72 6f 20 74 75 72 6e 73 20 6f 66 20  f zero turns of 
2c00: 62 61 63 6b 74 72 61 63 69 6e 67 2e 20 20 54 68  backtracing.  Th
2c10: 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61  e number is alwa
2c20: 79 73 20 72 6f 75 6e 64 65 64 0a 2a 2a 20 75 70  ys rounded.** up
2c30: 20 74 6f 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f   to a multiple o
2c40: 66 20 32 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f 2..*/.void sql
2c50: 69 74 65 33 5f 6d 65 6d 64 65 62 75 67 5f 62 61  ite3_memdebug_ba
2c60: 63 6b 74 72 61 63 65 28 69 6e 74 20 64 65 70 74  cktrace(int dept
2c70: 68 29 7b 0a 20 20 69 66 28 20 64 65 70 74 68 3c  h){.  if( depth<
2c80: 30 20 29 7b 20 64 65 70 74 68 20 3d 20 30 3b 20  0 ){ depth = 0; 
2c90: 7d 0a 20 20 69 66 28 20 64 65 70 74 68 3e 32 30  }.  if( depth>20
2ca0: 20 29 7b 20 64 65 70 74 68 20 3d 20 32 30 3b 20   ){ depth = 20; 
2cb0: 7d 0a 20 20 64 65 70 74 68 20 3d 20 28 64 65 70  }.  depth = (dep
2cc0: 74 68 2b 31 29 26 30 78 66 65 3b 0a 20 20 6d 65  th+1)&0xfe;.  me
2cd0: 6d 2e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 64  m.nBacktrace = d
2ce0: 65 70 74 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  epth;.}../*.** S
2cf0: 65 74 20 74 68 65 20 74 69 74 6c 65 20 73 74 72  et the title str
2d00: 69 6e 67 20 66 6f 72 20 73 75 62 73 65 71 75 65  ing for subseque
2d10: 6e 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 0a  nt allocations..
2d20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
2d30: 6d 65 6d 64 65 62 75 67 5f 73 65 74 74 69 74 6c  memdebug_settitl
2d40: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
2d50: 69 74 6c 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  itle){.  int n =
2d60: 20 73 74 72 6c 65 6e 28 7a 54 69 74 6c 65 29 20   strlen(zTitle) 
2d70: 2b 20 31 3b 0a 20 20 69 66 28 20 6d 65 6d 2e 6d  + 1;.  if( mem.m
2d80: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  utex==0 ){.    m
2d90: 65 6d 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  em.mutex = sqlit
2da0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
2db0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2dc0: 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 73  IC_MEM);.  }.  s
2dd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2de0: 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b 0a 20  er(mem.mutex);. 
2df0: 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 6d   if( n>=sizeof(m
2e00: 65 6d 2e 7a 54 69 74 6c 65 29 20 29 20 6e 20 3d  em.zTitle) ) n =
2e10: 20 73 69 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69 74   sizeof(mem.zTit
2e20: 6c 65 29 2d 31 3b 0a 20 20 6d 65 6d 63 70 79 28  le)-1;.  memcpy(
2e30: 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 7a 54 69 74  mem.zTitle, zTit
2e40: 6c 65 2c 20 6e 29 3b 0a 20 20 6d 65 6d 2e 7a 54  le, n);.  mem.zT
2e50: 69 74 6c 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 6d  itle[n] = 0;.  m
2e60: 65 6d 2e 6e 54 69 74 6c 65 20 3d 20 28 6e 2b 33  em.nTitle = (n+3
2e70: 29 26 7e 33 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )&~3;.  sqlite3_
2e80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e  mutex_leave(mem.
2e90: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mutex);.}../*.**
2ea0: 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 69   Open the file i
2eb0: 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77 72 69  ndicated and wri
2ec0: 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c 6c 20  te a log of all 
2ed0: 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 0a  unfreed memory .
2ee0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69  ** allocations i
2ef0: 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a 2a 2f  nto that log..*/
2f00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 65  .void sqlite3_me
2f10: 6d 64 65 62 75 67 5f 64 75 6d 70 28 63 6f 6e 73  mdebug_dump(cons
2f20: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2f30: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b  e){.  FILE *out;
2f40: 0a 20 20 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f  .  struct MemBlo
2f50: 63 6b 48 64 72 20 2a 70 48 64 72 3b 0a 20 20 76  ckHdr *pHdr;.  v
2f60: 6f 69 64 20 2a 2a 70 42 74 3b 0a 20 20 6f 75 74  oid **pBt;.  out
2f70: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61   = fopen(zFilena
2f80: 6d 65 2c 20 22 77 22 29 3b 0a 20 20 69 66 28 20  me, "w");.  if( 
2f90: 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  out==0 ){.    fp
2fa0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2a  rintf(stderr, "*
2fb0: 2a 20 55 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70  * Unable to outp
2fc0: 75 74 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 20  ut memory debug 
2fd0: 6f 75 74 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a  output log: %s *
2fe0: 2a 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  *\n",.          
2ff0: 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
3000: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
3010: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 48 64 72  ;.  }.  for(pHdr
3020: 3d 6d 65 6d 2e 70 46 69 72 73 74 3b 20 70 48 64  =mem.pFirst; pHd
3030: 72 3b 20 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e  r; pHdr=pHdr->pN
3040: 65 78 74 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ext){.    char *
3050: 7a 20 3d 20 28 63 68 61 72 2a 29 70 48 64 72 3b  z = (char*)pHdr;
3060: 0a 20 20 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e  .    z -= pHdr->
3070: 6e 42 61 63 6b 74 72 61 63 65 53 6c 6f 74 73 2a  nBacktraceSlots*
3080: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20  sizeof(void*) + 
3090: 70 48 64 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20 20  pHdr->nTitle;.  
30a0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
30b0: 2a 2a 2a 2a 20 25 64 20 62 79 74 65 73 20 61 74  **** %d bytes at
30c0: 20 25 70 20 66 72 6f 6d 20 25 73 20 2a 2a 2a 2a   %p from %s ****
30d0: 5c 6e 22 2c 20 70 48 64 72 2d 3e 69 53 69 7a 65  \n", pHdr->iSize
30e0: 2c 26 70 48 64 72 5b 31 5d 2c 7a 29 3b 0a 20 20  ,&pHdr[1],z);.  
30f0: 20 20 69 66 28 20 70 48 64 72 2d 3e 6e 42 61 63    if( pHdr->nBac
3100: 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  ktrace ){.      
3110: 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20 20  fflush(out);.   
3120: 20 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a     pBt = (void**
3130: 29 70 48 64 72 3b 0a 20 20 20 20 20 20 70 42 74  )pHdr;.      pBt
3140: 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74   -= pHdr->nBackt
3150: 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20 20 20 20  raceSlots;.     
3160: 20 62 61 63 6b 74 72 61 63 65 5f 73 79 6d 62 6f   backtrace_symbo
3170: 6c 73 5f 66 64 28 70 42 74 2c 20 70 48 64 72 2d  ls_fd(pBt, pHdr-
3180: 3e 6e 42 61 63 6b 74 72 61 63 65 2c 20 66 69 6c  >nBacktrace, fil
3190: 65 6e 6f 28 6f 75 74 29 29 3b 0a 20 20 20 20 20  eno(out));.     
31a0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
31b0: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n");.    }.  }. 
31c0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a   fclose(out);.}.
31d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
31e0: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 73  ine is used to s
31f0: 69 6d 75 6c 61 74 65 20 6d 61 6c 6c 6f 63 20 66  imulate malloc f
3200: 61 69 6c 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  ailures..**.** A
3210: 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 74 68 69  fter calling thi
3220: 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
3230: 20 77 69 6c 6c 20 62 65 20 69 46 61 69 6c 20 73   will be iFail s
3240: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6d 65 6d  uccessful.** mem
3250: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
3260: 61 6e 64 20 74 68 65 6e 20 61 20 66 61 69 6c 75  and then a failu
3270: 72 65 2e 20 20 49 66 20 69 52 65 70 65 61 74 20  re.  If iRepeat 
3280: 69 73 20 31 0a 2a 2a 20 61 6c 6c 20 73 75 62 73  is 1.** all subs
3290: 65 71 75 65 6e 74 20 6d 65 6d 6f 72 79 20 61 6c  equent memory al
32a0: 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 66  locations will f
32b0: 61 69 6c 2e 20 20 49 66 20 69 52 65 70 65 61 74  ail.  If iRepeat
32c0: 20 69 73 0a 2a 2a 20 30 2c 20 6f 6e 6c 79 20 61   is.** 0, only a
32d0: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
32e0: 6f 6e 20 77 69 6c 6c 20 66 61 69 6c 2e 20 20 49  on will fail.  I
32f0: 66 20 69 52 65 70 65 61 74 20 69 73 20 6e 65 67  f iRepeat is neg
3300: 61 74 69 76 65 0a 2a 2a 20 74 68 65 6e 20 74 68  ative.** then th
3310: 65 20 70 72 65 76 69 6f 75 73 20 73 65 74 74 69  e previous setti
3320: 6e 67 20 66 6f 72 20 69 52 65 70 65 61 74 20 69  ng for iRepeat i
3330: 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
3340: 2a 2a 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  ** Each call to 
3350: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 76 65  this routine ove
3360: 72 72 69 64 65 73 20 74 68 65 20 70 72 65 76 69  rrides the previ
3370: 6f 75 73 2e 20 20 54 6f 20 64 69 73 61 62 6c 65  ous.  To disable
3380: 0a 2a 2a 20 74 68 65 20 73 69 6d 75 6c 61 74 65  .** the simulate
3390: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  d allocation fai
33a0: 6c 75 72 65 20 6d 65 63 68 61 6e 69 73 6d 2c 20  lure mechanism, 
33b0: 73 65 74 20 69 46 61 69 6c 20 74 6f 20 2d 31 2e  set iFail to -1.
33c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
33d0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
33e0: 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 61  number of simula
33f0: 74 65 64 20 66 61 69 6c 75 72 65 73 20 74 68 61  ted failures tha
3400: 74 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  t have.** occurr
3410: 65 64 20 73 69 6e 63 65 20 74 68 65 20 70 72 65  ed since the pre
3420: 76 69 6f 75 73 20 63 61 6c 6c 2e 0a 2a 2f 0a 69  vious call..*/.i
3430: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65  nt sqlite3_memde
3440: 62 75 67 5f 66 61 69 6c 28 69 6e 74 20 69 46 61  bug_fail(int iFa
3450: 69 6c 2c 20 69 6e 74 20 69 52 65 70 65 61 74 29  il, int iRepeat)
3460: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 6d 65 6d 2e  {.  int n = mem.
3470: 69 46 61 69 6c 43 6e 74 3b 0a 20 20 6d 65 6d 2e  iFailCnt;.  mem.
3480: 69 46 61 69 6c 20 3d 20 69 46 61 69 6c 2b 31 3b  iFail = iFail+1;
3490: 0a 20 20 69 66 28 20 69 52 65 70 65 61 74 3e 3d  .  if( iRepeat>=
34a0: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 2e 69 52 65  0 ){.    mem.iRe
34b0: 73 65 74 20 3d 20 69 52 65 70 65 61 74 3b 0a 20  set = iRepeat;. 
34c0: 20 7d 0a 20 20 6d 65 6d 2e 69 46 61 69 6c 43 6e   }.  mem.iFailCn
34d0: 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
34e0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
34f0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
3500: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
3510: 75 63 63 65 73 73 66 75 6c 20 6d 61 6c 6c 6f 63  uccessful malloc
3520: 73 20 72 65 6d 61 69 6e 69 6e 67 20 75 6e 74 69  s remaining unti
3530: 6c 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 73 69  l.** the next si
3540: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 20 66  mulated malloc f
3550: 61 69 6c 75 72 65 2e 20 20 2d 31 20 69 73 20 72  ailure.  -1 is r
3560: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 73 69  eturned if no si
3570: 6d 75 6c 61 74 65 64 0a 2a 2a 20 66 61 69 6c 75  mulated.** failu
3580: 72 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  re is currently 
3590: 73 63 68 65 64 75 6c 65 64 2e 0a 2a 2f 0a 69 6e  scheduled..*/.in
35a0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62  t sqlite3_memdeb
35b0: 75 67 5f 70 65 6e 64 69 6e 67 28 76 6f 69 64 29  ug_pending(void)
35c0: 7b 0a 20 20 72 65 74 75 72 6e 20 6d 65 6d 2e 69  {.  return mem.i
35d0: 46 61 69 6c 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Fail-1;.}../*.**
35e0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
35f0: 77 6f 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  wo routines are 
3600: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 20 74  used to assert t
3610: 68 61 74 20 6e 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  hat no memory.**
3620: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 63 63   allocations occ
3630: 75 72 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 63  ur between one c
3640: 61 6c 6c 20 61 6e 64 20 74 68 65 20 6e 65 78 74  all and the next
3650: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 0a 2a 2a  .  The use of.**
3660: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
3670: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
3680: 74 68 65 20 63 6f 6d 70 75 74 65 64 20 72 65 73  the computed res
3690: 75 6c 74 73 20 69 6e 20 61 6e 79 20 77 61 79 2e  ults in any way.
36a0: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
36b0: 65 73 20 61 72 65 20 6c 69 6b 65 20 61 73 73 65  es are like asse
36c0: 72 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rts..*/.void sql
36d0: 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c  ite3MallocDisall
36e0: 6f 77 28 76 6f 69 64 29 7b 0a 20 20 61 73 73 65  ow(void){.  asse
36f0: 72 74 28 20 6d 65 6d 2e 6d 75 74 65 78 21 3d 30  rt( mem.mutex!=0
3700: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
3710: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75  tex_enter(mem.mu
3720: 74 65 78 29 3b 0a 20 20 6d 65 6d 2e 64 69 73 61  tex);.  mem.disa
3730: 6c 6c 6f 77 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  llow++;.  sqlite
3740: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
3750: 6d 2e 6d 75 74 65 78 29 3b 0a 7d 0a 76 6f 69 64  m.mutex);.}.void
3760: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c   sqlite3MallocAl
3770: 6c 6f 77 28 76 6f 69 64 29 7b 0a 20 20 61 73 73  low(void){.  ass
3780: 65 72 74 28 20 6d 65 6d 2e 6d 75 74 65 78 20 29  ert( mem.mutex )
3790: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
37a0: 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65  x_enter(mem.mute
37b0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65  x);.  assert( me
37c0: 6d 2e 64 69 73 61 6c 6c 6f 77 3e 30 20 29 3b 0a  m.disallow>0 );.
37d0: 20 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 2d 2d    mem.disallow--
37e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
37f0: 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65  x_leave(mem.mute
3800: 78 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  x);.}..#endif /*
3810: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
3820: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
3830: 5f 4d 45 4d 4f 52 59 5f 41 4c 4c 4f 43 41 54 49  _MEMORY_ALLOCATI
3840: 4f 4e 20 2a 2f 0a                                ON */.