/ Hex Artifact Content
Login

Artifact b97b4662bf5902cbde0a849c4739e64ce7b07177:


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 31 33 20 32 30 30 37 2f 30 39 2f  ,v 1.13 2007/09/
0200: 30 31 20 30 39 3a 30 32 3a 35 34 20 64 61 6e 69  01 09:02:54 dani
0210: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f  elk1977 Exp $.*/
0220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ../*.** This ver
0230: 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f  sion of the memo
0240: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  ry allocator is 
0250: 75 73 65 64 20 6f 6e 6c 79 20 69 66 20 74 68 65  used only if the
0260: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  .** SQLITE_MEMDE
0270: 42 55 47 20 6d 61 63 72 6f 20 69 73 20 64 65 66  BUG macro is def
0280: 69 6e 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  ined and SQLITE_
0290: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 41 4c 4c 4f  OMIT_MEMORY_ALLO
02a0: 43 41 54 49 4f 4e 0a 2a 2a 20 69 73 20 6e 6f 74  CATION.** is not
02b0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
02c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
02d0: 4d 45 4d 44 45 42 55 47 29 20 26 26 20 21 64 65  MEMDEBUG) && !de
02e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
02f0: 54 5f 4d 45 4d 4f 52 59 5f 41 4c 4c 4f 43 41 54  T_MEMORY_ALLOCAT
0300: 49 4f 4e 29 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 77  ION)../*.** We w
0310: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
0320: 6f 6e 73 74 72 75 63 74 20 6d 75 6c 74 69 70 6c  onstruct multipl
0330: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
0340: 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 73 0a 2a  ion subsystems.*
0350: 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 75  * suitable for u
0360: 73 65 20 69 6e 20 76 61 72 69 6f 75 73 20 63 6f  se in various co
0370: 6e 74 65 78 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ntexts:.**.**   
0380: 20 2a 20 20 4e 6f 72 6d 61 6c 20 6d 75 6c 74 69   *  Normal multi
0390: 2d 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73  -threaded builds
03a0: 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 72 6d 61 6c  .**    *  Normal
03b0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
03c0: 20 62 75 69 6c 64 73 0a 2a 2a 20 20 20 20 2a 20   builds.**    * 
03d0: 20 44 65 62 75 67 67 69 6e 67 20 62 75 69 6c 64   Debugging build
03e0: 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  s.**.** This ver
03f0: 73 69 6f 6e 20 69 73 20 73 75 69 74 61 62 6c 65  sion is suitable
0400: 20 66 6f 72 20 75 73 65 20 69 6e 20 64 65 62 75   for use in debu
0410: 67 67 69 6e 67 20 62 75 69 6c 64 73 2e 0a 2a 2a  gging builds..**
0420: 0a 2a 2a 20 46 65 61 74 75 72 65 73 3a 0a 2a 2a  .** Features:.**
0430: 0a 2a 2a 20 20 20 20 2a 20 45 76 65 72 79 20 61  .**    * Every a
0440: 6c 6c 6f 63 61 74 65 20 68 61 73 20 67 75 61 72  llocate has guar
0450: 64 73 20 61 74 20 62 6f 74 68 20 65 6e 64 73 2e  ds at both ends.
0460: 0a 2a 2a 20 20 20 20 2a 20 4e 65 77 20 61 6c 6c  .**    * New all
0470: 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 69  ocations are ini
0480: 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20 72 61  tialized with ra
0490: 6e 64 6f 6d 6e 65 73 73 0a 2a 2a 20 20 20 20 2a  ndomness.**    *
04a0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65   Allocations are
04b0: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
04c0: 68 20 72 61 6e 64 6f 6d 6e 65 73 73 20 77 68 65  h randomness whe
04d0: 6e 20 66 72 65 65 64 0a 2a 2a 20 20 20 20 2a 20  n freed.**    * 
04e0: 4f 70 74 69 6f 6e 61 6c 20 6c 6f 67 73 20 6f 66  Optional logs of
04f0: 20 6d 61 6c 6c 6f 63 20 61 63 74 69 76 69 74 79   malloc activity
0500: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20   generated.**   
0510: 20 2a 20 53 75 6d 6d 61 72 79 20 6f 66 20 6f 75   * Summary of ou
0520: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
0530: 74 69 6f 6e 73 20 77 69 74 68 20 62 61 63 6b 74  tions with backt
0540: 72 61 63 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  races to the.** 
0550: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 61 6c       point of al
0560: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20  location..**    
0570: 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f  * The ability to
0580: 20 73 69 6d 75 6c 61 74 65 20 6d 65 6d 6f 72 79   simulate memory
0590: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
05a0: 75 72 65 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ure.*/.#include 
05b0: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
05c0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
05d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b  ../*.** The back
05e0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 61 6c  trace functional
05f0: 69 74 79 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ity is only avai
0600: 6c 61 62 6c 65 20 77 69 74 68 20 47 4c 49 42 43  lable with GLIBC
0610: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 47 4c 49  .*/.#ifdef __GLI
0620: 42 43 5f 5f 0a 20 20 65 78 74 65 72 6e 20 69 6e  BC__.  extern in
0630: 74 20 62 61 63 6b 74 72 61 63 65 28 76 6f 69 64  t backtrace(void
0640: 2a 2a 2c 69 6e 74 29 3b 0a 20 20 65 78 74 65 72  **,int);.  exter
0650: 6e 20 76 6f 69 64 20 62 61 63 6b 74 72 61 63 65  n void backtrace
0660: 5f 73 79 6d 62 6f 6c 73 5f 66 64 28 76 6f 69 64  _symbols_fd(void
0670: 2a 63 6f 6e 73 74 2a 2c 69 6e 74 2c 69 6e 74 29  *const*,int,int)
0680: 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
0690: 20 62 61 63 6b 74 72 61 63 65 28 41 2c 42 29 20   backtrace(A,B) 
06a0: 30 0a 23 20 64 65 66 69 6e 65 20 62 61 63 6b 74  0.# define backt
06b0: 72 61 63 65 5f 73 79 6d 62 6f 6c 73 5f 66 64 28  race_symbols_fd(
06c0: 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f  A,B,C).#endif../
06d0: 2a 0a 2a 2a 20 45 61 63 68 20 6d 65 6d 6f 72 79  *.** Each memory
06e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 6f 6f 6b   allocation look
06f0: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
0700: 2a 2a 20 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
0750: 20 7c 20 54 69 74 6c 65 20 7c 20 20 62 61 63 6b   | Title |  back
0760: 74 72 61 63 65 20 70 6f 69 6e 74 65 72 73 20 7c  trace pointers |
0770: 20 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 20 7c 20    MemBlockHdr | 
0780: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 7c 20 20 45   allocation |  E
0790: 6e 64 47 75 61 72 64 20 7c 0a 2a 2a 20 20 2d 2d  ndGuard |.**  --
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 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 54 68 65  ------.**.** The
07f0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 6f 64   application cod
0800: 65 20 73 65 65 73 20 6f 6e 6c 79 20 61 20 70 6f  e sees only a po
0810: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
0820: 6f 63 61 74 69 6f 6e 2e 20 20 57 65 20 68 61 76  ocation.  We hav
0830: 65 0a 2a 2a 20 74 6f 20 62 61 63 6b 20 75 70 20  e.** to back up 
0840: 66 72 6f 6d 20 74 68 65 20 61 6c 6c 6f 63 61 74  from the allocat
0850: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 6f 20 66  ion pointer to f
0860: 69 6e 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b  ind the MemBlock
0870: 48 64 72 2e 20 20 54 68 65 0a 2a 2a 20 4d 65 6d  Hdr.  The.** Mem
0880: 42 6c 6f 63 6b 48 64 72 20 74 65 6c 6c 73 20 75  BlockHdr tells u
0890: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
08a0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64  e allocation and
08b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
08c0: 2a 20 62 61 63 6b 74 72 61 63 65 20 70 6f 69 6e  * backtrace poin
08d0: 74 65 72 73 2e 20 20 54 68 65 72 65 20 69 73 20  ters.  There is 
08e0: 61 6c 73 6f 20 61 20 67 75 61 72 64 20 77 6f 72  also a guard wor
08f0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
0900: 74 68 65 0a 2a 2a 20 4d 65 6d 42 6c 6f 63 6b 48  the.** MemBlockH
0910: 64 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 65  dr..*/.struct Me
0920: 6d 42 6c 6f 63 6b 48 64 72 20 7b 0a 20 20 73 74  mBlockHdr {.  st
0930: 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72  ruct MemBlockHdr
0940: 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b   *pNext, *pPrev;
0950: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
0960: 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65 64 20   of all unfreed 
0970: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  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 20 20 20 20 20 20 20 20 20                  
09a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69 73 20  /* Size of this 
09b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
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 20 20 20 20 20                  
09e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
09f0: 20 62 61 63 6b 74 72 61 63 65 73 20 6f 6e 20 74   backtraces on t
0a00: 68 69 73 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63  his alloc */.  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 20 20 20 20 20 20  ots;            
0a30: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
0a40: 62 61 63 6b 74 72 61 63 65 20 73 6c 6f 74 73 20  backtrace slots 
0a50: 2a 2f 0a 20 20 73 68 6f 72 74 20 6e 54 69 74 6c  */.  short nTitl
0a60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
0a80: 73 20 6f 66 20 74 69 74 6c 65 3b 20 69 6e 63 6c  s of title; incl
0a90: 75 64 65 73 20 27 5c 30 27 20 2a 2f 0a 20 20 69  udes '\0' */.  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 20 20 20 20 20 20                  
0ac0: 20 20 20 2f 2a 20 47 75 61 72 64 20 77 6f 72 64     /* Guard word
0ad0: 20 66 6f 72 20 73 61 6e 69 74 79 20 2a 2f 0a 7d   for sanity */.}
0ae0: 3b 0a 0a 2f 2a 0a 2a 2a 20 47 75 61 72 64 20 77  ;../*.** Guard w
0af0: 6f 72 64 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ords.*/.#define 
0b00: 46 4f 52 45 47 55 41 52 44 20 30 78 38 30 46 35  FOREGUARD 0x80F5
0b10: 45 31 35 33 0a 23 64 65 66 69 6e 65 20 52 45 41  E153.#define REA
0b20: 52 47 55 41 52 44 20 30 78 45 34 36 37 36 42 35  RGUARD 0xE4676B5
0b30: 33 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  3../*.** All of 
0b40: 74 68 65 20 73 74 61 74 69 63 20 76 61 72 69 61  the static varia
0b50: 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 69  bles used by thi
0b60: 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c  s module are col
0b70: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  lected.** into a
0b80: 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75 72   single structur
0b90: 65 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e 20 20  e named "mem".  
0ba0: 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65 70 20  This is to keep 
0bb0: 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20 76 61  the.** static va
0bc0: 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65  riables organize
0bd0: 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63 65 20  d and to reduce 
0be0: 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75 74  namespace pollut
0bf0: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ion.** when this
0c00: 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 69   module is combi
0c10: 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72 20 69  ned with other i
0c20: 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  n the amalgamati
0c30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  on..*/.static st
0c40: 72 75 63 74 20 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  ruct {.  /*.  **
0c50: 20 54 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62   The alarm callb
0c60: 61 63 6b 20 61 6e 64 20 69 74 73 20 61 72 67 75  ack and its argu
0c70: 6d 65 6e 74 73 2e 20 20 54 68 65 20 6d 65 6d 2e  ments.  The mem.
0c80: 6d 75 74 65 78 20 6c 6f 63 6b 20 77 69 6c 6c 0a  mutex lock will.
0c90: 20 20 2a 2a 20 62 65 20 68 65 6c 64 20 77 68 69    ** be held whi
0ca0: 6c 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  le the callback 
0cb0: 69 73 20 72 75 6e 6e 69 6e 67 2e 20 20 52 65 63  is running.  Rec
0cc0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
0cd0: 6f 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  o.  ** the memor
0ce0: 79 20 73 75 62 73 79 73 74 65 6d 20 61 72 65 20  y subsystem are 
0cf0: 61 6c 6c 6f 77 65 64 2c 20 62 75 74 20 6e 6f 20  allowed, but no 
0d00: 6e 65 77 20 63 61 6c 6c 62 61 63 6b 73 20 77 69  new callbacks wi
0d10: 6c 6c 20 62 65 0a 20 20 2a 2a 20 69 73 73 75 65  ll be.  ** issue
0d20: 64 2e 20 20 54 68 65 20 61 6c 61 72 6d 42 75 73  d.  The alarmBus
0d30: 79 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  y variable is se
0d40: 74 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 63  t to prevent rec
0d50: 75 72 73 69 76 65 0a 20 20 2a 2a 20 63 61 6c 6c  ursive.  ** call
0d60: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
0d70: 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6c 61 72  lite3_int64 alar
0d80: 6d 54 68 72 65 73 68 6f 6c 64 3b 0a 20 20 76 6f  mThreshold;.  vo
0d90: 69 64 20 28 2a 61 6c 61 72 6d 43 61 6c 6c 62 61  id (*alarmCallba
0da0: 63 6b 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74  ck)(void*, sqlit
0db0: 65 33 5f 69 6e 74 36 34 2c 20 69 6e 74 29 3b 0a  e3_int64, int);.
0dc0: 20 20 76 6f 69 64 20 2a 61 6c 61 72 6d 41 72 67    void *alarmArg
0dd0: 3b 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42 75 73  ;.  int alarmBus
0de0: 79 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y;.  .  /*.  ** 
0df0: 4d 75 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c  Mutex to control
0e00: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d   access to the m
0e10: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0e20: 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f   subsystem..  */
0e30: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
0e40: 20 2a 6d 75 74 65 78 3b 0a 20 20 0a 20 20 2f 2a   *mutex;.  .  /*
0e50: 0a 20 20 2a 2a 20 43 75 72 72 65 6e 74 20 61 6c  .  ** Current al
0e60: 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20 68 69 67  location and hig
0e70: 68 2d 77 61 74 65 72 20 6d 61 72 6b 2e 0a 20 20  h-water mark..  
0e80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
0e90: 36 34 20 6e 6f 77 55 73 65 64 3b 0a 20 20 73 71  64 nowUsed;.  sq
0ea0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 55 73  lite3_int64 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 20   int iFailCnt;  
1180: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1190: 20 6f 66 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a   of failures */.
11a0: 20 20 69 6e 74 20 69 42 65 6e 69 67 6e 46 61 69    int iBenignFai
11b0: 6c 43 6e 74 3b 20 20 20 2f 2a 20 4e 75 6d 62 65  lCnt;   /* Numbe
11c0: 72 20 6f 66 20 62 65 6e 69 67 6e 20 66 61 69 6c  r of benign fail
11d0: 75 72 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  ures */.  int iN
11e0: 65 78 74 49 73 42 65 6e 69 67 6e 3b 20 20 20 20  extIsBenign;    
11f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6e  /* True if the n
1200: 65 78 74 20 63 61 6c 6c 20 74 6f 20 6d 61 6c 6c  ext call to mall
1210: 6f 63 20 6d 61 79 20 66 61 69 6c 20 62 65 6e 69  oc may fail beni
1220: 67 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 0a 20  gnly */..  /* . 
1230: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   ** sqlite3Mallo
1240: 63 44 69 73 61 6c 6c 6f 77 28 29 20 69 6e 63 72  cDisallow() incr
1250: 65 6d 65 6e 74 73 20 74 68 65 20 66 6f 6c 6c 6f  ements the follo
1260: 77 69 6e 67 20 63 6f 75 6e 74 65 72 2e 0a 20 20  wing counter..  
1270: 2a 2a 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ** sqlite3Malloc
1280: 41 6c 6c 6f 77 28 29 20 64 65 63 72 65 6d 65 6e  Allow() decremen
1290: 74 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ts it..  */.  in
12a0: 74 20 64 69 73 61 6c 6c 6f 77 3b 20 2f 2a 20 44  t disallow; /* D
12b0: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 6d 65 6d 6f  o not allow memo
12c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  ry allocation */
12d0: 0a 20 20 0a 20 20 0a 7d 20 6d 65 6d 3b 0a 0a 0a  .  .  .} mem;...
12e0: 2f 2a 0a 2a 2a 20 45 6e 74 65 72 20 74 68 65 20  /*.** Enter the 
12f0: 6d 75 74 65 78 20 6d 65 6d 2e 6d 75 74 65 78 2e  mutex mem.mutex.
1300: 20 41 6c 6c 6f 63 61 74 65 20 69 74 20 69 66 20   Allocate it if 
1310: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1320: 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  y allocated..*/.
1330: 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 74 65  static void ente
1340: 72 4d 65 6d 28 76 6f 69 64 29 7b 0a 20 20 69 66  rMem(void){.  if
1350: 28 20 6d 65 6d 2e 6d 75 74 65 78 3d 3d 30 20 29  ( mem.mutex==0 )
1360: 7b 0a 20 20 20 20 6d 65 6d 2e 6d 75 74 65 78 20  {.    mem.mutex 
1370: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1380: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1390: 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 0a  EX_STATIC_MEM);.
13a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
13b0: 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75  tex_enter(mem.mu
13c0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tex);.}../*.** R
13d0: 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
13e0: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65   of memory curre
13f0: 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f 75 74  ntly checked out
1400: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1410: 36 34 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  64 sqlite3_memor
1420: 79 5f 75 73 65 64 28 76 6f 69 64 29 7b 0a 20 20  y_used(void){.  
1430: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b  sqlite3_int64 n;
1440: 0a 20 20 65 6e 74 65 72 4d 65 6d 28 29 3b 0a 20  .  enterMem();. 
1450: 20 6e 20 3d 20 6d 65 6d 2e 6e 6f 77 55 73 65 64   n = mem.nowUsed
1460: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1470: 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65  x_leave(mem.mute
1480: 78 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e  x);  .  return n
1490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14a0: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  n the maximum am
14b0: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ount of memory t
14c0: 68 61 74 20 68 61 73 20 65 76 65 72 20 62 65 65  hat has ever bee
14d0: 6e 0a 2a 2a 20 63 68 65 63 6b 65 64 20 6f 75 74  n.** checked out
14e0: 20 73 69 6e 63 65 20 65 69 74 68 65 72 20 74 68   since either th
14f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1500: 68 69 73 20 70 72 6f 63 65 73 73 0a 2a 2a 20 6f  his process.** o
1510: 72 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  r since the most
1520: 20 72 65 63 65 6e 74 20 72 65 73 65 74 2e 0a 2a   recent reset..*
1530: 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1540: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
1550: 69 67 68 77 61 74 65 72 28 69 6e 74 20 72 65 73  ighwater(int res
1560: 65 74 46 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  etFlag){.  sqlit
1570: 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 20 20 65 6e  e3_int64 n;.  en
1580: 74 65 72 4d 65 6d 28 29 3b 0a 20 20 6e 20 3d 20  terMem();.  n = 
1590: 6d 65 6d 2e 6d 78 55 73 65 64 3b 0a 20 20 69 66  mem.mxUsed;.  if
15a0: 28 20 72 65 73 65 74 46 6c 61 67 20 29 7b 0a 20  ( resetFlag ){. 
15b0: 20 20 20 6d 65 6d 2e 6d 78 55 73 65 64 20 3d 20     mem.mxUsed = 
15c0: 6d 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20 7d  mem.nowUsed;.  }
15d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15e0: 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78  _leave(mem.mutex
15f0: 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 3b  );  .  return n;
1600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1610: 20 74 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62   the alarm callb
1620: 61 63 6b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ack.*/.int sqlit
1630: 65 33 5f 6d 65 6d 6f 72 79 5f 61 6c 61 72 6d 28  e3_memory_alarm(
1640: 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
1650: 63 6b 29 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ck)(void *pArg, 
1660: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 73  sqlite3_int64 us
1670: 65 64 2c 20 69 6e 74 20 4e 29 2c 0a 20 20 76 6f  ed, int N),.  vo
1680: 69 64 20 2a 70 41 72 67 2c 0a 20 20 73 71 6c 69  id *pArg,.  sqli
1690: 74 65 33 5f 69 6e 74 36 34 20 69 54 68 72 65 73  te3_int64 iThres
16a0: 68 6f 6c 64 0a 29 7b 0a 20 20 65 6e 74 65 72 4d  hold.){.  enterM
16b0: 65 6d 28 29 3b 0a 20 20 6d 65 6d 2e 61 6c 61 72  em();.  mem.alar
16c0: 6d 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  mCallback = xCal
16d0: 6c 62 61 63 6b 3b 0a 20 20 6d 65 6d 2e 61 6c 61  lback;.  mem.ala
16e0: 72 6d 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  rmArg = pArg;.  
16f0: 6d 65 6d 2e 61 6c 61 72 6d 54 68 72 65 73 68 6f  mem.alarmThresho
1700: 6c 64 20 3d 20 69 54 68 72 65 73 68 6f 6c 64 3b  ld = iThreshold;
1710: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1720: 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78  _leave(mem.mutex
1730: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1740: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1750: 54 72 69 67 67 65 72 20 74 68 65 20 61 6c 61 72  Trigger the alar
1760: 6d 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m .*/.static voi
1770: 64 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 41  d sqlite3MemsysA
1780: 6c 61 72 6d 28 69 6e 74 20 6e 42 79 74 65 29 7b  larm(int nByte){
1790: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
17a0: 61 63 6b 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ack)(void*,sqlit
17b0: 65 33 5f 69 6e 74 36 34 2c 69 6e 74 29 3b 0a 20  e3_int64,int);. 
17c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
17d0: 6f 77 55 73 65 64 3b 0a 20 20 76 6f 69 64 20 2a  owUsed;.  void *
17e0: 70 41 72 67 3b 0a 20 20 69 66 28 20 6d 65 6d 2e  pArg;.  if( mem.
17f0: 61 6c 61 72 6d 43 61 6c 6c 62 61 63 6b 3d 3d 30  alarmCallback==0
1800: 20 7c 7c 20 6d 65 6d 2e 61 6c 61 72 6d 42 75 73   || mem.alarmBus
1810: 79 20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  y  ) return;.  m
1820: 65 6d 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 31  em.alarmBusy = 1
1830: 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b 20 3d 20  ;.  xCallback = 
1840: 6d 65 6d 2e 61 6c 61 72 6d 43 61 6c 6c 62 61 63  mem.alarmCallbac
1850: 6b 3b 0a 20 20 6e 6f 77 55 73 65 64 20 3d 20 6d  k;.  nowUsed = m
1860: 65 6d 2e 6e 6f 77 55 73 65 64 3b 0a 20 20 70 41  em.nowUsed;.  pA
1870: 72 67 20 3d 20 6d 65 6d 2e 61 6c 61 72 6d 41 72  rg = mem.alarmAr
1880: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
1890: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
18a0: 65 78 29 3b 0a 20 20 78 43 61 6c 6c 62 61 63 6b  ex);.  xCallback
18b0: 28 70 41 72 67 2c 20 6e 6f 77 55 73 65 64 2c 20  (pArg, nowUsed, 
18c0: 6e 42 79 74 65 29 3b 0a 20 20 73 71 6c 69 74 65  nByte);.  sqlite
18d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65  3_mutex_enter(me
18e0: 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 2e  m.mutex);.  mem.
18f0: 61 6c 61 72 6d 42 75 73 79 20 3d 20 30 3b 0a 7d  alarmBusy = 0;.}
1900: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
1910: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 66 69 6e   allocation, fin
1920: 64 20 74 68 65 20 4d 65 6d 42 6c 6f 63 6b 48 64  d the MemBlockHd
1930: 72 20 66 6f 72 20 74 68 61 74 20 61 6c 6c 6f 63  r for that alloc
1940: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
1950: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
1960: 20 74 68 65 20 67 75 61 72 64 73 20 61 74 20 65   the guards at e
1970: 69 74 68 65 72 20 65 6e 64 20 6f 66 20 74 68 65  ither end of the
1980: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 0a   allocation and.
1990: 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69  ** if they are i
19a0: 6e 63 6f 72 72 65 63 74 20 69 74 20 61 73 73 65  ncorrect it asse
19b0: 72 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  rts..*/.static s
19c0: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
19d0: 72 20 2a 73 71 6c 69 74 65 33 4d 65 6d 73 79 73  r *sqlite3Memsys
19e0: 47 65 74 48 65 61 64 65 72 28 76 6f 69 64 20 2a  GetHeader(void *
19f0: 70 41 6c 6c 6f 63 61 74 69 6f 6e 29 7b 0a 20 20  pAllocation){.  
1a00: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
1a10: 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 2a 70 49  dr *p;.  int *pI
1a20: 6e 74 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75  nt;..  p = (stru
1a30: 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 2a 29  ct MemBlockHdr*)
1a40: 70 41 6c 6c 6f 63 61 74 69 6f 6e 3b 0a 20 20 70  pAllocation;.  p
1a50: 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  --;.  assert( p-
1a60: 3e 69 46 6f 72 65 47 75 61 72 64 3d 3d 46 4f 52  >iForeGuard==FOR
1a70: 45 47 55 41 52 44 20 29 3b 0a 20 20 61 73 73 65  EGUARD );.  asse
1a80: 72 74 28 20 28 70 2d 3e 69 53 69 7a 65 20 26 20  rt( (p->iSize & 
1a90: 33 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 74 20  3)==0 );.  pInt 
1aa0: 3d 20 28 69 6e 74 2a 29 70 41 6c 6c 6f 63 61 74  = (int*)pAllocat
1ab0: 69 6f 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ion;.  assert( p
1ac0: 49 6e 74 5b 70 2d 3e 69 53 69 7a 65 2f 73 69 7a  Int[p->iSize/siz
1ad0: 65 6f 66 28 69 6e 74 29 5d 3d 3d 52 45 41 52 47  eof(int)]==REARG
1ae0: 55 41 52 44 20 29 3b 0a 20 20 72 65 74 75 72 6e  UARD );.  return
1af0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
1b00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1b10: 6c 65 64 20 6f 6e 63 65 20 74 68 65 20 66 69 72  led once the fir
1b20: 73 74 20 74 69 6d 65 20 61 20 73 69 6d 75 6c 61  st time a simula
1b30: 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 61  ted memory.** fa
1b40: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 20 20 54  ilure occurs.  T
1b50: 68 65 20 73 6f 6c 65 20 70 75 72 70 6f 73 65 20  he sole purpose 
1b60: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
1b70: 69 73 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  is to provide.**
1b80: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
1b90: 61 63 65 20 74 6f 20 73 65 74 20 61 20 64 65 62  ace to set a deb
1ba0: 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
1bb0: 20 77 68 65 6e 20 64 65 62 75 67 67 69 6e 67 0a   when debugging.
1bc0: 2a 2a 20 65 72 72 6f 72 73 20 72 65 6c 61 74 65  ** errors relate
1bd0: 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61  d to malloc() fa
1be0: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
1bf0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  c void sqlite3Me
1c00: 6d 73 79 73 46 61 69 6c 65 64 28 76 6f 69 64 29  msysFailed(void)
1c10: 7b 0a 20 20 6d 65 6d 2e 69 46 61 69 6c 43 6e 74  {.  mem.iFailCnt
1c20: 20 3d 20 30 3b 0a 20 20 6d 65 6d 2e 69 42 65 6e   = 0;.  mem.iBen
1c30: 69 67 6e 46 61 69 6c 43 6e 74 20 3d 20 30 3b 0a  ignFailCnt = 0;.
1c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1c50: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
1c60: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1c70: 20 2a 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63   *sqlite3_malloc
1c80: 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 73  (int nByte){.  s
1c90: 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48 64  truct MemBlockHd
1ca0: 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69 64 20  r *pHdr;.  void 
1cb0: 2a 2a 70 42 74 3b 0a 20 20 63 68 61 72 20 2a 7a  **pBt;.  char *z
1cc0: 3b 0a 20 20 69 6e 74 20 2a 70 49 6e 74 3b 0a 20  ;.  int *pInt;. 
1cd0: 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
1ce0: 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 0a 0a  int totalSize;..
1cf0: 20 20 69 66 28 20 6e 42 79 74 65 3e 30 20 29 7b    if( nByte>0 ){
1d00: 0a 20 20 20 20 65 6e 74 65 72 4d 65 6d 28 29 3b  .    enterMem();
1d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
1d20: 2e 64 69 73 61 6c 6c 6f 77 3d 3d 30 20 29 3b 0a  .disallow==0 );.
1d30: 20 20 20 20 69 66 28 20 6d 65 6d 2e 61 6c 61 72      if( mem.alar
1d40: 6d 43 61 6c 6c 62 61 63 6b 21 3d 30 20 26 26 20  mCallback!=0 && 
1d50: 6d 65 6d 2e 6e 6f 77 55 73 65 64 2b 6e 42 79 74  mem.nowUsed+nByt
1d60: 65 3e 3d 6d 65 6d 2e 61 6c 61 72 6d 54 68 72 65  e>=mem.alarmThre
1d70: 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 73  shold ){.      s
1d80: 71 6c 69 74 65 33 4d 65 6d 73 79 73 41 6c 61 72  qlite3MemsysAlar
1d90: 6d 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  m(nByte);.    }.
1da0: 20 20 20 20 6e 42 79 74 65 20 3d 20 28 6e 42 79      nByte = (nBy
1db0: 74 65 2b 33 29 26 7e 33 3b 0a 20 20 20 20 74 6f  te+3)&~3;.    to
1dc0: 74 61 6c 53 69 7a 65 20 3d 20 6e 42 79 74 65 20  talSize = nByte 
1dd0: 2b 20 73 69 7a 65 6f 66 28 2a 70 48 64 72 29 20  + sizeof(*pHdr) 
1de0: 2b 20 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 0a  + sizeof(int) +.
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 6d 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2a   mem.nBacktrace*
1e10: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20  sizeof(void*) + 
1e20: 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20 20 20  mem.nTitle;.    
1e30: 69 66 28 20 6d 65 6d 2e 69 46 61 69 6c 3e 30 20  if( mem.iFail>0 
1e40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  ){.      if( mem
1e50: 2e 69 46 61 69 6c 3d 3d 31 20 29 7b 0a 20 20 20  .iFail==1 ){.   
1e60: 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
1e70: 20 20 20 20 6d 65 6d 2e 69 46 61 69 6c 20 3d 20      mem.iFail = 
1e80: 6d 65 6d 2e 69 52 65 73 65 74 3b 0a 20 20 20 20  mem.iReset;.    
1e90: 20 20 20 20 69 66 28 20 6d 65 6d 2e 69 46 61 69      if( mem.iFai
1ea0: 6c 43 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lCnt==0 ){.     
1eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 73       sqlite3Mems
1ec0: 79 73 46 61 69 6c 65 64 28 29 3b 20 20 2f 2a 20  ysFailed();  /* 
1ed0: 41 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  A place to set a
1ee0: 20 62 72 65 61 6b 70 6f 69 6e 74 20 2a 2f 0a 20   breakpoint */. 
1ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f00: 20 6d 65 6d 2e 69 46 61 69 6c 43 6e 74 2b 2b 3b   mem.iFailCnt++;
1f10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1f20: 2e 69 4e 65 78 74 49 73 42 65 6e 69 67 6e 20 29  .iNextIsBenign )
1f30: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 2e  {.          mem.
1f40: 69 42 65 6e 69 67 6e 46 61 69 6c 43 6e 74 2b 2b  iBenignFailCnt++
1f50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f70: 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 74 6f 74 61   p = malloc(tota
1f80: 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  lSize);.        
1f90: 6d 65 6d 2e 69 46 61 69 6c 2d 2d 3b 0a 20 20 20  mem.iFail--;.   
1fa0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1fb0: 20 20 20 20 20 20 70 20 3d 20 6d 61 6c 6c 6f 63        p = malloc
1fc0: 28 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20  (totalSize);.   
1fd0: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
1fe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65         sqlite3Me
1ff0: 6d 73 79 73 41 6c 61 72 6d 28 6e 42 79 74 65 29  msysAlarm(nByte)
2000: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 61  ;.        p = ma
2010: 6c 6c 6f 63 28 74 6f 74 61 6c 53 69 7a 65 29 3b  lloc(totalSize);
2020: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2030: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
2040: 20 20 7a 20 3d 20 70 3b 0a 20 20 20 20 20 20 70    z = p;.      p
2050: 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29 26 7a 5b  Bt = (void**)&z[
2060: 6d 65 6d 2e 6e 54 69 74 6c 65 5d 3b 0a 20 20 20  mem.nTitle];.   
2070: 20 20 20 70 48 64 72 20 3d 20 28 73 74 72 75 63     pHdr = (struc
2080: 74 20 4d 65 6d 42 6c 6f 63 6b 48 64 72 2a 29 26  t MemBlockHdr*)&
2090: 70 42 74 5b 6d 65 6d 2e 6e 42 61 63 6b 74 72 61  pBt[mem.nBacktra
20a0: 63 65 5d 3b 0a 20 20 20 20 20 20 70 48 64 72 2d  ce];.      pHdr-
20b0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
20c0: 20 20 70 48 64 72 2d 3e 70 50 72 65 76 20 3d 20    pHdr->pPrev = 
20d0: 6d 65 6d 2e 70 4c 61 73 74 3b 0a 20 20 20 20 20  mem.pLast;.     
20e0: 20 69 66 28 20 6d 65 6d 2e 70 4c 61 73 74 20 29   if( mem.pLast )
20f0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 2e 70 4c  {.        mem.pL
2100: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 48 64  ast->pNext = pHd
2110: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
2120: 20 20 20 20 20 20 20 20 6d 65 6d 2e 70 46 69 72          mem.pFir
2130: 73 74 20 3d 20 70 48 64 72 3b 0a 20 20 20 20 20  st = pHdr;.     
2140: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 2e 70 4c 61   }.      mem.pLa
2150: 73 74 20 3d 20 70 48 64 72 3b 0a 20 20 20 20 20  st = pHdr;.     
2160: 20 70 48 64 72 2d 3e 69 46 6f 72 65 47 75 61 72   pHdr->iForeGuar
2170: 64 20 3d 20 46 4f 52 45 47 55 41 52 44 3b 0a 20  d = FOREGUARD;. 
2180: 20 20 20 20 20 70 48 64 72 2d 3e 6e 42 61 63 6b       pHdr->nBack
2190: 74 72 61 63 65 53 6c 6f 74 73 20 3d 20 6d 65 6d  traceSlots = mem
21a0: 2e 6e 42 61 63 6b 74 72 61 63 65 3b 0a 20 20 20  .nBacktrace;.   
21b0: 20 20 20 70 48 64 72 2d 3e 6e 54 69 74 6c 65 20     pHdr->nTitle 
21c0: 3d 20 6d 65 6d 2e 6e 54 69 74 6c 65 3b 0a 20 20  = mem.nTitle;.  
21d0: 20 20 20 20 69 66 28 20 6d 65 6d 2e 6e 42 61 63      if( mem.nBac
21e0: 6b 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  ktrace ){.      
21f0: 20 20 76 6f 69 64 20 2a 61 41 64 64 72 5b 34 30    void *aAddr[40
2200: 5d 3b 0a 20 20 20 20 20 20 20 20 70 48 64 72 2d  ];.        pHdr-
2210: 3e 6e 42 61 63 6b 74 72 61 63 65 20 3d 20 62 61  >nBacktrace = ba
2220: 63 6b 74 72 61 63 65 28 61 41 64 64 72 2c 20 6d  cktrace(aAddr, m
2230: 65 6d 2e 6e 42 61 63 6b 74 72 61 63 65 2b 31 29  em.nBacktrace+1)
2240: 2d 31 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  -1;.        memc
2250: 70 79 28 70 42 74 2c 20 26 61 41 64 64 72 5b 31  py(pBt, &aAddr[1
2260: 5d 2c 20 70 48 64 72 2d 3e 6e 42 61 63 6b 74 72  ], pHdr->nBacktr
2270: 61 63 65 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a  ace*sizeof(void*
2280: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2290: 0a 20 20 20 20 20 20 20 20 70 48 64 72 2d 3e 6e  .        pHdr->n
22a0: 42 61 63 6b 74 72 61 63 65 20 3d 20 30 3b 0a 20  Backtrace = 0;. 
22b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22c0: 20 6d 65 6d 2e 6e 54 69 74 6c 65 20 29 7b 0a 20   mem.nTitle ){. 
22d0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c         memcpy(z,
22e0: 20 6d 65 6d 2e 7a 54 69 74 6c 65 2c 20 6d 65 6d   mem.zTitle, mem
22f0: 2e 6e 54 69 74 6c 65 29 3b 0a 20 20 20 20 20 20  .nTitle);.      
2300: 7d 0a 20 20 20 20 20 20 70 48 64 72 2d 3e 69 53  }.      pHdr->iS
2310: 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ize = nByte;.   
2320: 20 20 20 70 49 6e 74 20 3d 20 28 69 6e 74 2a 29     pInt = (int*)
2330: 26 70 48 64 72 5b 31 5d 3b 0a 20 20 20 20 20 20  &pHdr[1];.      
2340: 70 49 6e 74 5b 6e 42 79 74 65 2f 73 69 7a 65 6f  pInt[nByte/sizeo
2350: 66 28 69 6e 74 29 5d 20 3d 20 52 45 41 52 47 55  f(int)] = REARGU
2360: 41 52 44 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ARD;.      memse
2370: 74 28 70 49 6e 74 2c 20 30 78 36 35 2c 20 6e 42  t(pInt, 0x65, nB
2380: 79 74 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 2e  yte);.      mem.
2390: 6e 6f 77 55 73 65 64 20 2b 3d 20 6e 42 79 74 65  nowUsed += nByte
23a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 2e  ;.      if( mem.
23b0: 6e 6f 77 55 73 65 64 3e 6d 65 6d 2e 6d 78 55 73  nowUsed>mem.mxUs
23c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ed ){.        me
23d0: 6d 2e 6d 78 55 73 65 64 20 3d 20 6d 65 6d 2e 6e  m.mxUsed = mem.n
23e0: 6f 77 55 73 65 64 3b 0a 20 20 20 20 20 20 7d 0a  owUsed;.      }.
23f0: 20 20 20 20 20 20 70 20 3d 20 28 76 6f 69 64 2a        p = (void*
2400: 29 70 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  )pInt;.    }.   
2410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2420: 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29 3b  eave(mem.mutex);
2430: 0a 20 20 7d 0a 20 20 6d 65 6d 2e 69 4e 65 78 74  .  }.  mem.iNext
2440: 49 73 42 65 6e 69 67 6e 20 3d 20 30 3b 0a 20 20  IsBenign = 0;.  
2450: 72 65 74 75 72 6e 20 70 3b 20 0a 7d 0a 0a 2f 2a  return p; .}../*
2460: 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e  .** Free memory.
2470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2480: 5f 66 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  _free(void *pPri
2490: 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65  or){.  struct Me
24a0: 6d 42 6c 6f 63 6b 48 64 72 20 2a 70 48 64 72 3b  mBlockHdr *pHdr;
24b0: 0a 20 20 76 6f 69 64 20 2a 2a 70 42 74 3b 0a 20  .  void **pBt;. 
24c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
24d0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
24e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
24f0: 73 73 65 72 74 28 20 6d 65 6d 2e 6d 75 74 65 78  ssert( mem.mutex
2500: 21 3d 30 20 29 3b 0a 20 20 70 48 64 72 20 3d 20  !=0 );.  pHdr = 
2510: 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65 74  sqlite3MemsysGet
2520: 48 65 61 64 65 72 28 70 50 72 69 6f 72 29 3b 0a  Header(pPrior);.
2530: 20 20 70 42 74 20 3d 20 28 76 6f 69 64 2a 2a 29    pBt = (void**)
2540: 70 48 64 72 3b 0a 20 20 70 42 74 20 2d 3d 20 70  pHdr;.  pBt -= p
2550: 48 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 53  Hdr->nBacktraceS
2560: 6c 6f 74 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f  lots;.  sqlite3_
2570: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e  mutex_enter(mem.
2580: 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 2e 6e 6f  mutex);.  mem.no
2590: 77 55 73 65 64 20 2d 3d 20 70 48 64 72 2d 3e 69  wUsed -= pHdr->i
25a0: 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 48 64 72  Size;.  if( pHdr
25b0: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 61  ->pPrev ){.    a
25c0: 73 73 65 72 74 28 20 70 48 64 72 2d 3e 70 50 72  ssert( pHdr->pPr
25d0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 48 64 72 20  ev->pNext==pHdr 
25e0: 29 3b 0a 20 20 20 20 70 48 64 72 2d 3e 70 50 72  );.    pHdr->pPr
25f0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 48 64 72  ev->pNext = pHdr
2600: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
2610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
2620: 6d 2e 70 46 69 72 73 74 3d 3d 70 48 64 72 20 29  m.pFirst==pHdr )
2630: 3b 0a 20 20 20 20 6d 65 6d 2e 70 46 69 72 73 74  ;.    mem.pFirst
2640: 20 3d 20 70 48 64 72 2d 3e 70 4e 65 78 74 3b 0a   = pHdr->pNext;.
2650: 20 20 7d 0a 20 20 69 66 28 20 70 48 64 72 2d 3e    }.  if( pHdr->
2660: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 61 73 73  pNext ){.    ass
2670: 65 72 74 28 20 70 48 64 72 2d 3e 70 4e 65 78 74  ert( pHdr->pNext
2680: 2d 3e 70 50 72 65 76 3d 3d 70 48 64 72 20 29 3b  ->pPrev==pHdr );
2690: 0a 20 20 20 20 70 48 64 72 2d 3e 70 4e 65 78 74  .    pHdr->pNext
26a0: 2d 3e 70 50 72 65 76 20 3d 20 70 48 64 72 2d 3e  ->pPrev = pHdr->
26b0: 70 50 72 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPrev;.  }else{.
26c0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e      assert( mem.
26d0: 70 4c 61 73 74 3d 3d 70 48 64 72 20 29 3b 0a 20  pLast==pHdr );. 
26e0: 20 20 20 6d 65 6d 2e 70 4c 61 73 74 20 3d 20 70     mem.pLast = p
26f0: 48 64 72 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  Hdr->pPrev;.  }.
2700: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 42 74    z = (char*)pBt
2710: 3b 0a 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e  ;.  z -= pHdr->n
2720: 54 69 74 6c 65 3b 0a 20 20 6d 65 6d 73 65 74 28  Title;.  memset(
2730: 7a 2c 20 30 78 32 62 2c 20 73 69 7a 65 6f 66 28  z, 0x2b, sizeof(
2740: 76 6f 69 64 2a 29 2a 70 48 64 72 2d 3e 6e 42 61  void*)*pHdr->nBa
2750: 63 6b 74 72 61 63 65 53 6c 6f 74 73 20 2b 20 73  cktraceSlots + s
2760: 69 7a 65 6f 66 28 2a 70 48 64 72 29 20 2b 0a 20  izeof(*pHdr) +. 
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 70 48 64 72 2d 3e 69 53 69 7a 65 20 2b 20 73   pHdr->iSize + s
2790: 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 70 48 64  izeof(int) + pHd
27a0: 72 2d 3e 6e 54 69 74 6c 65 29 3b 0a 20 20 66 72  r->nTitle);.  fr
27b0: 65 65 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(z);.  sqlite3
27c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
27d0: 2e 6d 75 74 65 78 29 3b 20 20 0a 7d 0a 0a 2f 2a  .mutex);  .}../*
27e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
27f0: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
2800: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
2810: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
2820: 74 68 69 73 20 64 65 62 75 67 67 69 6e 67 20 69  this debugging i
2830: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 77  mplementation, w
2840: 65 20 2a 61 6c 77 61 79 73 2a 20 6d 61 6b 65 20  e *always* make 
2850: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a  a copy of the.**
2860: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 74 6f   allocation into
2870: 20 61 20 6e 65 77 20 70 6c 61 63 65 20 69 6e 20   a new place in 
2880: 6d 65 6d 6f 72 79 2e 20 20 49 6e 20 74 68 69 73  memory.  In this
2890: 20 77 61 79 2c 20 69 66 20 74 68 65 20 0a 2a 2a   way, if the .**
28a0: 20 68 69 67 68 65 72 20 6c 65 76 65 6c 20 63 6f   higher level co
28b0: 64 65 20 69 73 20 75 73 69 6e 67 20 70 6f 69 6e  de is using poin
28c0: 74 65 72 20 74 6f 20 74 68 65 20 6f 6c 64 20 61  ter to the old a
28d0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 69 73  llocation, it is
28e0: 20 0a 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 6c   .** much more l
28f0: 69 6b 65 6c 79 20 74 6f 20 62 72 65 61 6b 20 61  ikely to break a
2900: 6e 64 20 77 65 20 61 72 65 20 6d 75 63 68 20 6d  nd we are much m
2910: 6f 72 65 20 6c 69 6b 69 6e 67 20 74 6f 20 66 69  ore liking to fi
2920: 6e 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  nd.** the error.
2930: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
2940: 33 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a  3_realloc(void *
2950: 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74  pPrior, int nByt
2960: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 4d 65 6d  e){.  struct Mem
2970: 42 6c 6f 63 6b 48 64 72 20 2a 70 4f 6c 64 48 64  BlockHdr *pOldHd
2980: 72 3b 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b  r;.  void *pNew;
2990: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 3d 3d 30  .  if( pPrior==0
29a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
29b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
29c0: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  yte);.  }.  if( 
29d0: 6e 42 79 74 65 3c 3d 30 20 29 7b 0a 20 20 20 20  nByte<=0 ){.    
29e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 72  sqlite3_free(pPr
29f0: 69 6f 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ior);.    return
2a00: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
2a10: 28 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 3d 3d  ( mem.disallow==
2a20: 30 20 29 3b 0a 20 20 70 4f 6c 64 48 64 72 20 3d  0 );.  pOldHdr =
2a30: 20 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 47 65   sqlite3MemsysGe
2a40: 74 48 65 61 64 65 72 28 70 50 72 69 6f 72 29 3b  tHeader(pPrior);
2a50: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
2a60: 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
2a70: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
2a80: 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20     memcpy(pNew, 
2a90: 70 50 72 69 6f 72 2c 20 6e 42 79 74 65 3c 70 4f  pPrior, nByte<pO
2aa0: 6c 64 48 64 72 2d 3e 69 53 69 7a 65 20 3f 20 6e  ldHdr->iSize ? n
2ab0: 42 79 74 65 20 3a 20 70 4f 6c 64 48 64 72 2d 3e  Byte : pOldHdr->
2ac0: 69 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  iSize);.    if( 
2ad0: 6e 42 79 74 65 3e 70 4f 6c 64 48 64 72 2d 3e 69  nByte>pOldHdr->i
2ae0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
2af0: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 4e  mset(&((char*)pN
2b00: 65 77 29 5b 70 4f 6c 64 48 64 72 2d 3e 69 53 69  ew)[pOldHdr->iSi
2b10: 7a 65 5d 2c 20 30 78 32 62 2c 20 6e 42 79 74 65  ze], 0x2b, nByte
2b20: 20 2d 20 70 4f 6c 64 48 64 72 2d 3e 69 53 69 7a   - pOldHdr->iSiz
2b30: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
2b40: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 72 69 6f  lite3_free(pPrio
2b50: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2b60: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
2b70: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
2b80: 66 20 62 61 63 6b 74 72 61 63 65 20 6c 65 76 65  f backtrace leve
2b90: 6c 73 20 6b 65 70 74 20 66 6f 72 20 65 61 63 68  ls kept for each
2ba0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20   allocation..** 
2bb0: 41 20 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 20  A value of zero 
2bc0: 74 75 72 6e 73 20 6f 66 20 62 61 63 6b 74 72 61  turns of backtra
2bd0: 63 69 6e 67 2e 20 20 54 68 65 20 6e 75 6d 62 65  cing.  The numbe
2be0: 72 20 69 73 20 61 6c 77 61 79 73 20 72 6f 75 6e  r is always roun
2bf0: 64 65 64 0a 2a 2a 20 75 70 20 74 6f 20 61 20 6d  ded.** up to a m
2c00: 75 6c 74 69 70 6c 65 20 6f 66 20 32 2e 0a 2a 2f  ultiple of 2..*/
2c10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 6d 65  .void sqlite3_me
2c20: 6d 64 65 62 75 67 5f 62 61 63 6b 74 72 61 63 65  mdebug_backtrace
2c30: 28 69 6e 74 20 64 65 70 74 68 29 7b 0a 20 20 69  (int depth){.  i
2c40: 66 28 20 64 65 70 74 68 3c 30 20 29 7b 20 64 65  f( depth<0 ){ de
2c50: 70 74 68 20 3d 20 30 3b 20 7d 0a 20 20 69 66 28  pth = 0; }.  if(
2c60: 20 64 65 70 74 68 3e 32 30 20 29 7b 20 64 65 70   depth>20 ){ dep
2c70: 74 68 20 3d 20 32 30 3b 20 7d 0a 20 20 64 65 70  th = 20; }.  dep
2c80: 74 68 20 3d 20 28 64 65 70 74 68 2b 31 29 26 30  th = (depth+1)&0
2c90: 78 66 65 3b 0a 20 20 6d 65 6d 2e 6e 42 61 63 6b  xfe;.  mem.nBack
2ca0: 74 72 61 63 65 20 3d 20 64 65 70 74 68 3b 0a 7d  trace = depth;.}
2cb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2cc0: 74 69 74 6c 65 20 73 74 72 69 6e 67 20 66 6f 72  title string for
2cd0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 6c 6c 6f   subsequent allo
2ce0: 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  cations..*/.void
2cf0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75   sqlite3_memdebu
2d00: 67 5f 73 65 74 74 69 74 6c 65 28 63 6f 6e 73 74  g_settitle(const
2d10: 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 29 7b 0a   char *zTitle){.
2d20: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
2d30: 28 7a 54 69 74 6c 65 29 20 2b 20 31 3b 0a 20 20  (zTitle) + 1;.  
2d40: 65 6e 74 65 72 4d 65 6d 28 29 3b 0a 20 20 69 66  enterMem();.  if
2d50: 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 6d 65 6d 2e  ( n>=sizeof(mem.
2d60: 7a 54 69 74 6c 65 29 20 29 20 6e 20 3d 20 73 69  zTitle) ) n = si
2d70: 7a 65 6f 66 28 6d 65 6d 2e 7a 54 69 74 6c 65 29  zeof(mem.zTitle)
2d80: 2d 31 3b 0a 20 20 6d 65 6d 63 70 79 28 6d 65 6d  -1;.  memcpy(mem
2d90: 2e 7a 54 69 74 6c 65 2c 20 7a 54 69 74 6c 65 2c  .zTitle, zTitle,
2da0: 20 6e 29 3b 0a 20 20 6d 65 6d 2e 7a 54 69 74 6c   n);.  mem.zTitl
2db0: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 2e  e[n] = 0;.  mem.
2dc0: 6e 54 69 74 6c 65 20 3d 20 28 6e 2b 33 29 26 7e  nTitle = (n+3)&~
2dd0: 33 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  3;.  sqlite3_mut
2de0: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74  ex_leave(mem.mut
2df0: 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ex);.}../*.** Op
2e00: 65 6e 20 74 68 65 20 66 69 6c 65 20 69 6e 64 69  en the file indi
2e10: 63 61 74 65 64 20 61 6e 64 20 77 72 69 74 65 20  cated and write 
2e20: 61 20 6c 6f 67 20 6f 66 20 61 6c 6c 20 75 6e 66  a log of all unf
2e30: 72 65 65 64 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  reed memory .** 
2e40: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 74 6f  allocations into
2e50: 20 74 68 61 74 20 6c 6f 67 2e 0a 2a 2f 0a 76 6f   that log..*/.vo
2e60: 69 64 20 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65  id sqlite3_memde
2e70: 62 75 67 5f 64 75 6d 70 28 63 6f 6e 73 74 20 63  bug_dump(const c
2e80: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
2e90: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
2ea0: 73 74 72 75 63 74 20 4d 65 6d 42 6c 6f 63 6b 48  struct MemBlockH
2eb0: 64 72 20 2a 70 48 64 72 3b 0a 20 20 76 6f 69 64  dr *pHdr;.  void
2ec0: 20 2a 2a 70 42 74 3b 0a 20 20 6f 75 74 20 3d 20   **pBt;.  out = 
2ed0: 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  fopen(zFilename,
2ee0: 20 22 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74   "w");.  if( out
2ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
2f00: 74 66 28 73 74 64 65 72 72 2c 20 22 2a 2a 20 55  tf(stderr, "** U
2f10: 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70 75 74 20  nable to output 
2f20: 6d 65 6d 6f 72 79 20 64 65 62 75 67 20 6f 75 74  memory debug out
2f30: 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e  put log: %s **\n
2f40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2f50: 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
2f60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2f70: 20 7d 0a 20 20 66 6f 72 28 70 48 64 72 3d 6d 65   }.  for(pHdr=me
2f80: 6d 2e 70 46 69 72 73 74 3b 20 70 48 64 72 3b 20  m.pFirst; pHdr; 
2f90: 70 48 64 72 3d 70 48 64 72 2d 3e 70 4e 65 78 74  pHdr=pHdr->pNext
2fa0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
2fb0: 20 28 63 68 61 72 2a 29 70 48 64 72 3b 0a 20 20   (char*)pHdr;.  
2fc0: 20 20 7a 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61    z -= pHdr->nBa
2fd0: 63 6b 74 72 61 63 65 53 6c 6f 74 73 2a 73 69 7a  cktraceSlots*siz
2fe0: 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 70 48 64  eof(void*) + pHd
2ff0: 72 2d 3e 6e 54 69 74 6c 65 3b 0a 20 20 20 20 66  r->nTitle;.    f
3000: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2a 2a 2a  printf(out, "***
3010: 2a 20 25 64 20 62 79 74 65 73 20 61 74 20 25 70  * %d bytes at %p
3020: 20 66 72 6f 6d 20 25 73 20 2a 2a 2a 2a 5c 6e 22   from %s ****\n"
3030: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
3040: 48 64 72 2d 3e 69 53 69 7a 65 2c 20 26 70 48 64  Hdr->iSize, &pHd
3050: 72 5b 31 5d 2c 20 70 48 64 72 2d 3e 6e 54 69 74  r[1], pHdr->nTit
3060: 6c 65 20 3f 20 7a 20 3a 20 22 3f 3f 3f 22 29 3b  le ? z : "???");
3070: 0a 20 20 20 20 69 66 28 20 70 48 64 72 2d 3e 6e  .    if( pHdr->n
3080: 42 61 63 6b 74 72 61 63 65 20 29 7b 0a 20 20 20  Backtrace ){.   
3090: 20 20 20 66 66 6c 75 73 68 28 6f 75 74 29 3b 0a     fflush(out);.
30a0: 20 20 20 20 20 20 70 42 74 20 3d 20 28 76 6f 69        pBt = (voi
30b0: 64 2a 2a 29 70 48 64 72 3b 0a 20 20 20 20 20 20  d**)pHdr;.      
30c0: 70 42 74 20 2d 3d 20 70 48 64 72 2d 3e 6e 42 61  pBt -= pHdr->nBa
30d0: 63 6b 74 72 61 63 65 53 6c 6f 74 73 3b 0a 20 20  cktraceSlots;.  
30e0: 20 20 20 20 62 61 63 6b 74 72 61 63 65 5f 73 79      backtrace_sy
30f0: 6d 62 6f 6c 73 5f 66 64 28 70 42 74 2c 20 70 48  mbols_fd(pBt, pH
3100: 64 72 2d 3e 6e 42 61 63 6b 74 72 61 63 65 2c 20  dr->nBacktrace, 
3110: 66 69 6c 65 6e 6f 28 6f 75 74 29 29 3b 0a 20 20  fileno(out));.  
3120: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
3130: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20   "\n");.    }.  
3140: 7d 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b  }.  fclose(out);
3150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3160: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
3170: 6f 20 73 69 6d 75 6c 61 74 65 20 6d 61 6c 6c 6f  o simulate mallo
3180: 63 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2a 0a 2a  c failures..**.*
3190: 2a 20 41 66 74 65 72 20 63 61 6c 6c 69 6e 67 20  * After calling 
31a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
31b0: 65 72 65 20 77 69 6c 6c 20 62 65 20 69 46 61 69  ere will be iFai
31c0: 6c 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20  l successful.** 
31d0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
31e0: 6e 73 20 61 6e 64 20 74 68 65 6e 20 61 20 66 61  ns and then a fa
31f0: 69 6c 75 72 65 2e 20 20 49 66 20 69 52 65 70 65  ilure.  If iRepe
3200: 61 74 20 69 73 20 31 0a 2a 2a 20 61 6c 6c 20 73  at is 1.** all s
3210: 75 62 73 65 71 75 65 6e 74 20 6d 65 6d 6f 72 79  ubsequent memory
3220: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c   allocations wil
3230: 6c 20 66 61 69 6c 2e 20 20 49 66 20 69 52 65 70  l fail.  If iRep
3240: 65 61 74 20 69 73 0a 2a 2a 20 30 2c 20 6f 6e 6c  eat is.** 0, onl
3250: 79 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  y a single alloc
3260: 61 74 69 6f 6e 20 77 69 6c 6c 20 66 61 69 6c 2e  ation will fail.
3270: 20 20 49 66 20 69 52 65 70 65 61 74 20 69 73 20    If iRepeat is 
3280: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 74 68 65 6e  negative.** then
3290: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
32a0: 74 74 69 6e 67 20 66 6f 72 20 69 52 65 70 65 61  tting for iRepea
32b0: 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  t is unchanged..
32c0: 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 61 6c 6c 20  **.** Each call 
32d0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
32e0: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 70 72  overrides the pr
32f0: 65 76 69 6f 75 73 2e 20 20 54 6f 20 64 69 73 61  evious.  To disa
3300: 62 6c 65 0a 2a 2a 20 74 68 65 20 73 69 6d 75 6c  ble.** the simul
3310: 61 74 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ated allocation 
3320: 66 61 69 6c 75 72 65 20 6d 65 63 68 61 6e 69 73  failure mechanis
3330: 6d 2c 20 73 65 74 20 69 46 61 69 6c 20 74 6f 20  m, set iFail to 
3340: 2d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  -1..**.** This r
3350: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
3360: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
3370: 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65 73 20  ulated failures 
3380: 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 6f 63 63  that have.** occ
3390: 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20  urred since the 
33a0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2e 0a 2a  previous call..*
33b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65  /.int sqlite3_me
33c0: 6d 64 65 62 75 67 5f 66 61 69 6c 28 69 6e 74 20  mdebug_fail(int 
33d0: 69 46 61 69 6c 2c 20 69 6e 74 20 69 52 65 70 65  iFail, int iRepe
33e0: 61 74 2c 20 69 6e 74 20 2a 70 69 42 65 6e 69 67  at, int *piBenig
33f0: 6e 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 6d 65  n){.  int n = me
3400: 6d 2e 69 46 61 69 6c 43 6e 74 3b 0a 20 20 69 66  m.iFailCnt;.  if
3410: 28 20 70 69 42 65 6e 69 67 6e 20 29 7b 0a 20 20  ( piBenign ){.  
3420: 20 20 2a 70 69 42 65 6e 69 67 6e 20 3d 20 6d 65    *piBenign = me
3430: 6d 2e 69 42 65 6e 69 67 6e 46 61 69 6c 43 6e 74  m.iBenignFailCnt
3440: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 2e 69 46 61 69  ;.  }.  mem.iFai
3450: 6c 20 3d 20 69 46 61 69 6c 2b 31 3b 0a 20 20 69  l = iFail+1;.  i
3460: 66 28 20 69 52 65 70 65 61 74 3e 3d 30 20 29 7b  f( iRepeat>=0 ){
3470: 0a 20 20 20 20 6d 65 6d 2e 69 52 65 73 65 74 20  .    mem.iReset 
3480: 3d 20 69 52 65 70 65 61 74 3b 0a 20 20 7d 0a 20  = iRepeat;.  }. 
3490: 20 6d 65 6d 2e 69 46 61 69 6c 43 6e 74 20 3d 20   mem.iFailCnt = 
34a0: 30 3b 0a 20 20 6d 65 6d 2e 69 42 65 6e 69 67 6e  0;.  mem.iBenign
34b0: 46 61 69 6c 43 6e 74 20 3d 20 30 3b 0a 20 20 72  FailCnt = 0;.  r
34c0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 69 6e 74 20  eturn n;.}..int 
34d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 64 65 62 75 67  sqlite3_memdebug
34e0: 5f 70 65 6e 64 69 6e 67 28 29 7b 0a 20 20 72 65  _pending(){.  re
34f0: 74 75 72 6e 20 28 6d 65 6d 2e 69 46 61 69 6c 2d  turn (mem.iFail-
3500: 31 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  1);.}..void sqli
3510: 74 65 33 4d 61 6c 6c 6f 63 42 65 6e 69 67 6e 46  te3MallocBenignF
3520: 61 69 6c 75 72 65 28 69 6e 74 20 69 73 42 65 6e  ailure(int isBen
3530: 69 67 6e 29 7b 0a 20 20 69 66 28 20 69 73 42 65  ign){.  if( isBe
3540: 6e 69 67 6e 20 29 7b 0a 20 20 20 20 6d 65 6d 2e  nign ){.    mem.
3550: 69 4e 65 78 74 49 73 42 65 6e 69 67 6e 20 3d 20  iNextIsBenign = 
3560: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
3570: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
3580: 6f 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  o routines are u
3590: 73 65 64 20 74 6f 20 61 73 73 65 72 74 20 74 68  sed to assert th
35a0: 61 74 20 6e 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20  at no memory.** 
35b0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 63 63 75  allocations occu
35c0: 72 20 62 65 74 77 65 65 6e 20 6f 6e 65 20 63 61  r between one ca
35d0: 6c 6c 20 61 6e 64 20 74 68 65 20 6e 65 78 74 2e  ll and the next.
35e0: 20 20 54 68 65 20 75 73 65 20 6f 66 0a 2a 2a 20    The use of.** 
35f0: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 64  these routines d
3600: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
3610: 68 65 20 63 6f 6d 70 75 74 65 64 20 72 65 73 75  he computed resu
3620: 6c 74 73 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  lts in any way..
3630: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
3640: 73 20 61 72 65 20 6c 69 6b 65 20 61 73 73 65 72  s are like asser
3650: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
3660: 74 65 33 4d 61 6c 6c 6f 63 44 69 73 61 6c 6c 6f  te3MallocDisallo
3670: 77 28 76 6f 69 64 29 7b 0a 20 20 61 73 73 65 72  w(void){.  asser
3680: 74 28 20 6d 65 6d 2e 6d 75 74 65 78 21 3d 30 20  t( mem.mutex!=0 
3690: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
36a0: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74  ex_enter(mem.mut
36b0: 65 78 29 3b 0a 20 20 6d 65 6d 2e 64 69 73 61 6c  ex);.  mem.disal
36c0: 6c 6f 77 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  low++;.  sqlite3
36d0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
36e0: 2e 6d 75 74 65 78 29 3b 0a 7d 0a 76 6f 69 64 20  .mutex);.}.void 
36f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c  sqlite3MallocAll
3700: 6f 77 28 76 6f 69 64 29 7b 0a 20 20 61 73 73 65  ow(void){.  asse
3710: 72 74 28 20 6d 65 6d 2e 6d 75 74 65 78 20 29 3b  rt( mem.mutex );
3720: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3730: 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78  _enter(mem.mutex
3740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  );.  assert( mem
3750: 2e 64 69 73 61 6c 6c 6f 77 3e 30 20 29 3b 0a 20  .disallow>0 );. 
3760: 20 6d 65 6d 2e 64 69 73 61 6c 6c 6f 77 2d 2d 3b   mem.disallow--;
3770: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3780: 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78  _leave(mem.mutex
3790: 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
37a0: 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 20  SQLITE_MEMDEBUG 
37b0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  && !SQLITE_OMIT_
37c0: 4d 45 4d 4f 52 59 5f 41 4c 4c 4f 43 41 54 49 4f  MEMORY_ALLOCATIO
37d0: 4e 20 2a 2f 0a                                   N */.