/ Hex Artifact Content
Login

Artifact 71e43d6be24b014a43b1989ae7adec04817ca6e4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4f 63 74 6f 62  /*.** 2007 Octob
0010: 65 72 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 14.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u 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 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  implement a memo
01b0: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
01c0: 20 73 75 62 73 79 73 74 65 6d 20 66 6f 72 20 75   subsystem for u
01d0: 73 65 20 62 79 20 53 51 4c 69 74 65 2e 20 0a 2a  se by SQLite. .*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
01f0: 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  n of the memory 
0200: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
0210: 73 74 65 6d 20 6f 6d 69 74 73 20 61 6c 6c 0a 2a  stem omits all.*
0220: 2a 20 75 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28  * use of malloc(
0230: 29 2e 20 54 68 65 20 53 51 4c 69 74 65 20 75 73  ). The SQLite us
0240: 65 72 20 73 75 70 70 6c 69 65 73 20 61 20 62 6c  er supplies a bl
0250: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ock of memory.**
0260: 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
0270: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0280: 7a 65 28 29 20 66 72 6f 6d 20 77 68 69 63 68 20  ze() from which 
0290: 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 2a 2a 20 61  allocations.** a
02a0: 72 65 20 6d 61 64 65 20 61 6e 64 20 72 65 74 75  re made and retu
02b0: 72 6e 65 64 20 62 79 20 74 68 65 20 78 4d 61 6c  rned by the xMal
02c0: 6c 6f 63 28 29 20 61 6e 64 20 78 52 65 61 6c 6c  loc() and xReall
02d0: 6f 63 28 29 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65  oc() .** impleme
02e0: 6e 74 61 74 69 6f 6e 73 2e 20 4f 6e 63 65 20 73  ntations. Once s
02f0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
0300: 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  e() has been cal
0310: 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 61 6d 6f 75  led,.** the amou
0320: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 76 61  nt of memory ava
0330: 69 6c 61 62 6c 65 20 74 6f 20 53 51 4c 69 74 65  ilable to SQLite
0340: 20 69 73 20 66 69 78 65 64 20 61 6e 64 20 63 61   is fixed and ca
0350: 6e 6e 6f 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  nnot.** be chang
0360: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
0370: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65  ersion of the me
0380: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0390: 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 63  subsystem is inc
03a0: 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  luded.** in the 
03b0: 62 75 69 6c 64 20 6f 6e 6c 79 20 69 66 20 53 51  build only if SQ
03c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
03d0: 59 53 33 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  YS3 is defined..
03e0: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 65 6d 33 2e  **.** $Id: mem3.
03f0: 63 2c 76 20 31 2e 31 39 20 32 30 30 38 2f 30 37  c,v 1.19 2008/07
0400: 2f 31 36 20 31 32 3a 32 35 3a 33 32 20 64 72 68  /16 12:25:32 drh
0410: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0420: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0430: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ../*.** This ver
0440: 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f  sion of the memo
0450: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  ry allocator is 
0460: 6f 6e 6c 79 20 62 75 69 6c 74 20 69 6e 74 6f 20  only built into 
0470: 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 53  the library.** S
0480: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
0490: 53 59 53 33 20 69 73 20 64 65 66 69 6e 65 64 2e  SYS3 is defined.
04a0: 20 44 65 66 69 6e 69 6e 67 20 74 68 69 73 20 73   Defining this s
04b0: 79 6d 62 6f 6c 20 64 6f 65 73 20 6e 6f 74 0a 2a  ymbol does not.*
04c0: 2a 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  * mean that the 
04d0: 6c 69 62 72 61 72 79 20 77 69 6c 6c 20 75 73 65  library will use
04e0: 20 61 20 6d 65 6d 6f 72 79 2d 70 6f 6f 6c 20 62   a memory-pool b
04f0: 79 20 64 65 66 61 75 6c 74 2c 20 6a 75 73 74 20  y default, just 
0500: 74 68 61 74 0a 2a 2a 20 69 74 20 69 73 20 61 76  that.** it is av
0510: 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 6d 65 6d  ailable. The mem
0520: 70 6f 6f 6c 20 61 6c 6c 6f 63 61 74 6f 72 20 69  pool allocator i
0530: 73 20 61 63 74 69 76 61 74 65 64 20 62 79 20 63  s activated by c
0540: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
0550: 33 5f 63 6f 6e 66 69 67 28 29 2e 0a 2a 2f 0a 23  3_config()..*/.#
0560: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0570: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 0a 2f 2a 0a  BLE_MEMSYS3../*.
0580: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  ** Maximum size 
0590: 28 69 6e 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 20  (in Mem3Blocks) 
05a0: 6f 66 20 61 20 22 73 6d 61 6c 6c 22 20 63 68 75  of a "small" chu
05b0: 6e 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nk..*/.#define M
05c0: 58 5f 53 4d 41 4c 4c 20 31 30 0a 0a 0a 2f 2a 0a  X_SMALL 10.../*.
05d0: 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 65  ** Number of fre
05e0: 65 6c 69 73 74 20 68 61 73 68 20 73 6c 6f 74 73  elist hash slots
05f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 48 41  .*/.#define N_HA
0600: 53 48 20 20 36 31 0a 0a 2f 2a 0a 2a 2a 20 41 20  SH  61../*.** A 
0610: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0620: 6e 20 28 61 6c 73 6f 20 63 61 6c 6c 65 64 20 61  n (also called a
0630: 20 22 63 68 75 6e 6b 22 29 20 63 6f 6e 73 69 73   "chunk") consis
0640: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 0a 2a 2a  ts of two or .**
0650: 20 6d 6f 72 65 20 62 6c 6f 63 6b 73 20 77 68 65   more blocks whe
0660: 72 65 20 65 61 63 68 20 62 6c 6f 63 6b 20 69 73  re each block is
0670: 20 38 20 62 79 74 65 73 2e 20 20 54 68 65 20 66   8 bytes.  The f
0680: 69 72 73 74 20 38 20 62 79 74 65 73 20 61 72 65  irst 8 bytes are
0690: 20 0a 2a 2a 20 61 20 68 65 61 64 65 72 20 74 68   .** a header th
06a0: 61 74 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  at is not return
06b0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a  ed to the user..
06c0: 2a 2a 0a 2a 2a 20 41 20 63 68 75 6e 6b 20 69 73  **.** A chunk is
06d0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 6c 6f   two or more blo
06e0: 63 6b 73 20 74 68 61 74 20 69 73 20 65 69 74 68  cks that is eith
06f0: 65 72 20 63 68 65 63 6b 65 64 20 6f 75 74 20 6f  er checked out o
0700: 72 0a 2a 2a 20 66 72 65 65 2e 20 20 54 68 65 20  r.** free.  The 
0710: 66 69 72 73 74 20 62 6c 6f 63 6b 20 68 61 73 20  first block has 
0720: 66 6f 72 6d 61 74 20 75 2e 68 64 72 2e 20 20 75  format u.hdr.  u
0730: 2e 68 64 72 2e 73 69 7a 65 34 78 20 69 73 20 34  .hdr.size4x is 4
0740: 20 74 69 6d 65 73 20 74 68 65 0a 2a 2a 20 73 69   times the.** si
0750: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
0760: 74 69 6f 6e 20 69 6e 20 62 6c 6f 63 6b 73 20 69  tion in blocks i
0770: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
0780: 20 69 73 20 66 72 65 65 2e 0a 2a 2a 20 54 68 65   is free..** The
0790: 20 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 31 20   u.hdr.size4x&1 
07a0: 62 69 74 20 69 73 20 74 72 75 65 20 69 66 20 74  bit is true if t
07b0: 68 65 20 63 68 75 6e 6b 20 69 73 20 63 68 65 63  he chunk is chec
07c0: 6b 65 64 20 6f 75 74 20 61 6e 64 0a 2a 2a 20 66  ked out and.** f
07d0: 61 6c 73 65 20 69 66 20 74 68 65 20 63 68 75 6e  alse if the chun
07e0: 6b 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  k is on the free
07f0: 6c 69 73 74 2e 20 20 54 68 65 20 75 2e 68 64 72  list.  The u.hdr
0800: 2e 73 69 7a 65 34 78 26 32 20 62 69 74 0a 2a 2a  .size4x&2 bit.**
0810: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
0820: 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69  previous chunk i
0830: 73 20 63 68 65 63 6b 65 64 20 6f 75 74 20 61 6e  s checked out an
0840: 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a 2a  d false if the.*
0850: 2a 20 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b  * previous chunk
0860: 20 69 73 20 66 72 65 65 2e 20 20 54 68 65 20 75   is free.  The u
0870: 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 66 69  .hdr.prevSize fi
0880: 65 6c 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  eld is the size 
0890: 6f 66 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  of.** the previo
08a0: 75 73 20 63 68 75 6e 6b 20 69 6e 20 62 6c 6f 63  us chunk in bloc
08b0: 6b 73 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  ks if the previo
08c0: 75 73 20 63 68 75 6e 6b 20 69 73 20 6f 6e 20 74  us chunk is on t
08d0: 68 65 0a 2a 2a 20 66 72 65 65 6c 69 73 74 2e 20  he.** freelist. 
08e0: 49 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  If the previous 
08f0: 63 68 75 6e 6b 20 69 73 20 63 68 65 63 6b 65 64  chunk is checked
0900: 20 6f 75 74 2c 20 74 68 65 6e 0a 2a 2a 20 75 2e   out, then.** u.
0910: 68 64 72 2e 70 72 65 76 53 69 7a 65 20 63 61 6e  hdr.prevSize can
0920: 20 62 65 20 70 61 72 74 20 6f 66 20 74 68 65 20   be part of the 
0930: 64 61 74 61 20 66 6f 72 20 74 68 61 74 20 63 68  data for that ch
0940: 75 6e 6b 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  unk and should.*
0950: 2a 20 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72  * not be read or
0960: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
0970: 57 65 20 6f 66 74 65 6e 20 69 64 65 6e 74 69 66  We often identif
0980: 79 20 61 20 63 68 75 6e 6b 20 62 79 20 69 74 73  y a chunk by its
0990: 20 69 6e 64 65 78 20 69 6e 20 6d 65 6d 33 2e 61   index in mem3.a
09a0: 50 6f 6f 6c 5b 5d 2e 20 20 57 68 65 6e 0a 2a 2a  Pool[].  When.**
09b0: 20 74 68 69 73 20 69 73 20 64 6f 6e 65 2c 20 74   this is done, t
09c0: 68 65 20 63 68 75 6e 6b 20 69 6e 64 65 78 20 72  he chunk index r
09d0: 65 66 65 72 73 20 74 6f 20 74 68 65 20 73 65 63  efers to the sec
09e0: 6f 6e 64 20 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20  ond block of.** 
09f0: 74 68 65 20 63 68 75 6e 6b 2e 20 20 49 6e 20 74  the chunk.  In t
0a00: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 72  his way, the fir
0a10: 73 74 20 63 68 75 6e 6b 20 68 61 73 20 61 6e 20  st chunk has an 
0a20: 69 6e 64 65 78 20 6f 66 20 31 2e 0a 2a 2a 20 41  index of 1..** A
0a30: 20 63 68 75 6e 6b 20 69 6e 64 65 78 20 6f 66 20   chunk index of 
0a40: 30 20 6d 65 61 6e 73 20 22 6e 6f 20 73 75 63 68  0 means "no such
0a50: 20 63 68 75 6e 6b 22 20 61 6e 64 20 69 73 20 74   chunk" and is t
0a60: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a 2a  he equivalent.**
0a70: 20 6f 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   of a NULL point
0a80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
0a90: 63 6f 6e 64 20 62 6c 6f 63 6b 20 6f 66 20 66 72  cond block of fr
0aa0: 65 65 20 63 68 75 6e 6b 73 20 69 73 20 6f 66 20  ee chunks is of 
0ab0: 74 68 65 20 66 6f 72 6d 20 75 2e 6c 69 73 74 2e  the form u.list.
0ac0: 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 66 69 65    The.** two fie
0ad0: 6c 64 73 20 66 6f 72 6d 20 61 20 64 6f 75 62 6c  lds form a doubl
0ae0: 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e-linked list of
0af0: 20 63 68 75 6e 6b 73 20 6f 66 20 72 65 6c 61 74   chunks of relat
0b00: 65 64 20 73 69 7a 65 73 2e 0a 2a 2a 20 50 6f 69  ed sizes..** Poi
0b10: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 68 65 61  nters to the hea
0b20: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 72  d of the list ar
0b30: 65 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 33  e stored in mem3
0b40: 2e 61 69 53 6d 61 6c 6c 5b 5d 20 0a 2a 2a 20 66  .aiSmall[] .** f
0b50: 6f 72 20 73 6d 61 6c 6c 65 72 20 63 68 75 6e 6b  or smaller chunk
0b60: 73 20 61 6e 64 20 6d 65 6d 33 2e 61 69 48 61 73  s and mem3.aiHas
0b70: 68 5b 5d 20 66 6f 72 20 6c 61 72 67 65 72 20 63  h[] for larger c
0b80: 68 75 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hunks..**.** The
0b90: 20 73 65 63 6f 6e 64 20 62 6c 6f 63 6b 20 6f 66   second block of
0ba0: 20 61 20 63 68 75 6e 6b 20 69 73 20 75 73 65 72   a chunk is user
0bb0: 20 64 61 74 61 20 69 66 20 74 68 65 20 63 68 75   data if the chu
0bc0: 6e 6b 20 69 73 20 63 68 65 63 6b 65 64 20 0a 2a  nk is checked .*
0bd0: 2a 20 6f 75 74 2e 20 20 49 66 20 61 20 63 68 75  * out.  If a chu
0be0: 6e 6b 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75  nk is checked ou
0bf0: 74 2c 20 74 68 65 20 75 73 65 72 20 64 61 74 61  t, the user data
0c00: 20 6d 61 79 20 65 78 74 65 6e 64 20 69 6e 74 6f   may extend into
0c10: 0a 2a 2a 20 74 68 65 20 75 2e 68 64 72 2e 70 72  .** the u.hdr.pr
0c20: 65 76 53 69 7a 65 20 76 61 6c 75 65 20 6f 66 20  evSize value of 
0c30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  the following ch
0c40: 75 6e 6b 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  unk..*/.typedef 
0c50: 73 74 72 75 63 74 20 4d 65 6d 33 42 6c 6f 63 6b  struct Mem3Block
0c60: 20 4d 65 6d 33 42 6c 6f 63 6b 3b 0a 73 74 72 75   Mem3Block;.stru
0c70: 63 74 20 4d 65 6d 33 42 6c 6f 63 6b 20 7b 0a 20  ct Mem3Block {. 
0c80: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
0c90: 75 63 74 20 7b 0a 20 20 20 20 20 20 75 33 32 20  uct {.      u32 
0ca0: 70 72 65 76 53 69 7a 65 3b 20 20 20 2f 2a 20 53  prevSize;   /* S
0cb0: 69 7a 65 20 6f 66 20 70 72 65 76 69 6f 75 73 20  ize of previous 
0cc0: 63 68 75 6e 6b 20 69 6e 20 4d 65 6d 33 42 6c 6f  chunk in Mem3Blo
0cd0: 63 6b 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  ck elements */. 
0ce0: 20 20 20 20 20 75 33 32 20 73 69 7a 65 34 78 3b       u32 size4x;
0cf0: 20 20 20 20 20 2f 2a 20 34 78 20 74 68 65 20 73       /* 4x the s
0d00: 69 7a 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63  ize of current c
0d10: 68 75 6e 6b 20 69 6e 20 4d 65 6d 33 42 6c 6f 63  hunk in Mem3Bloc
0d20: 6b 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  k elements */.  
0d30: 20 20 7d 20 68 64 72 3b 0a 20 20 20 20 73 74 72    } hdr;.    str
0d40: 75 63 74 20 7b 0a 20 20 20 20 20 20 75 33 32 20  uct {.      u32 
0d50: 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 49  next;       /* I
0d60: 6e 64 65 78 20 69 6e 20 6d 65 6d 33 2e 61 50 6f  ndex in mem3.aPo
0d70: 6f 6c 5b 5d 20 6f 66 20 6e 65 78 74 20 66 72 65  ol[] of next fre
0d80: 65 20 63 68 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e chunk */.     
0d90: 20 75 33 32 20 70 72 65 76 3b 20 20 20 20 20 20   u32 prev;      
0da0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 6d 65 6d   /* Index in mem
0db0: 33 2e 61 50 6f 6f 6c 5b 5d 20 6f 66 20 70 72 65  3.aPool[] of pre
0dc0: 76 69 6f 75 73 20 66 72 65 65 20 63 68 75 6e 6b  vious free chunk
0dd0: 20 2a 2f 0a 20 20 20 20 7d 20 6c 69 73 74 3b 0a   */.    } list;.
0de0: 20 20 7d 20 75 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a    } u;.};../*.**
0df0: 20 41 6c 6c 20 6f 66 20 74 68 65 20 73 74 61 74   All of the stat
0e00: 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73 65  ic variables use
0e10: 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
0e20: 20 61 72 65 20 63 6f 6c 6c 65 63 74 65 64 0a 2a   are collected.*
0e30: 2a 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  * into a single 
0e40: 73 74 72 75 63 74 75 72 65 20 6e 61 6d 65 64 20  structure named 
0e50: 22 6d 65 6d 33 22 2e 20 20 54 68 69 73 20 69 73  "mem3".  This is
0e60: 20 74 6f 20 6b 65 65 70 20 74 68 65 0a 2a 2a 20   to keep the.** 
0e70: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73  static variables
0e80: 20 6f 72 67 61 6e 69 7a 65 64 20 61 6e 64 20 74   organized and t
0e90: 6f 20 72 65 64 75 63 65 20 6e 61 6d 65 73 70 61  o reduce namespa
0ea0: 63 65 20 70 6f 6c 6c 75 74 69 6f 6e 0a 2a 2a 20  ce pollution.** 
0eb0: 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65  when this module
0ec0: 20 69 73 20 63 6f 6d 62 69 6e 65 64 20 77 69 74   is combined wit
0ed0: 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 61  h other in the a
0ee0: 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  malgamation..*/.
0ef0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
0f00: 20 20 2f 2a 0a 20 20 2a 2a 20 54 72 75 65 20 69    /*.  ** True i
0f10: 66 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  f we are evaluat
0f20: 69 6e 67 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  ing an out-of-me
0f30: 6d 6f 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  mory callback.. 
0f40: 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42   */.  int alarmB
0f50: 75 73 79 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  usy;.  .  /*.  *
0f60: 2a 20 4d 75 74 65 78 20 74 6f 20 63 6f 6e 74 72  * Mutex to contr
0f70: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
0f80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0f90: 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  on subsystem..  
0fa0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
0fb0: 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 0a 20 20  ex *mutex;.  .  
0fc0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 69 6e 69  /*.  ** The mini
0fd0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  mum amount of fr
0fe0: 65 65 20 73 70 61 63 65 20 74 68 61 74 20 77 65  ee space that we
0ff0: 20 68 61 76 65 20 73 65 65 6e 2e 0a 20 20 2a 2f   have seen..  */
1000: 0a 20 20 75 33 32 20 6d 6e 4d 61 73 74 65 72 3b  .  u32 mnMaster;
1010: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 69 4d 61 73  ..  /*.  ** iMas
1020: 74 65 72 20 69 73 20 74 68 65 20 69 6e 64 65 78  ter is the index
1030: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 63   of the master c
1040: 68 75 6e 6b 2e 20 20 4d 6f 73 74 20 6e 65 77 20  hunk.  Most new 
1050: 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 20 20 2a 2a  allocations.  **
1060: 20 6f 63 63 75 72 20 6f 66 66 20 6f 66 20 74 68   occur off of th
1070: 69 73 20 63 68 75 6e 6b 2e 20 20 73 7a 4d 61 73  is chunk.  szMas
1080: 74 65 72 20 69 73 20 74 68 65 20 73 69 7a 65 20  ter is the size 
1090: 28 69 6e 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 0a  (in Mem3Blocks).
10a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72    ** of the curr
10b0: 65 6e 74 20 6d 61 73 74 65 72 2e 20 20 69 4d 61  ent master.  iMa
10c0: 73 74 65 72 20 69 73 20 30 20 69 66 20 74 68 65  ster is 0 if the
10d0: 72 65 20 69 73 20 6e 6f 74 20 6d 61 73 74 65 72  re is not master
10e0: 20 63 68 75 6e 6b 2e 0a 20 20 2a 2a 20 54 68 65   chunk..  ** The
10f0: 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 69 73   master chunk is
1100: 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 20 74   not in either t
1110: 68 65 20 61 69 48 61 73 68 5b 5d 20 6f 72 20 61  he aiHash[] or a
1120: 69 53 6d 61 6c 6c 5b 5d 2e 0a 20 20 2a 2f 0a 20  iSmall[]..  */. 
1130: 20 75 33 32 20 69 4d 61 73 74 65 72 3b 0a 20 20   u32 iMaster;.  
1140: 75 33 32 20 73 7a 4d 61 73 74 65 72 3b 0a 0a 20  u32 szMaster;.. 
1150: 20 2f 2a 0a 20 20 2a 2a 20 41 72 72 61 79 20 6f   /*.  ** Array o
1160: 66 20 6c 69 73 74 73 20 6f 66 20 66 72 65 65 20  f lists of free 
1170: 62 6c 6f 63 6b 73 20 61 63 63 6f 72 64 69 6e 67  blocks according
1180: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 73 69   to the block si
1190: 7a 65 20 0a 20 20 2a 2a 20 66 6f 72 20 73 6d 61  ze .  ** for sma
11a0: 6c 6c 65 72 20 63 68 75 6e 6b 73 2c 20 6f 72 20  ller chunks, or 
11b0: 61 20 68 61 73 68 20 6f 6e 20 74 68 65 20 62 6c  a hash on the bl
11c0: 6f 63 6b 20 73 69 7a 65 20 66 6f 72 20 6c 61 72  ock size for lar
11d0: 67 65 72 0a 20 20 2a 2a 20 63 68 75 6e 6b 73 2e  ger.  ** chunks.
11e0: 0a 20 20 2a 2f 0a 20 20 75 33 32 20 61 69 53 6d  .  */.  u32 aiSm
11f0: 61 6c 6c 5b 4d 58 5f 53 4d 41 4c 4c 2d 31 5d 3b  all[MX_SMALL-1];
1200: 20 20 20 2f 2a 20 46 6f 72 20 73 69 7a 65 73 20     /* For sizes 
1210: 32 20 74 68 72 6f 75 67 68 20 4d 58 5f 53 4d 41  2 through MX_SMA
1220: 4c 4c 2c 20 69 6e 63 6c 75 73 69 76 65 20 2a 2f  LL, inclusive */
1230: 0a 20 20 75 33 32 20 61 69 48 61 73 68 5b 4e 5f  .  u32 aiHash[N_
1240: 48 41 53 48 5d 3b 20 20 20 20 20 20 20 20 2f 2a  HASH];        /*
1250: 20 46 6f 72 20 73 69 7a 65 73 20 4d 58 5f 53 4d   For sizes MX_SM
1260: 41 4c 4c 2b 31 20 61 6e 64 20 6c 61 72 67 65 72  ALL+1 and larger
1270: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d   */..  /*.  ** M
1280: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
1290: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  for allocation. 
12a0: 6e 50 6f 6f 6c 20 69 73 20 74 68 65 20 73 69 7a  nPool is the siz
12b0: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 0a 20  e of the array. 
12c0: 20 2a 2a 20 28 69 6e 20 4d 65 6d 33 42 6c 6f 63   ** (in Mem3Bloc
12d0: 6b 73 29 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ks) pointed to b
12e0: 79 20 61 50 6f 6f 6c 20 6c 65 73 73 20 32 2e 0a  y aPool less 2..
12f0: 20 20 2a 2f 0a 20 20 75 33 32 20 6e 50 6f 6f 6c    */.  u32 nPool
1300: 3b 0a 20 20 4d 65 6d 33 42 6c 6f 63 6b 20 2a 61  ;.  Mem3Block *a
1310: 50 6f 6f 6c 3b 0a 20 20 2f 2a 20 4d 65 6d 33 42  Pool;.  /* Mem3B
1320: 6c 6f 63 6b 20 61 50 6f 6f 6c 5b 53 51 4c 49 54  lock aPool[SQLIT
1330: 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f 73 69  E_MEMORY_SIZE/si
1340: 7a 65 6f 66 28 4d 65 6d 33 42 6c 6f 63 6b 29 2b  zeof(Mem3Block)+
1350: 32 5d 3b 20 2a 2f 0a 7d 20 6d 65 6d 33 3b 0a 0a  2]; */.} mem3;..
1360: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
1370: 20 63 68 75 6e 6b 20 61 74 20 6d 65 6d 33 2e 61   chunk at mem3.a
1380: 50 6f 6f 6c 5b 69 5d 20 66 72 6f 6d 20 6c 69 73  Pool[i] from lis
1390: 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
13a0: 79 0a 2a 2a 20 6f 6e 2e 20 20 2a 70 52 6f 6f 74  y.** on.  *pRoot
13b0: 20 69 73 20 74 68 65 20 6c 69 73 74 20 74 68 61   is the list tha
13c0: 74 20 69 20 69 73 20 61 20 6d 65 6d 62 65 72 20  t i is a member 
13d0: 6f 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  of..*/.static vo
13e0: 69 64 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b  id memsys3Unlink
13f0: 46 72 6f 6d 4c 69 73 74 28 75 33 32 20 69 2c 20  FromList(u32 i, 
1400: 75 33 32 20 2a 70 52 6f 6f 74 29 7b 0a 20 20 75  u32 *pRoot){.  u
1410: 33 32 20 6e 65 78 74 20 3d 20 6d 65 6d 33 2e 61  32 next = mem3.a
1420: 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e  Pool[i].u.list.n
1430: 65 78 74 3b 0a 20 20 75 33 32 20 70 72 65 76 20  ext;.  u32 prev 
1440: 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e  = mem3.aPool[i].
1450: 75 2e 6c 69 73 74 2e 70 72 65 76 3b 0a 20 20 61  u.list.prev;.  a
1460: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1470: 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d  utex_held(mem3.m
1480: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
1490: 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  rev==0 ){.    *p
14a0: 52 6f 6f 74 20 3d 20 6e 65 78 74 3b 0a 20 20 7d  Root = next;.  }
14b0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 33 2e 61  else{.    mem3.a
14c0: 50 6f 6f 6c 5b 70 72 65 76 5d 2e 75 2e 6c 69 73  Pool[prev].u.lis
14d0: 74 2e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  t.next = next;. 
14e0: 20 7d 0a 20 20 69 66 28 20 6e 65 78 74 20 29 7b   }.  if( next ){
14f0: 0a 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  .    mem3.aPool[
1500: 6e 65 78 74 5d 2e 75 2e 6c 69 73 74 2e 70 72 65  next].u.list.pre
1510: 76 20 3d 20 70 72 65 76 3b 0a 20 20 7d 0a 20 20  v = prev;.  }.  
1520: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e  mem3.aPool[i].u.
1530: 6c 69 73 74 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  list.next = 0;. 
1540: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75   mem3.aPool[i].u
1550: 2e 6c 69 73 74 2e 70 72 65 76 20 3d 20 30 3b 0a  .list.prev = 0;.
1560: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
1570: 74 68 65 20 63 68 75 6e 6b 20 61 74 20 69 6e 64  the chunk at ind
1580: 65 78 20 69 20 66 72 6f 6d 20 0a 2a 2a 20 77 68  ex i from .** wh
1590: 61 74 65 76 65 72 20 6c 69 73 74 20 69 73 20 63  atever list is c
15a0: 75 72 72 65 6e 74 6c 79 20 61 20 6d 65 6d 62 65  urrently a membe
15b0: 72 20 6f 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  r of..*/.static 
15c0: 76 6f 69 64 20 6d 65 6d 73 79 73 33 55 6e 6c 69  void memsys3Unli
15d0: 6e 6b 28 75 33 32 20 69 29 7b 0a 20 20 75 33 32  nk(u32 i){.  u32
15e0: 20 73 69 7a 65 2c 20 68 61 73 68 3b 0a 20 20 61   size, hash;.  a
15f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1600: 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d  utex_held(mem3.m
1610: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1620: 74 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  t( (mem3.aPool[i
1630: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
1640: 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 61 73   & 1)==0 );.  as
1650: 73 65 72 74 28 20 69 3e 3d 31 20 29 3b 0a 20 20  sert( i>=1 );.  
1660: 73 69 7a 65 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f  size = mem3.aPoo
1670: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[i-1].u.hdr.siz
1680: 65 34 78 2f 34 3b 0a 20 20 61 73 73 65 72 74 28  e4x/4;.  assert(
1690: 20 73 69 7a 65 3d 3d 6d 65 6d 33 2e 61 50 6f 6f   size==mem3.aPoo
16a0: 6c 5b 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e 68 64  l[i+size-1].u.hd
16b0: 72 2e 70 72 65 76 53 69 7a 65 20 29 3b 0a 20 20  r.prevSize );.  
16c0: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 32 20  assert( size>=2 
16d0: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 20 3c 3d  );.  if( size <=
16e0: 20 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20 20 20   MX_SMALL ){.   
16f0: 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72   memsys3UnlinkFr
1700: 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 33 2e  omList(i, &mem3.
1710: 61 69 53 6d 61 6c 6c 5b 73 69 7a 65 2d 32 5d 29  aiSmall[size-2])
1720: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  ;.  }else{.    h
1730: 61 73 68 20 3d 20 73 69 7a 65 20 25 20 4e 5f 48  ash = size % N_H
1740: 41 53 48 3b 0a 20 20 20 20 6d 65 6d 73 79 73 33  ASH;.    memsys3
1750: 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74 28 69  UnlinkFromList(i
1760: 2c 20 26 6d 65 6d 33 2e 61 69 48 61 73 68 5b 68  , &mem3.aiHash[h
1770: 61 73 68 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ash]);.  }.}../*
1780: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 63 68 75  .** Link the chu
1790: 6e 6b 20 61 74 20 6d 65 6d 33 2e 61 50 6f 6f 6c  nk at mem3.aPool
17a0: 5b 69 5d 20 73 6f 20 74 68 61 74 20 69 73 20 6f  [i] so that is o
17b0: 6e 20 74 68 65 20 6c 69 73 74 20 72 6f 6f 74 65  n the list roote
17c0: 64 0a 2a 2a 20 61 74 20 2a 70 52 6f 6f 74 2e 0a  d.** at *pRoot..
17d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
17e0: 65 6d 73 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69  emsys3LinkIntoLi
17f0: 73 74 28 75 33 32 20 69 2c 20 75 33 32 20 2a 70  st(u32 i, u32 *p
1800: 52 6f 6f 74 29 7b 0a 20 20 61 73 73 65 72 74 28  Root){.  assert(
1810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1820: 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20  eld(mem3.mutex) 
1830: 29 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  );.  mem3.aPool[
1840: 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 20 3d  i].u.list.next =
1850: 20 2a 70 52 6f 6f 74 3b 0a 20 20 6d 65 6d 33 2e   *pRoot;.  mem3.
1860: 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e  aPool[i].u.list.
1870: 70 72 65 76 20 3d 20 30 3b 0a 20 20 69 66 28 20  prev = 0;.  if( 
1880: 2a 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20 6d 65  *pRoot ){.    me
1890: 6d 33 2e 61 50 6f 6f 6c 5b 2a 70 52 6f 6f 74 5d  m3.aPool[*pRoot]
18a0: 2e 75 2e 6c 69 73 74 2e 70 72 65 76 20 3d 20 69  .u.list.prev = i
18b0: 3b 0a 20 20 7d 0a 20 20 2a 70 52 6f 6f 74 20 3d  ;.  }.  *pRoot =
18c0: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e   i;.}../*.** Lin
18d0: 6b 20 74 68 65 20 63 68 75 6e 6b 20 61 74 20 69  k the chunk at i
18e0: 6e 64 65 78 20 69 20 69 6e 74 6f 20 65 69 74 68  ndex i into eith
18f0: 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  er the appropria
1900: 74 65 0a 2a 2a 20 73 6d 61 6c 6c 20 63 68 75 6e  te.** small chun
1910: 6b 20 6c 69 73 74 2c 20 6f 72 20 69 6e 74 6f 20  k list, or into 
1920: 74 68 65 20 6c 61 72 67 65 20 63 68 75 6e 6b 20  the large chunk 
1930: 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hash table..*/.s
1940: 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79  tatic void memsy
1950: 73 33 4c 69 6e 6b 28 75 33 32 20 69 29 7b 0a 20  s3Link(u32 i){. 
1960: 20 75 33 32 20 73 69 7a 65 2c 20 68 61 73 68 3b   u32 size, hash;
1970: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1980: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65  e3_mutex_held(me
1990: 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  m3.mutex) );.  a
19a0: 73 73 65 72 74 28 20 69 3e 3d 31 20 29 3b 0a 20  ssert( i>=1 );. 
19b0: 20 61 73 73 65 72 74 28 20 28 6d 65 6d 33 2e 61   assert( (mem3.a
19c0: 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e  Pool[i-1].u.hdr.
19d0: 73 69 7a 65 34 78 20 26 20 31 29 3d 3d 30 20 29  size4x & 1)==0 )
19e0: 3b 0a 20 20 73 69 7a 65 20 3d 20 6d 65 6d 33 2e  ;.  size = mem3.
19f0: 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72  aPool[i-1].u.hdr
1a00: 2e 73 69 7a 65 34 78 2f 34 3b 0a 20 20 61 73 73  .size4x/4;.  ass
1a10: 65 72 74 28 20 73 69 7a 65 3d 3d 6d 65 6d 33 2e  ert( size==mem3.
1a20: 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31 5d 2e  aPool[i+size-1].
1a30: 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 29  u.hdr.prevSize )
1a40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
1a50: 3e 3d 32 20 29 3b 0a 20 20 69 66 28 20 73 69 7a  >=2 );.  if( siz
1a60: 65 20 3c 3d 20 4d 58 5f 53 4d 41 4c 4c 20 29 7b  e <= MX_SMALL ){
1a70: 0a 20 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e 6b  .    memsys3Link
1a80: 49 6e 74 6f 4c 69 73 74 28 69 2c 20 26 6d 65 6d  IntoList(i, &mem
1a90: 33 2e 61 69 53 6d 61 6c 6c 5b 73 69 7a 65 2d 32  3.aiSmall[size-2
1aa0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
1ab0: 20 68 61 73 68 20 3d 20 73 69 7a 65 20 25 20 4e   hash = size % N
1ac0: 5f 48 41 53 48 3b 0a 20 20 20 20 6d 65 6d 73 79  _HASH;.    memsy
1ad0: 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69 73 74 28 69  s3LinkIntoList(i
1ae0: 2c 20 26 6d 65 6d 33 2e 61 69 48 61 73 68 5b 68  , &mem3.aiHash[h
1af0: 61 73 68 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ash]);.  }.}../*
1b00: 0a 2a 2a 20 49 66 20 74 68 65 20 53 54 41 54 49  .** If the STATI
1b10: 43 5f 4d 45 4d 20 6d 75 74 65 78 20 69 73 20 6e  C_MEM mutex is n
1b20: 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
1b30: 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 20   obtain it now. 
1b40: 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 77 69 6c  The mutex.** wil
1b50: 6c 20 61 6c 72 65 61 64 79 20 62 65 20 68 65 6c  l already be hel
1b60: 64 20 28 6f 62 74 61 69 6e 65 64 20 62 79 20 63  d (obtained by c
1b70: 6f 64 65 20 69 6e 20 6d 61 6c 6c 6f 63 2e 63 29  ode in malloc.c)
1b80: 20 69 66 0a 2a 2a 20 73 71 6c 69 74 65 33 43 6f   if.** sqlite3Co
1b90: 6e 66 69 67 2e 62 4d 65 6d 53 74 61 74 20 69 73  nfig.bMemStat is
1ba0: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1bb0: 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 45 6e 74   void memsys3Ent
1bc0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
1bd0: 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 4d  sqlite3Config.bM
1be0: 65 6d 73 74 61 74 3d 3d 30 20 26 26 20 6d 65 6d  emstat==0 && mem
1bf0: 33 2e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  3.mutex==0 ){.  
1c00: 20 20 6d 65 6d 33 2e 6d 75 74 65 78 20 3d 20 73    mem3.mutex = s
1c10: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1c20: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1c30: 41 54 49 43 5f 4d 45 4d 29 3b 0a 20 20 7d 0a 20  ATIC_MEM);.  }. 
1c40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c50: 6e 74 65 72 28 6d 65 6d 33 2e 6d 75 74 65 78 29  nter(mem3.mutex)
1c60: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1c70: 6d 65 6d 73 79 73 33 4c 65 61 76 65 28 76 6f 69  memsys3Leave(voi
1c80: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1c90: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 33 2e 6d  tex_leave(mem3.m
1ca0: 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  utex);.}../*.** 
1cb0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 77 65 20 61  Called when we a
1cc0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
1cd0: 69 73 66 79 20 61 6e 20 61 6c 6c 6f 63 61 74 69  isfy an allocati
1ce0: 6f 6e 20 6f 66 20 6e 42 79 74 65 73 2e 0a 2a 2f  on of nBytes..*/
1cf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
1d00: 73 79 73 33 4f 75 74 4f 66 4d 65 6d 6f 72 79 28  sys3OutOfMemory(
1d10: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  int nByte){.  if
1d20: 28 20 21 6d 65 6d 33 2e 61 6c 61 72 6d 42 75 73  ( !mem3.alarmBus
1d30: 79 20 29 7b 0a 20 20 20 20 6d 65 6d 33 2e 61 6c  y ){.    mem3.al
1d40: 61 72 6d 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  armBusy = 1;.   
1d50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33  _mutex_held(mem3
1d70: 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  .mutex) );.    s
1d80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1d90: 76 65 28 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0a  ve(mem3.mutex);.
1da0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65      sqlite3_rele
1db0: 61 73 65 5f 6d 65 6d 6f 72 79 28 6e 42 79 74 65  ase_memory(nByte
1dc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
1dd0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 33 2e  utex_enter(mem3.
1de0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 6d 65 6d 33  mutex);.    mem3
1df0: 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20 30 3b 0a  .alarmBusy = 0;.
1e00: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68    }.}.../*.** Ch
1e10: 75 6e 6b 20 69 20 69 73 20 61 20 66 72 65 65 20  unk i is a free 
1e20: 63 68 75 6e 6b 20 74 68 61 74 20 68 61 73 20 62  chunk that has b
1e30: 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 20 20 41  een unlinked.  A
1e40: 64 6a 75 73 74 20 69 74 73 20 0a 2a 2a 20 73 69  djust its .** si
1e50: 7a 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ze parameters fo
1e60: 72 20 63 68 65 63 6b 2d 6f 75 74 20 61 6e 64 20  r check-out and 
1e70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1e80: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 75 73 65 72   to the .** user
1e90: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1ea0: 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  chunk..*/.static
1eb0: 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 33 43 68   void *memsys3Ch
1ec0: 65 63 6b 6f 75 74 28 75 33 32 20 69 2c 20 69 6e  eckout(u32 i, in
1ed0: 74 20 6e 42 6c 6f 63 6b 29 7b 0a 20 20 75 33 32  t nBlock){.  u32
1ee0: 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   x;.  assert( sq
1ef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1f00: 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a  (mem3.mutex) );.
1f10: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 31 20 29    assert( i>=1 )
1f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 33  ;.  assert( mem3
1f30: 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64  .aPool[i-1].u.hd
1f40: 72 2e 73 69 7a 65 34 78 2f 34 3d 3d 6e 42 6c 6f  r.size4x/4==nBlo
1f50: 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ck );.  assert( 
1f60: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 6e 42 6c  mem3.aPool[i+nBl
1f70: 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65  ock-1].u.hdr.pre
1f80: 76 53 69 7a 65 3d 3d 6e 42 6c 6f 63 6b 20 29 3b  vSize==nBlock );
1f90: 0a 20 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f  .  x = mem3.aPoo
1fa0: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[i-1].u.hdr.siz
1fb0: 65 34 78 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f  e4x;.  mem3.aPoo
1fc0: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[i-1].u.hdr.siz
1fd0: 65 34 78 20 3d 20 6e 42 6c 6f 63 6b 2a 34 20 7c  e4x = nBlock*4 |
1fe0: 20 31 20 7c 20 28 78 26 32 29 3b 0a 20 20 6d 65   1 | (x&2);.  me
1ff0: 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 6e 42 6c 6f 63  m3.aPool[i+nBloc
2000: 6b 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53  k-1].u.hdr.prevS
2010: 69 7a 65 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20  ize = nBlock;.  
2020: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 6e 42 6c  mem3.aPool[i+nBl
2030: 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ock-1].u.hdr.siz
2040: 65 34 78 20 7c 3d 20 32 3b 0a 20 20 72 65 74 75  e4x |= 2;.  retu
2050: 72 6e 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  rn &mem3.aPool[i
2060: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 72 76  ];.}../*.** Carv
2070: 65 20 61 20 70 69 65 63 65 20 6f 66 66 20 6f 66  e a piece off of
2080: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2090: 6d 65 6d 33 2e 69 4d 61 73 74 65 72 20 66 72 65  mem3.iMaster fre
20a0: 65 20 63 68 75 6e 6b 2e 0a 2a 2a 20 52 65 74 75  e chunk..** Retu
20b0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20c0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
20d0: 6f 6e 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20  on.  Or, if the 
20e0: 6d 61 73 74 65 72 20 63 68 75 6e 6b 0a 2a 2a 20  master chunk.** 
20f0: 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f  is not large eno
2100: 75 67 68 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ugh, return 0..*
2110: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d  /.static void *m
2120: 65 6d 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72  emsys3FromMaster
2130: 28 69 6e 74 20 6e 42 6c 6f 63 6b 29 7b 0a 20 20  (int nBlock){.  
2140: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2150: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e  mutex_held(mem3.
2160: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2170: 72 74 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65  rt( mem3.szMaste
2180: 72 3e 3d 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 69  r>=nBlock );.  i
2190: 66 28 20 6e 42 6c 6f 63 6b 3e 3d 6d 65 6d 33 2e  f( nBlock>=mem3.
21a0: 73 7a 4d 61 73 74 65 72 2d 31 20 29 7b 0a 20 20  szMaster-1 ){.  
21b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 65 6e 74    /* Use the ent
21c0: 69 72 65 20 6d 61 73 74 65 72 20 2a 2f 0a 20 20  ire master */.  
21d0: 20 20 76 6f 69 64 20 2a 70 20 3d 20 6d 65 6d 73    void *p = mems
21e0: 79 73 33 43 68 65 63 6b 6f 75 74 28 6d 65 6d 33  ys3Checkout(mem3
21f0: 2e 69 4d 61 73 74 65 72 2c 20 6d 65 6d 33 2e 73  .iMaster, mem3.s
2200: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 6d 65  zMaster);.    me
2210: 6d 33 2e 69 4d 61 73 74 65 72 20 3d 20 30 3b 0a  m3.iMaster = 0;.
2220: 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65      mem3.szMaste
2230: 72 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 33 2e  r = 0;.    mem3.
2240: 6d 6e 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  mnMaster = 0;.  
2250: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 65    return p;.  }e
2260: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 70 6c 69  lse{.    /* Spli
2270: 74 20 74 68 65 20 6d 61 73 74 65 72 20 62 6c 6f  t the master blo
2280: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ck.  Return the 
2290: 74 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 75 33 32  tail. */.    u32
22a0: 20 6e 65 77 69 2c 20 78 3b 0a 20 20 20 20 6e 65   newi, x;.    ne
22b0: 77 69 20 3d 20 6d 65 6d 33 2e 69 4d 61 73 74 65  wi = mem3.iMaste
22c0: 72 20 2b 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65  r + mem3.szMaste
22d0: 72 20 2d 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20  r - nBlock;.    
22e0: 61 73 73 65 72 74 28 20 6e 65 77 69 20 3e 20 6d  assert( newi > m
22f0: 65 6d 33 2e 69 4d 61 73 74 65 72 2b 31 20 29 3b  em3.iMaster+1 );
2300: 0a 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  .    mem3.aPool[
2310: 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d 65 6d  mem3.iMaster+mem
2320: 33 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e  3.szMaster-1].u.
2330: 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 6e  hdr.prevSize = n
2340: 42 6c 6f 63 6b 3b 0a 20 20 20 20 6d 65 6d 33 2e  Block;.    mem3.
2350: 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74  aPool[mem3.iMast
2360: 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72  er+mem3.szMaster
2370: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
2380: 20 7c 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 33 2e   |= 2;.    mem3.
2390: 61 50 6f 6f 6c 5b 6e 65 77 69 2d 31 5d 2e 75 2e  aPool[newi-1].u.
23a0: 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6e 42 6c  hdr.size4x = nBl
23b0: 6f 63 6b 2a 34 20 2b 20 31 3b 0a 20 20 20 20 6d  ock*4 + 1;.    m
23c0: 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20 2d 3d 20  em3.szMaster -= 
23d0: 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20 6d 65 6d 33  nBlock;.    mem3
23e0: 2e 61 50 6f 6f 6c 5b 6e 65 77 69 2d 31 5d 2e 75  .aPool[newi-1].u
23f0: 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20  .hdr.prevSize = 
2400: 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3b 0a 20  mem3.szMaster;. 
2410: 20 20 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f     x = mem3.aPoo
2420: 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31  l[mem3.iMaster-1
2430: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26  ].u.hdr.size4x &
2440: 20 32 3b 0a 20 20 20 20 6d 65 6d 33 2e 61 50 6f   2;.    mem3.aPo
2450: 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d  ol[mem3.iMaster-
2460: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20  1].u.hdr.size4x 
2470: 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2a  = mem3.szMaster*
2480: 34 20 7c 20 78 3b 0a 20 20 20 20 69 66 28 20 6d  4 | x;.    if( m
2490: 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20 3c 20 6d  em3.szMaster < m
24a0: 65 6d 33 2e 6d 6e 4d 61 73 74 65 72 20 29 7b 0a  em3.mnMaster ){.
24b0: 20 20 20 20 20 20 6d 65 6d 33 2e 6d 6e 4d 61 73        mem3.mnMas
24c0: 74 65 72 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73  ter = mem3.szMas
24d0: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ter;.    }.    r
24e0: 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 26 6d 65  eturn (void*)&me
24f0: 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 77 69 5d 3b 0a  m3.aPool[newi];.
2500: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 2a 70 52    }.}../*.** *pR
2510: 6f 6f 74 20 69 73 20 74 68 65 20 68 65 61 64 20  oot is the head 
2520: 6f 66 20 61 20 6c 69 73 74 20 6f 66 20 66 72 65  of a list of fre
2530: 65 20 63 68 75 6e 6b 73 20 6f 66 20 74 68 65 20  e chunks of the 
2540: 73 61 6d 65 20 73 69 7a 65 0a 2a 2a 20 6f 72 20  same size.** or 
2550: 73 61 6d 65 20 73 69 7a 65 20 68 61 73 68 2e 20  same size hash. 
2560: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2570: 20 2a 70 52 6f 6f 74 20 69 73 20 61 6e 20 65 6e   *pRoot is an en
2580: 74 72 79 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  try in either.**
2590: 20 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 5d 20   mem3.aiSmall[] 
25a0: 6f 72 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b 5d  or mem3.aiHash[]
25b0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
25c0: 6f 75 74 69 6e 65 20 65 78 61 6d 69 6e 65 73 20  outine examines 
25d0: 61 6c 6c 20 65 6e 74 72 69 65 73 20 6f 6e 20 74  all entries on t
25e0: 68 65 20 67 69 76 65 6e 20 6c 69 73 74 20 61 6e  he given list an
25f0: 64 20 74 72 69 65 73 0a 2a 2a 20 74 6f 20 63 6f  d tries.** to co
2600: 61 6c 65 73 63 65 20 65 61 63 68 20 65 6e 74 72  alesce each entr
2610: 69 65 73 20 77 69 74 68 20 61 64 6a 61 63 65 6e  ies with adjacen
2620: 74 20 66 72 65 65 20 63 68 75 6e 6b 73 2e 20 20  t free chunks.  
2630: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 73 65 65  .**.** If it see
2640: 73 20 61 20 63 68 75 6e 6b 20 74 68 61 74 20 69  s a chunk that i
2650: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6d 65  s larger than me
2660: 6d 33 2e 69 4d 61 73 74 65 72 2c 20 69 74 20 72  m3.iMaster, it r
2670: 65 70 6c 61 63 65 73 20 0a 2a 2a 20 74 68 65 20  eplaces .** the 
2680: 63 75 72 72 65 6e 74 20 6d 65 6d 33 2e 69 4d 61  current mem3.iMa
2690: 73 74 65 72 20 77 69 74 68 20 74 68 65 20 6e 65  ster with the ne
26a0: 77 20 6c 61 72 67 65 72 20 63 68 75 6e 6b 2e 20  w larger chunk. 
26b0: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 0a 2a 2a   In order for.**
26c0: 20 74 68 69 73 20 6d 65 6d 33 2e 69 4d 61 73 74   this mem3.iMast
26d0: 65 72 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 74  er replacement t
26e0: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 6d 61 73 74  o work, the mast
26f0: 65 72 20 63 68 75 6e 6b 20 6d 75 73 74 20 62 65  er chunk must be
2700: 0a 2a 2a 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20  .** linked into 
2710: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 2e  the hash tables.
2720: 20 20 54 68 61 74 20 69 73 20 6e 6f 74 20 74 68    That is not th
2730: 65 20 6e 6f 72 6d 61 6c 20 73 74 61 74 65 20 6f  e normal state o
2740: 66 0a 2a 2a 20 61 66 66 61 69 72 73 2c 20 6f 66  f.** affairs, of
2750: 20 63 6f 75 72 73 65 2e 20 20 54 68 65 20 63 61   course.  The ca
2760: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
2770: 73 74 20 6c 69 6e 6b 20 74 68 65 20 6d 61 73 74  st link the mast
2780: 65 72 0a 2a 2a 20 63 68 75 6e 6b 20 62 65 66 6f  er.** chunk befo
2790: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  re invoking this
27a0: 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 6d   routine, then m
27b0: 75 73 74 20 75 6e 6c 69 6e 6b 20 74 68 65 20 28  ust unlink the (
27c0: 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 63 68 61 6e  possibly.** chan
27d0: 67 65 64 29 20 6d 61 73 74 65 72 20 63 68 75 6e  ged) master chun
27e0: 6b 20 6f 6e 63 65 20 74 68 69 73 20 72 6f 75 74  k once this rout
27f0: 69 6e 65 20 68 61 73 20 66 69 6e 69 73 68 65 64  ine has finished
2800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2810: 20 6d 65 6d 73 79 73 33 4d 65 72 67 65 28 75 33   memsys3Merge(u3
2820: 32 20 2a 70 52 6f 6f 74 29 7b 0a 20 20 75 33 32  2 *pRoot){.  u32
2830: 20 69 4e 65 78 74 2c 20 70 72 65 76 2c 20 73 69   iNext, prev, si
2840: 7a 65 2c 20 69 2c 20 78 3b 0a 0a 20 20 61 73 73  ze, i, x;..  ass
2850: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2860: 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74  ex_held(mem3.mut
2870: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 2a  ex) );.  for(i=*
2880: 70 52 6f 6f 74 3b 20 69 3e 30 3b 20 69 3d 69 4e  pRoot; i>0; i=iN
2890: 65 78 74 29 7b 0a 20 20 20 20 69 4e 65 78 74 20  ext){.    iNext 
28a0: 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e  = mem3.aPool[i].
28b0: 75 2e 6c 69 73 74 2e 6e 65 78 74 3b 0a 20 20 20  u.list.next;.   
28c0: 20 73 69 7a 65 20 3d 20 6d 65 6d 33 2e 61 50 6f   size = mem3.aPo
28d0: 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ol[i-1].u.hdr.si
28e0: 7a 65 34 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ze4x;.    assert
28f0: 28 20 28 73 69 7a 65 26 31 29 3d 3d 30 20 29 3b  ( (size&1)==0 );
2900: 0a 20 20 20 20 69 66 28 20 28 73 69 7a 65 26 32  .    if( (size&2
2910: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
2920: 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c  msys3UnlinkFromL
2930: 69 73 74 28 69 2c 20 70 52 6f 6f 74 29 3b 0a 20  ist(i, pRoot);. 
2940: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 20 3e       assert( i >
2950: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d   mem3.aPool[i-1]
2960: 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20  .u.hdr.prevSize 
2970: 29 3b 0a 20 20 20 20 20 20 70 72 65 76 20 3d 20  );.      prev = 
2980: 69 20 2d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  i - mem3.aPool[i
2990: 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69  -1].u.hdr.prevSi
29a0: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 72  ze;.      if( pr
29b0: 65 76 3d 3d 69 4e 65 78 74 20 29 7b 0a 20 20 20  ev==iNext ){.   
29c0: 20 20 20 20 20 69 4e 65 78 74 20 3d 20 6d 65 6d       iNext = mem
29d0: 33 2e 61 50 6f 6f 6c 5b 70 72 65 76 5d 2e 75 2e  3.aPool[prev].u.
29e0: 6c 69 73 74 2e 6e 65 78 74 3b 0a 20 20 20 20 20  list.next;.     
29f0: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33   }.      memsys3
2a00: 55 6e 6c 69 6e 6b 28 70 72 65 76 29 3b 0a 20 20  Unlink(prev);.  
2a10: 20 20 20 20 73 69 7a 65 20 3d 20 69 20 2b 20 73      size = i + s
2a20: 69 7a 65 2f 34 20 2d 20 70 72 65 76 3b 0a 20 20  ize/4 - prev;.  
2a30: 20 20 20 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f      x = mem3.aPo
2a40: 6f 6c 5b 70 72 65 76 2d 31 5d 2e 75 2e 68 64 72  ol[prev-1].u.hdr
2a50: 2e 73 69 7a 65 34 78 20 26 20 32 3b 0a 20 20 20  .size4x & 2;.   
2a60: 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 70 72     mem3.aPool[pr
2a70: 65 76 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65  ev-1].u.hdr.size
2a80: 34 78 20 3d 20 73 69 7a 65 2a 34 20 7c 20 78 3b  4x = size*4 | x;
2a90: 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f  .      mem3.aPoo
2aa0: 6c 5b 70 72 65 76 2b 73 69 7a 65 2d 31 5d 2e 75  l[prev+size-1].u
2ab0: 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20  .hdr.prevSize = 
2ac0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 73  size;.      mems
2ad0: 79 73 33 4c 69 6e 6b 28 70 72 65 76 29 3b 0a 20  ys3Link(prev);. 
2ae0: 20 20 20 20 20 69 20 3d 20 70 72 65 76 3b 0a 20       i = prev;. 
2af0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b00: 73 69 7a 65 20 2f 3d 20 34 3b 0a 20 20 20 20 7d  size /= 4;.    }
2b10: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3e 6d 65  .    if( size>me
2b20: 6d 33 2e 73 7a 4d 61 73 74 65 72 20 29 7b 0a 20  m3.szMaster ){. 
2b30: 20 20 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65       mem3.iMaste
2b40: 72 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 65 6d  r = i;.      mem
2b50: 33 2e 73 7a 4d 61 73 74 65 72 20 3d 20 73 69 7a  3.szMaster = siz
2b60: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  e;.    }.  }.}..
2b70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
2b80: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 6f  lock of memory o
2b90: 66 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  f at least nByte
2ba0: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 52 65  s in size..** Re
2bb0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 75 6e 61  turn NULL if una
2bc0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
2bd0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
2be0: 20 74 68 61 74 20 74 68 65 20 6e 65 63 65 73 73   that the necess
2bf0: 61 72 79 20 6d 75 74 65 78 65 73 2c 20 69 66 20  ary mutexes, if 
2c00: 61 6e 79 2c 20 61 72 65 0a 2a 2a 20 61 6c 72 65  any, are.** alre
2c10: 61 64 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ady held by the 
2c20: 63 61 6c 6c 65 72 2e 20 48 65 6e 63 65 20 22 55  caller. Hence "U
2c30: 6e 73 61 66 65 22 2e 0a 2a 2f 0a 73 74 61 74 69  nsafe"..*/.stati
2c40: 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 33 4d  c void *memsys3M
2c50: 61 6c 6c 6f 63 55 6e 73 61 66 65 28 69 6e 74 20  allocUnsafe(int 
2c60: 6e 42 79 74 65 29 7b 0a 20 20 75 33 32 20 69 3b  nByte){.  u32 i;
2c70: 0a 20 20 69 6e 74 20 6e 42 6c 6f 63 6b 3b 0a 20  .  int nBlock;. 
2c80: 20 69 6e 74 20 74 6f 46 72 65 65 3b 0a 0a 20 20   int toFree;..  
2c90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ca0: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e  mutex_held(mem3.
2cb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2cc0: 72 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 33 42  rt( sizeof(Mem3B
2cd0: 6c 6f 63 6b 29 3d 3d 38 20 29 3b 0a 20 20 69 66  lock)==8 );.  if
2ce0: 28 20 6e 42 79 74 65 3c 3d 31 32 20 29 7b 0a 20  ( nByte<=12 ){. 
2cf0: 20 20 20 6e 42 6c 6f 63 6b 20 3d 20 32 3b 0a 20     nBlock = 2;. 
2d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 42 6c 6f   }else{.    nBlo
2d10: 63 6b 20 3d 20 28 6e 42 79 74 65 20 2b 20 31 31  ck = (nByte + 11
2d20: 29 2f 38 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  )/8;.  }.  asser
2d30: 74 28 20 6e 42 6c 6f 63 6b 3e 3d 32 20 29 3b 0a  t( nBlock>=2 );.
2d40: 0a 20 20 2f 2a 20 53 54 45 50 20 31 3a 0a 20 20  .  /* STEP 1:.  
2d50: 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65  ** Look for an e
2d60: 6e 74 72 79 20 6f 66 20 74 68 65 20 63 6f 72 72  ntry of the corr
2d70: 65 63 74 20 73 69 7a 65 20 69 6e 20 65 69 74 68  ect size in eith
2d80: 65 72 20 74 68 65 20 73 6d 61 6c 6c 0a 20 20 2a  er the small.  *
2d90: 2a 20 63 68 75 6e 6b 20 74 61 62 6c 65 20 6f 72  * chunk table or
2da0: 20 69 6e 20 74 68 65 20 6c 61 72 67 65 20 63 68   in the large ch
2db0: 75 6e 6b 20 68 61 73 68 20 74 61 62 6c 65 2e 20  unk hash table. 
2dc0: 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 73 75   This is.  ** su
2dd0: 63 63 65 73 73 66 75 6c 20 6d 6f 73 74 20 6f 66  ccessful most of
2de0: 20 74 68 65 20 74 69 6d 65 20 28 61 62 6f 75 74   the time (about
2df0: 20 39 20 74 69 6d 65 73 20 6f 75 74 20 6f 66 20   9 times out of 
2e00: 31 30 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  10)..  */.  if( 
2e10: 6e 42 6c 6f 63 6b 20 3c 3d 20 4d 58 5f 53 4d 41  nBlock <= MX_SMA
2e20: 4c 4c 20 29 7b 0a 20 20 20 20 69 20 3d 20 6d 65  LL ){.    i = me
2e30: 6d 33 2e 61 69 53 6d 61 6c 6c 5b 6e 42 6c 6f 63  m3.aiSmall[nBloc
2e40: 6b 2d 32 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e  k-2];.    if( i>
2e50: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79  0 ){.      memsy
2e60: 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74  s3UnlinkFromList
2e70: 28 69 2c 20 26 6d 65 6d 33 2e 61 69 53 6d 61 6c  (i, &mem3.aiSmal
2e80: 6c 5b 6e 42 6c 6f 63 6b 2d 32 5d 29 3b 0a 20 20  l[nBlock-2]);.  
2e90: 20 20 20 20 72 65 74 75 72 6e 20 6d 65 6d 73 79      return memsy
2ea0: 73 33 43 68 65 63 6b 6f 75 74 28 69 2c 20 6e 42  s3Checkout(i, nB
2eb0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lock);.    }.  }
2ec0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 61  else{.    int ha
2ed0: 73 68 20 3d 20 6e 42 6c 6f 63 6b 20 25 20 4e 5f  sh = nBlock % N_
2ee0: 48 41 53 48 3b 0a 20 20 20 20 66 6f 72 28 69 3d  HASH;.    for(i=
2ef0: 6d 65 6d 33 2e 61 69 48 61 73 68 5b 68 61 73 68  mem3.aiHash[hash
2f00: 5d 3b 20 69 3e 30 3b 20 69 3d 6d 65 6d 33 2e 61  ]; i>0; i=mem3.a
2f10: 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e  Pool[i].u.list.n
2f20: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
2f30: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e  mem3.aPool[i-1].
2f40: 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3d 3d  u.hdr.size4x/4==
2f50: 6e 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  nBlock ){.      
2f60: 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46    memsys3UnlinkF
2f70: 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 33  romList(i, &mem3
2f80: 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b 0a  .aiHash[hash]);.
2f90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
2fa0: 65 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 69  emsys3Checkout(i
2fb0: 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , nBlock);.     
2fc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2fd0: 2f 2a 20 53 54 45 50 20 32 3a 0a 20 20 2a 2a 20  /* STEP 2:.  ** 
2fe0: 54 72 79 20 74 6f 20 73 61 74 69 73 66 79 20 74  Try to satisfy t
2ff0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 62 79  he allocation by
3000: 20 63 61 72 76 69 6e 67 20 61 20 70 69 65 63 65   carving a piece
3010: 20 6f 66 66 20 6f 66 20 74 68 65 20 65 6e 64 0a   off of the end.
3020: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 73 74    ** of the mast
3030: 65 72 20 63 68 75 6e 6b 2e 20 20 54 68 69 73 20  er chunk.  This 
3040: 73 74 65 70 20 75 73 75 61 6c 6c 79 20 77 6f 72  step usually wor
3050: 6b 73 20 69 66 20 73 74 65 70 20 31 20 66 61 69  ks if step 1 fai
3060: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6d  ls..  */.  if( m
3070: 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3e 3d 6e 42  em3.szMaster>=nB
3080: 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  lock ){.    retu
3090: 72 6e 20 6d 65 6d 73 79 73 33 46 72 6f 6d 4d 61  rn memsys3FromMa
30a0: 73 74 65 72 28 6e 42 6c 6f 63 6b 29 3b 0a 20 20  ster(nBlock);.  
30b0: 7d 0a 0a 0a 20 20 2f 2a 20 53 54 45 50 20 33 3a  }...  /* STEP 3:
30c0: 20 20 0a 20 20 2a 2a 20 4c 6f 6f 70 20 74 68 72    .  ** Loop thr
30d0: 6f 75 67 68 20 74 68 65 20 65 6e 74 69 72 65 20  ough the entire 
30e0: 6d 65 6d 6f 72 79 20 70 6f 6f 6c 2e 20 20 43 6f  memory pool.  Co
30f0: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
3100: 66 72 65 65 0a 20 20 2a 2a 20 63 68 75 6e 6b 73  free.  ** chunks
3110: 2e 20 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65  .  Recompute the
3120: 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 61 73   master chunk as
3130: 20 74 68 65 20 6c 61 72 67 65 73 74 20 66 72 65   the largest fre
3140: 65 20 63 68 75 6e 6b 2e 0a 20 20 2a 2a 20 54 68  e chunk..  ** Th
3150: 65 6e 20 74 72 79 20 61 67 61 69 6e 20 74 6f 20  en try again to 
3160: 73 61 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f  satisfy the allo
3170: 63 61 74 69 6f 6e 20 62 79 20 63 61 72 76 69 6e  cation by carvin
3180: 67 20 61 20 70 69 65 63 65 20 6f 66 66 0a 20 20  g a piece off.  
3190: 2a 2a 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ** of the end of
31a0: 20 74 68 65 20 6d 61 73 74 65 72 20 63 68 75 6e   the master chun
31b0: 6b 2e 20 20 54 68 69 73 20 73 74 65 70 20 68 61  k.  This step ha
31c0: 70 70 65 6e 73 20 76 65 72 79 0a 20 20 2a 2a 20  ppens very.  ** 
31d0: 72 61 72 65 6c 79 20 28 77 65 20 68 6f 70 65 21  rarely (we hope!
31e0: 29 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 74 6f 46  ).  */.  for(toF
31f0: 72 65 65 3d 6e 42 6c 6f 63 6b 2a 31 36 3b 20 74  ree=nBlock*16; t
3200: 6f 46 72 65 65 3c 28 6d 65 6d 33 2e 6e 50 6f 6f  oFree<(mem3.nPoo
3210: 6c 2a 31 36 29 3b 20 74 6f 46 72 65 65 20 2a 3d  l*16); toFree *=
3220: 20 32 29 7b 0a 20 20 20 20 6d 65 6d 73 79 73 33   2){.    memsys3
3230: 4f 75 74 4f 66 4d 65 6d 6f 72 79 28 74 6f 46 72  OutOfMemory(toFr
3240: 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ee);.    if( mem
3250: 33 2e 69 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  3.iMaster ){.   
3260: 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e 6b 28 6d     memsys3Link(m
3270: 65 6d 33 2e 69 4d 61 73 74 65 72 29 3b 0a 20 20  em3.iMaster);.  
3280: 20 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72      mem3.iMaster
3290: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 33   = 0;.      mem3
32a0: 2e 73 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  .szMaster = 0;. 
32b0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
32c0: 3b 20 69 3c 4e 5f 48 41 53 48 3b 20 69 2b 2b 29  ; i<N_HASH; i++)
32d0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33 4d  {.      memsys3M
32e0: 65 72 67 65 28 26 6d 65 6d 33 2e 61 69 48 61 73  erge(&mem3.aiHas
32f0: 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  h[i]);.    }.   
3300: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 53   for(i=0; i<MX_S
3310: 4d 41 4c 4c 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  MALL-1; i++){.  
3320: 20 20 20 20 6d 65 6d 73 79 73 33 4d 65 72 67 65      memsys3Merge
3330: 28 26 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 69  (&mem3.aiSmall[i
3340: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ]);.    }.    if
3350: 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20  ( mem3.szMaster 
3360: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33  ){.      memsys3
3370: 55 6e 6c 69 6e 6b 28 6d 65 6d 33 2e 69 4d 61 73  Unlink(mem3.iMas
3380: 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
3390: 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3e 3d 6e  mem3.szMaster>=n
33a0: 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Block ){.       
33b0: 20 72 65 74 75 72 6e 20 6d 65 6d 73 79 73 33 46   return memsys3F
33c0: 72 6f 6d 4d 61 73 74 65 72 28 6e 42 6c 6f 63 6b  romMaster(nBlock
33d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
33f0: 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ne of the above 
3400: 77 6f 72 6b 65 64 2c 20 74 68 65 6e 20 77 65 20  worked, then we 
3410: 66 61 69 6c 2e 20 2a 2f 0a 20 20 72 65 74 75 72  fail. */.  retur
3420: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  n 0;.}../*.** Fr
3430: 65 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ee an outstandin
3440: 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  g memory allocat
3450: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
3460: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
3470: 20 74 68 61 74 20 74 68 65 20 6e 65 63 65 73 73   that the necess
3480: 61 72 79 20 6d 75 74 65 78 65 73 2c 20 69 66 20  ary mutexes, if 
3490: 61 6e 79 2c 20 61 72 65 0a 2a 2a 20 61 6c 72 65  any, are.** alre
34a0: 61 64 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ady held by the 
34b0: 63 61 6c 6c 65 72 2e 20 48 65 6e 63 65 20 22 55  caller. Hence "U
34c0: 6e 73 61 66 65 22 2e 0a 2a 2f 0a 76 6f 69 64 20  nsafe"..*/.void 
34d0: 6d 65 6d 73 79 73 33 46 72 65 65 55 6e 73 61 66  memsys3FreeUnsaf
34e0: 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20  e(void *pOld){. 
34f0: 20 4d 65 6d 33 42 6c 6f 63 6b 20 2a 70 20 3d 20   Mem3Block *p = 
3500: 28 4d 65 6d 33 42 6c 6f 63 6b 2a 29 70 4f 6c 64  (Mem3Block*)pOld
3510: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32  ;.  int i;.  u32
3520: 20 73 69 7a 65 2c 20 78 3b 0a 20 20 61 73 73 65   size, x;.  asse
3530: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3540: 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65  x_held(mem3.mute
3550: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
3560: 70 3e 6d 65 6d 33 2e 61 50 6f 6f 6c 20 26 26 20  p>mem3.aPool && 
3570: 70 3c 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65  p<&mem3.aPool[me
3580: 6d 33 2e 6e 50 6f 6f 6c 5d 20 29 3b 0a 20 20 69  m3.nPool] );.  i
3590: 20 3d 20 70 20 2d 20 6d 65 6d 33 2e 61 50 6f 6f   = p - mem3.aPoo
35a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6d 65  l;.  assert( (me
35b0: 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e  m3.aPool[i-1].u.
35c0: 68 64 72 2e 73 69 7a 65 34 78 26 31 29 3d 3d 31  hdr.size4x&1)==1
35d0: 20 29 3b 0a 20 20 73 69 7a 65 20 3d 20 6d 65 6d   );.  size = mem
35e0: 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68  3.aPool[i-1].u.h
35f0: 64 72 2e 73 69 7a 65 34 78 2f 34 3b 0a 20 20 61  dr.size4x/4;.  a
3600: 73 73 65 72 74 28 20 69 2b 73 69 7a 65 3c 3d 6d  ssert( i+size<=m
3610: 65 6d 33 2e 6e 50 6f 6f 6c 2b 31 20 29 3b 0a 20  em3.nPool+1 );. 
3620: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d   mem3.aPool[i-1]
3630: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 3d  .u.hdr.size4x &=
3640: 20 7e 31 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f   ~1;.  mem3.aPoo
3650: 6c 5b 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e 68 64  l[i+size-1].u.hd
3660: 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 73 69 7a  r.prevSize = siz
3670: 65 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  e;.  mem3.aPool[
3680: 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e  i+size-1].u.hdr.
3690: 73 69 7a 65 34 78 20 26 3d 20 7e 32 3b 0a 20 20  size4x &= ~2;.  
36a0: 6d 65 6d 73 79 73 33 4c 69 6e 6b 28 69 29 3b 0a  memsys3Link(i);.
36b0: 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 65 78 70  .  /* Try to exp
36c0: 61 6e 64 20 74 68 65 20 6d 61 73 74 65 72 20 75  and the master u
36d0: 73 69 6e 67 20 74 68 65 20 6e 65 77 6c 79 20 66  sing the newly f
36e0: 72 65 65 64 20 63 68 75 6e 6b 20 2a 2f 0a 20 20  reed chunk */.  
36f0: 69 66 28 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72  if( mem3.iMaster
3700: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   ){.    while( (
3710: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e  mem3.aPool[mem3.
3720: 69 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72  iMaster-1].u.hdr
3730: 2e 73 69 7a 65 34 78 26 32 29 3d 3d 30 20 29 7b  .size4x&2)==0 ){
3740: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 6d 65  .      size = me
3750: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
3760: 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 70  aster-1].u.hdr.p
3770: 72 65 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d  revSize;.      m
3780: 65 6d 33 2e 69 4d 61 73 74 65 72 20 2d 3d 20 73  em3.iMaster -= s
3790: 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e  ize;.      mem3.
37a0: 73 7a 4d 61 73 74 65 72 20 2b 3d 20 73 69 7a 65  szMaster += size
37b0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33 55  ;.      memsys3U
37c0: 6e 6c 69 6e 6b 28 6d 65 6d 33 2e 69 4d 61 73 74  nlink(mem3.iMast
37d0: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 6d  er);.      x = m
37e0: 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69  em3.aPool[mem3.i
37f0: 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e  Master-1].u.hdr.
3800: 73 69 7a 65 34 78 20 26 20 32 3b 0a 20 20 20 20  size4x & 2;.    
3810: 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d    mem3.aPool[mem
3820: 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68  3.iMaster-1].u.h
3830: 64 72 2e 73 69 7a 65 34 78 20 3d 20 6d 65 6d 33  dr.size4x = mem3
3840: 2e 73 7a 4d 61 73 74 65 72 2a 34 20 7c 20 78 3b  .szMaster*4 | x;
3850: 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f  .      mem3.aPoo
3860: 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d  l[mem3.iMaster+m
3870: 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e  em3.szMaster-1].
3880: 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d  u.hdr.prevSize =
3890: 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3b 0a   mem3.szMaster;.
38a0: 20 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 6d 65      }.    x = me
38b0: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
38c0: 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73  aster-1].u.hdr.s
38d0: 69 7a 65 34 78 20 26 20 32 3b 0a 20 20 20 20 77  ize4x & 2;.    w
38e0: 68 69 6c 65 28 20 28 6d 65 6d 33 2e 61 50 6f 6f  hile( (mem3.aPoo
38f0: 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d  l[mem3.iMaster+m
3900: 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e  em3.szMaster-1].
3910: 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 31 29 3d  u.hdr.size4x&1)=
3920: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  =0 ){.      mems
3930: 79 73 33 55 6e 6c 69 6e 6b 28 6d 65 6d 33 2e 69  ys3Unlink(mem3.i
3940: 4d 61 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61  Master+mem3.szMa
3950: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ster);.      mem
3960: 33 2e 73 7a 4d 61 73 74 65 72 20 2b 3d 20 6d 65  3.szMaster += me
3970: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
3980: 61 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73  aster+mem3.szMas
3990: 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ter-1].u.hdr.siz
39a0: 65 34 78 2f 34 3b 0a 20 20 20 20 20 20 6d 65 6d  e4x/4;.      mem
39b0: 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61  3.aPool[mem3.iMa
39c0: 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ster-1].u.hdr.si
39d0: 7a 65 34 78 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61  ze4x = mem3.szMa
39e0: 73 74 65 72 2a 34 20 7c 20 78 3b 0a 20 20 20 20  ster*4 | x;.    
39f0: 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d    mem3.aPool[mem
3a00: 33 2e 69 4d 61 73 74 65 72 2b 6d 65 6d 33 2e 73  3.iMaster+mem3.s
3a10: 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72  zMaster-1].u.hdr
3a20: 2e 70 72 65 76 53 69 7a 65 20 3d 20 6d 65 6d 33  .prevSize = mem3
3a30: 2e 73 7a 4d 61 73 74 65 72 3b 0a 20 20 20 20 7d  .szMaster;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
3a50: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
3a60: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
3a70: 69 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 33  ic void *memsys3
3a80: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
3a90: 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  s){.  sqlite3_in
3aa0: 74 36 34 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  t64 *p;.  assert
3ab0: 28 20 6e 42 79 74 65 73 3e 30 20 29 3b 20 20 20  ( nBytes>0 );   
3ac0: 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63         /* malloc
3ad0: 2e 63 20 66 69 6c 74 65 72 73 20 6f 75 74 20 30  .c filters out 0
3ae0: 20 62 79 74 65 20 72 65 71 75 65 73 74 73 20 2a   byte requests *
3af0: 2f 0a 20 20 6d 65 6d 73 79 73 33 45 6e 74 65 72  /.  memsys3Enter
3b00: 28 29 3b 0a 20 20 70 20 3d 20 6d 65 6d 73 79 73  ();.  p = memsys
3b10: 33 4d 61 6c 6c 6f 63 55 6e 73 61 66 65 28 6e 42  3MallocUnsafe(nB
3b20: 79 74 65 73 29 3b 0a 20 20 6d 65 6d 73 79 73 33  ytes);.  memsys3
3b30: 4c 65 61 76 65 28 29 3b 0a 20 20 72 65 74 75 72  Leave();.  retur
3b40: 6e 20 28 76 6f 69 64 2a 29 70 3b 20 0a 7d 0a 0a  n (void*)p; .}..
3b50: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
3b60: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 73 79  y..*/.void memsy
3b70: 73 33 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  s3Free(void *pPr
3b80: 69 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ior){.  assert( 
3b90: 70 50 72 69 6f 72 20 29 3b 0a 20 20 6d 65 6d 73  pPrior );.  mems
3ba0: 79 73 33 45 6e 74 65 72 28 29 3b 0a 20 20 6d 65  ys3Enter();.  me
3bb0: 6d 73 79 73 33 46 72 65 65 55 6e 73 61 66 65 28  msys3FreeUnsafe(
3bc0: 70 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d 73 79  pPrior);.  memsy
3bd0: 73 33 4c 65 61 76 65 28 29 3b 0a 7d 0a 0a 2f 2a  s3Leave();.}../*
3be0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
3bf0: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
3c00: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
3c10: 2c 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  , in bytes.  The
3c20: 0a 2a 2a 20 73 69 7a 65 20 72 65 74 75 72 6e 65  .** size returne
3c30: 64 20 6f 6d 69 74 73 20 74 68 65 20 38 2d 62 79  d omits the 8-by
3c40: 74 65 20 68 65 61 64 65 72 20 6f 76 65 72 68 65  te header overhe
3c50: 61 64 2e 20 20 54 68 69 73 20 6f 6e 6c 79 0a 2a  ad.  This only.*
3c60: 2a 20 77 6f 72 6b 73 20 66 6f 72 20 63 68 75 6e  * works for chun
3c70: 6b 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  ks that are curr
3c80: 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f 75  ently checked ou
3c90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3ca0: 20 6d 65 6d 73 79 73 33 53 69 7a 65 28 76 6f 69   memsys3Size(voi
3cb0: 64 20 2a 70 29 7b 0a 20 20 4d 65 6d 33 42 6c 6f  d *p){.  Mem3Blo
3cc0: 63 6b 20 2a 70 42 6c 6f 63 6b 3b 0a 20 20 69 66  ck *pBlock;.  if
3cd0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
3ce0: 30 3b 0a 20 20 70 42 6c 6f 63 6b 20 3d 20 28 4d  0;.  pBlock = (M
3cf0: 65 6d 33 42 6c 6f 63 6b 2a 29 70 3b 0a 20 20 61  em3Block*)p;.  a
3d00: 73 73 65 72 74 28 20 28 70 42 6c 6f 63 6b 5b 2d  ssert( (pBlock[-
3d10: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26  1].u.hdr.size4x&
3d20: 31 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  1)!=0 );.  retur
3d30: 6e 20 28 70 42 6c 6f 63 6b 5b 2d 31 5d 2e 75 2e  n (pBlock[-1].u.
3d40: 68 64 72 2e 73 69 7a 65 34 78 26 7e 33 29 2a 32  hdr.size4x&~3)*2
3d50: 20 2d 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   - 4;.}../*.** C
3d60: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
3d70: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65  f an existing me
3d80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
3d90: 2a 2f 0a 76 6f 69 64 20 2a 6d 65 6d 73 79 73 33  */.void *memsys3
3da0: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
3db0: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
3dc0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 0a 20  ){.  int nOld;. 
3dd0: 20 76 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28 20   void *p;.  if( 
3de0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
3df0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
3e00: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a  malloc(nBytes);.
3e10: 20 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 73    }.  if( nBytes
3e20: 3c 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  <=0 ){.    sqlit
3e30: 65 33 5f 66 72 65 65 28 70 50 72 69 6f 72 29 3b  e3_free(pPrior);
3e40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3e50: 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 6d 65 6d 73   }.  nOld = mems
3e60: 79 73 33 53 69 7a 65 28 70 50 72 69 6f 72 29 3b  ys3Size(pPrior);
3e70: 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 6e  .  if( nBytes<=n
3e80: 4f 6c 64 20 26 26 20 6e 42 79 74 65 73 3e 3d 6e  Old && nBytes>=n
3e90: 4f 6c 64 2d 31 32 38 20 29 7b 0a 20 20 20 20 72  Old-128 ){.    r
3ea0: 65 74 75 72 6e 20 70 50 72 69 6f 72 3b 0a 20 20  eturn pPrior;.  
3eb0: 7d 0a 20 20 6d 65 6d 73 79 73 33 45 6e 74 65 72  }.  memsys3Enter
3ec0: 28 29 3b 0a 20 20 70 20 3d 20 6d 65 6d 73 79 73  ();.  p = memsys
3ed0: 33 4d 61 6c 6c 6f 63 55 6e 73 61 66 65 28 6e 42  3MallocUnsafe(nB
3ee0: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 70 20 29  ytes);.  if( p )
3ef0: 7b 0a 20 20 20 20 69 66 28 20 6e 4f 6c 64 3c 6e  {.    if( nOld<n
3f00: 42 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20 6d  Bytes ){.      m
3f10: 65 6d 63 70 79 28 70 2c 20 70 50 72 69 6f 72 2c  emcpy(p, pPrior,
3f20: 20 6e 4f 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73   nOld);.    }els
3f30: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
3f40: 70 2c 20 70 50 72 69 6f 72 2c 20 6e 42 79 74 65  p, pPrior, nByte
3f50: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  s);.    }.    me
3f60: 6d 73 79 73 33 46 72 65 65 55 6e 73 61 66 65 28  msys3FreeUnsafe(
3f70: 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 6d  pPrior);.  }.  m
3f80: 65 6d 73 79 73 33 4c 65 61 76 65 28 29 3b 0a 20  emsys3Leave();. 
3f90: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3fa0: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
3fb0: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
3fc0: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
3fd0: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
3fe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
3ff0: 73 79 73 33 52 6f 75 6e 64 75 70 28 69 6e 74 20  sys3Roundup(int 
4000: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 6e 2b  n){.  return (n+
4010: 37 29 20 26 20 7e 37 3b 0a 7d 0a 0a 2f 2a 0a 2a  7) & ~7;.}../*.*
4020: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
4030: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
4040: 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 33 49  tic int memsys3I
4050: 6e 69 74 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65  nit(void *NotUse
4060: 64 29 7b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  d){.  if( !sqlit
4070: 65 33 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 29  e3Config.pHeap )
4080: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4090: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
40a0: 20 20 2f 2a 20 53 74 6f 72 65 20 61 20 70 6f 69    /* Store a poi
40b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f  nter to the memo
40c0: 72 79 20 62 6c 6f 63 6b 20 69 6e 20 67 6c 6f 62  ry block in glob
40d0: 61 6c 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d  al structure mem
40e0: 33 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  3. */.  assert( 
40f0: 73 69 7a 65 6f 66 28 4d 65 6d 33 42 6c 6f 63 6b  sizeof(Mem3Block
4100: 29 3d 3d 38 20 29 3b 0a 20 20 6d 65 6d 33 2e 61  )==8 );.  mem3.a
4110: 50 6f 6f 6c 20 3d 20 28 4d 65 6d 33 42 6c 6f 63  Pool = (Mem3Bloc
4120: 6b 20 2a 29 73 71 6c 69 74 65 33 43 6f 6e 66 69  k *)sqlite3Confi
4130: 67 2e 70 48 65 61 70 3b 0a 20 20 6d 65 6d 33 2e  g.pHeap;.  mem3.
4140: 6e 50 6f 6f 6c 20 3d 20 28 73 71 6c 69 74 65 33  nPool = (sqlite3
4150: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 2f 20 73  Config.nHeap / s
4160: 69 7a 65 6f 66 28 4d 65 6d 33 42 6c 6f 63 6b 29  izeof(Mem3Block)
4170: 29 20 2d 20 32 3b 0a 0a 20 20 2f 2a 20 49 6e 69  ) - 2;..  /* Ini
4180: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 73 74  tialize the mast
4190: 65 72 20 62 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 6d  er block. */.  m
41a0: 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20 3d 20 6d  em3.szMaster = m
41b0: 65 6d 33 2e 6e 50 6f 6f 6c 3b 0a 20 20 6d 65 6d  em3.nPool;.  mem
41c0: 33 2e 6d 6e 4d 61 73 74 65 72 20 3d 20 6d 65 6d  3.mnMaster = mem
41d0: 33 2e 73 7a 4d 61 73 74 65 72 3b 0a 20 20 6d 65  3.szMaster;.  me
41e0: 6d 33 2e 69 4d 61 73 74 65 72 20 3d 20 31 3b 0a  m3.iMaster = 1;.
41f0: 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 30 5d 2e    mem3.aPool[0].
4200: 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 28  u.hdr.size4x = (
4210: 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3c 3c 32  mem3.szMaster<<2
4220: 29 20 2b 20 32 3b 0a 20 20 6d 65 6d 33 2e 61 50  ) + 2;.  mem3.aP
4230: 6f 6f 6c 5b 6d 65 6d 33 2e 6e 50 6f 6f 6c 5d 2e  ool[mem3.nPool].
4240: 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d  u.hdr.prevSize =
4250: 20 6d 65 6d 33 2e 6e 50 6f 6f 6c 3b 0a 20 20 6d   mem3.nPool;.  m
4260: 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 6e  em3.aPool[mem3.n
4270: 50 6f 6f 6c 5d 2e 75 2e 68 64 72 2e 73 69 7a 65  Pool].u.hdr.size
4280: 34 78 20 3d 20 31 3b 0a 0a 20 20 72 65 74 75 72  4x = 1;..  retur
4290: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
42a0: 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69  /*.** Deinitiali
42b0: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
42c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
42d0: 65 6d 73 79 73 33 53 68 75 74 64 6f 77 6e 28 76  emsys3Shutdown(v
42e0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  oid *NotUsed){. 
42f0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 0a 0a 2f 2a   return;.}..../*
4300: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
4310: 65 20 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20  e indicated and 
4320: 77 72 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61  write a log of a
4330: 6c 6c 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72  ll unfreed memor
4340: 79 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  y .** allocation
4350: 73 20 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e  s into that log.
4360: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4370: 45 5f 44 45 42 55 47 0a 76 6f 69 64 20 73 71 6c  E_DEBUG.void sql
4380: 69 74 65 33 4d 65 6d 73 79 73 33 44 75 6d 70 28  ite3Memsys3Dump(
4390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
43a0: 65 6e 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a  ename){.  FILE *
43b0: 6f 75 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  out;.  int i, j;
43c0: 0a 20 20 75 33 32 20 73 69 7a 65 3b 0a 20 20 69  .  u32 size;.  i
43d0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
43e0: 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
43f0: 3d 30 20 29 7b 0a 20 20 20 20 6f 75 74 20 3d 20  =0 ){.    out = 
4400: 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b  stdout;.  }else{
4410: 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e  .    out = fopen
4420: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22 29  (zFilename, "w")
4430: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30  ;.    if( out==0
4440: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
4450: 66 28 73 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e  f(stderr, "** Un
4460: 61 62 6c 65 20 74 6f 20 6f 75 74 70 75 74 20 6d  able to output m
4470: 65 6d 6f 72 79 20 64 65 62 75 67 20 6f 75 74 70  emory debug outp
4480: 75 74 20 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22  ut log: %s **\n"
4490: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
44a0: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
44b0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
44c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
44d0: 6d 73 79 73 33 45 6e 74 65 72 28 29 3b 0a 20 20  msys3Enter();.  
44e0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 48  fprintf(out, "CH
44f0: 55 4e 4b 53 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72  UNKS:\n");.  for
4500: 28 69 3d 31 3b 20 69 3c 3d 6d 65 6d 33 2e 6e 50  (i=1; i<=mem3.nP
4510: 6f 6f 6c 3b 20 69 2b 3d 73 69 7a 65 2f 34 29 7b  ool; i+=size/4){
4520: 0a 20 20 20 20 73 69 7a 65 20 3d 20 6d 65 6d 33  .    size = mem3
4530: 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64  .aPool[i-1].u.hd
4540: 72 2e 73 69 7a 65 34 78 3b 0a 20 20 20 20 69 66  r.size4x;.    if
4550: 28 20 73 69 7a 65 2f 34 3c 3d 31 20 29 7b 0a 20  ( size/4<=1 ){. 
4560: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
4570: 2c 20 22 25 70 20 73 69 7a 65 20 65 72 72 6f 72  , "%p size error
4580: 5c 6e 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c  \n", &mem3.aPool
4590: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  [i]);.      asse
45a0: 72 74 28 20 30 20 29 3b 0a 20 20 20 20 20 20 62  rt( 0 );.      b
45b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
45c0: 69 66 28 20 28 73 69 7a 65 26 31 29 3d 3d 30 20  if( (size&1)==0 
45d0: 26 26 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b  && mem3.aPool[i+
45e0: 73 69 7a 65 2f 34 2d 31 5d 2e 75 2e 68 64 72 2e  size/4-1].u.hdr.
45f0: 70 72 65 76 53 69 7a 65 21 3d 73 69 7a 65 2f 34  prevSize!=size/4
4600: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
4610: 66 28 6f 75 74 2c 20 22 25 70 20 74 61 69 6c 20  f(out, "%p tail 
4620: 73 69 7a 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  size does not ma
4630: 74 63 68 5c 6e 22 2c 20 26 6d 65 6d 33 2e 61 50  tch\n", &mem3.aP
4640: 6f 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  ool[i]);.      a
4650: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
4660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4670: 20 20 20 69 66 28 20 28 28 6d 65 6d 33 2e 61 50     if( ((mem3.aP
4680: 6f 6f 6c 5b 69 2b 73 69 7a 65 2f 34 2d 31 5d 2e  ool[i+size/4-1].
4690: 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 32 29 3e  u.hdr.size4x&2)>
46a0: 3e 31 29 21 3d 28 73 69 7a 65 26 31 29 20 29 7b  >1)!=(size&1) ){
46b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
46c0: 75 74 2c 20 22 25 70 20 74 61 69 6c 20 63 68 65  ut, "%p tail che
46d0: 63 6b 6f 75 74 20 62 69 74 20 69 73 20 69 6e 63  ckout bit is inc
46e0: 6f 72 72 65 63 74 5c 6e 22 2c 20 26 6d 65 6d 33  orrect\n", &mem3
46f0: 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  .aPool[i]);.    
4700: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
4710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4720: 7d 0a 20 20 20 20 69 66 28 20 73 69 7a 65 26 31  }.    if( size&1
4730: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
4740: 66 28 6f 75 74 2c 20 22 25 70 20 25 36 64 20 62  f(out, "%p %6d b
4750: 79 74 65 73 20 63 68 65 63 6b 65 64 20 6f 75 74  ytes checked out
4760: 5c 6e 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c  \n", &mem3.aPool
4770: 5b 69 5d 2c 20 28 73 69 7a 65 2f 34 29 2a 38 2d  [i], (size/4)*8-
4780: 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
4790: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
47a0: 2c 20 22 25 70 20 25 36 64 20 62 79 74 65 73 20  , "%p %6d bytes 
47b0: 66 72 65 65 25 73 5c 6e 22 2c 20 26 6d 65 6d 33  free%s\n", &mem3
47c0: 2e 61 50 6f 6f 6c 5b 69 5d 2c 20 28 73 69 7a 65  .aPool[i], (size
47d0: 2f 34 29 2a 38 2d 38 2c 0a 20 20 20 20 20 20 20  /4)*8-8,.       
47e0: 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6d 65             i==me
47f0: 6d 33 2e 69 4d 61 73 74 65 72 20 3f 20 22 20 2a  m3.iMaster ? " *
4800: 2a 6d 61 73 74 65 72 2a 2a 22 20 3a 20 22 22 29  *master**" : "")
4810: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
4820: 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 53 4d 41 4c  r(i=0; i<MX_SMAL
4830: 4c 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  L-1; i++){.    i
4840: 66 28 20 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b  f( mem3.aiSmall[
4850: 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
4860: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
4870: 74 2c 20 22 73 6d 61 6c 6c 28 25 32 64 29 3a 22  t, "small(%2d):"
4880: 2c 20 69 29 3b 0a 20 20 20 20 66 6f 72 28 6a 20  , i);.    for(j 
4890: 3d 20 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c 5b 69  = mem3.aiSmall[i
48a0: 5d 3b 20 6a 3e 30 3b 20 6a 3d 6d 65 6d 33 2e 61  ]; j>0; j=mem3.a
48b0: 50 6f 6f 6c 5b 6a 5d 2e 75 2e 6c 69 73 74 2e 6e  Pool[j].u.list.n
48c0: 65 78 74 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ext){.      fpri
48d0: 6e 74 66 28 6f 75 74 2c 20 22 20 25 70 28 25 64  ntf(out, " %p(%d
48e0: 29 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  )", &mem3.aPool[
48f0: 6a 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  j],.            
4900: 20 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 2d    (mem3.aPool[j-
4910: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
4920: 34 29 2a 38 2d 38 29 3b 0a 20 20 20 20 7d 0a 20  4)*8-8);.    }. 
4930: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
4940: 22 5c 6e 22 29 3b 20 0a 20 20 7d 0a 20 20 66 6f  "\n"); .  }.  fo
4950: 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 41 53 48 3b  r(i=0; i<N_HASH;
4960: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6d   i++){.    if( m
4970: 65 6d 33 2e 61 69 48 61 73 68 5b 69 5d 3d 3d 30  em3.aiHash[i]==0
4980: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4990: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 68   fprintf(out, "h
49a0: 61 73 68 28 25 32 64 29 3a 22 2c 20 69 29 3b 0a  ash(%2d):", i);.
49b0: 20 20 20 20 66 6f 72 28 6a 20 3d 20 6d 65 6d 33      for(j = mem3
49c0: 2e 61 69 48 61 73 68 5b 69 5d 3b 20 6a 3e 30 3b  .aiHash[i]; j>0;
49d0: 20 6a 3d 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 5d   j=mem3.aPool[j]
49e0: 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 29 7b 0a 20  .u.list.next){. 
49f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
4a00: 2c 20 22 20 25 70 28 25 64 29 22 2c 20 26 6d 65  , " %p(%d)", &me
4a10: 6d 33 2e 61 50 6f 6f 6c 5b 6a 5d 2c 0a 20 20 20  m3.aPool[j],.   
4a20: 20 20 20 20 20 20 20 20 20 20 20 28 6d 65 6d 33             (mem3
4a30: 2e 61 50 6f 6f 6c 5b 6a 2d 31 5d 2e 75 2e 68 64  .aPool[j-1].u.hd
4a40: 72 2e 73 69 7a 65 34 78 2f 34 29 2a 38 2d 38 29  r.size4x/4)*8-8)
4a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
4a60: 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
4a70: 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
4a80: 75 74 2c 20 22 6d 61 73 74 65 72 3d 25 64 5c 6e  ut, "master=%d\n
4a90: 22 2c 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72 29  ", mem3.iMaster)
4aa0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
4ab0: 20 22 6e 6f 77 55 73 65 64 3d 25 64 5c 6e 22 2c   "nowUsed=%d\n",
4ac0: 20 6d 65 6d 33 2e 6e 50 6f 6f 6c 2a 38 20 2d 20   mem3.nPool*8 - 
4ad0: 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2a 38 29  mem3.szMaster*8)
4ae0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
4af0: 20 22 6d 78 55 73 65 64 3d 25 64 5c 6e 22 2c 20   "mxUsed=%d\n", 
4b00: 6d 65 6d 33 2e 6e 50 6f 6f 6c 2a 38 20 2d 20 6d  mem3.nPool*8 - m
4b10: 65 6d 33 2e 6d 6e 4d 61 73 74 65 72 2a 38 29 3b  em3.mnMaster*8);
4b20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4b30: 5f 6c 65 61 76 65 28 6d 65 6d 33 2e 6d 75 74 65  _leave(mem3.mute
4b40: 78 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 73  x);.  if( out==s
4b50: 74 64 6f 75 74 20 29 7b 0a 20 20 20 20 66 66 6c  tdout ){.    ffl
4b60: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 7d  ush(stdout);.  }
4b70: 65 6c 73 65 7b 0a 20 20 20 20 66 63 6c 6f 73 65  else{.    fclose
4b80: 28 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  (out);.  }.}.#en
4b90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
4ba0: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
4bb0: 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74  nly routine in t
4bc0: 68 69 73 20 66 69 6c 65 20 77 69 74 68 20 65 78  his file with ex
4bd0: 74 65 72 6e 61 6c 20 0a 2a 2a 20 6c 69 6e 6b 61  ternal .** linka
4be0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61  ge..**.** Popula
4bf0: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
4c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
4c10: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
4c20: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
4c30: 65 33 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20  e3Config.m with 
4c40: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
4c50: 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73  routines in this
4c60: 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72   file. The.** ar
4c70: 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20  guments specify 
4c80: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  the block of mem
4c90: 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a  ory to manage..*
4ca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4cb0: 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
4cc0: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   by sqlite3_conf
4cd0: 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66  ig(), and theref
4ce0: 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65  ore.** is not re
4cf0: 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72  quired to be thr
4d00: 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e  eadsafe (it is n
4d10: 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ot)..*/.const sq
4d20: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
4d30: 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  s *sqlite3MemGet
4d40: 4d 65 6d 73 79 73 33 28 76 6f 69 64 29 7b 0a 20  Memsys3(void){. 
4d50: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
4d60: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
4d70: 73 20 6d 65 6d 70 6f 6f 6c 4d 65 74 68 6f 64 73  s mempoolMethods
4d80: 20 3d 20 7b 0a 20 20 20 20 20 6d 65 6d 73 79 73   = {.     memsys
4d90: 33 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 20 6d 65  3Malloc,.     me
4da0: 6d 73 79 73 33 46 72 65 65 2c 0a 20 20 20 20 20  msys3Free,.     
4db0: 6d 65 6d 73 79 73 33 52 65 61 6c 6c 6f 63 2c 0a  memsys3Realloc,.
4dc0: 20 20 20 20 20 6d 65 6d 73 79 73 33 53 69 7a 65       memsys3Size
4dd0: 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 33 52 6f  ,.     memsys3Ro
4de0: 75 6e 64 75 70 2c 0a 20 20 20 20 20 6d 65 6d 73  undup,.     mems
4df0: 79 73 33 49 6e 69 74 2c 0a 20 20 20 20 20 6d 65  ys3Init,.     me
4e00: 6d 73 79 73 33 53 68 75 74 64 6f 77 6e 2c 0a 20  msys3Shutdown,. 
4e10: 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 72 65 74      0.  };.  ret
4e20: 75 72 6e 20 26 6d 65 6d 70 6f 6f 6c 4d 65 74 68  urn &mempoolMeth
4e30: 6f 64 73 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ods;.}..#endif /
4e40: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
4e50: 4d 45 4d 53 59 53 33 20 2a 2f 0a                 MEMSYS3 */.