/ Hex Artifact Content
Login

Artifact 52547678a2ae50c203d54be1a5bf51eb02438a3f:


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 20 41 6c 6c 20 64 79 6e 61 6d 69 63 61  ).  All dynamica
0240: 6c 6c 79 20 61 6c 6c 6f 63 61 74 61 62 6c 65 20  lly allocatable 
0250: 6d 65 6d 6f 72 79 20 69 73 0a 2a 2a 20 63 6f 6e  memory is.** con
0260: 74 61 69 6e 65 64 20 69 6e 20 61 20 73 74 61 74  tained in a stat
0270: 69 63 20 61 72 72 61 79 2c 20 6d 65 6d 2e 61 50  ic array, mem.aP
0280: 6f 6f 6c 5b 5d 2e 20 20 54 68 65 20 73 69 7a 65  ool[].  The size
0290: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 66 69 78 65   of this.** fixe
02a0: 64 20 6d 65 6d 6f 72 79 20 70 6f 6f 6c 20 69 73  d memory pool is
02b0: 20 53 51 4c 49 54 45 5f 4d 45 4d 4f 52 59 5f 53   SQLITE_MEMORY_S
02c0: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  IZE bytes..**.**
02d0: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
02e0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
02f0: 63 61 74 69 6f 6e 20 73 75 62 73 79 73 74 65 6d  cation subsystem
0300: 20 69 73 20 75 73 65 64 20 69 66 0a 2a 2a 20 61   is used if.** a
0310: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 49 54  nd only if SQLIT
0320: 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 20 69 73  E_MEMORY_SIZE is
0330: 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
0340: 24 49 64 3a 20 6d 65 6d 33 2e 63 2c 76 20 31 2e  $Id: mem3.c,v 1.
0350: 31 32 20 32 30 30 38 2f 30 32 2f 31 39 20 31 35  12 2008/02/19 15
0360: 3a 31 35 3a 31 36 20 64 72 68 20 45 78 70 20 24  :15:16 drh Exp $
0370: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0380: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
0390: 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
03a0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  f the memory all
03b0: 6f 63 61 74 6f 72 20 69 73 20 75 73 65 64 20 6f  ocator is used o
03c0: 6e 6c 79 20 77 68 65 6e 20 0a 2a 2a 20 53 51 4c  nly when .** SQL
03d0: 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 20  ITE_MEMORY_SIZE 
03e0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
03f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
0400: 4f 52 59 5f 53 49 5a 45 0a 0a 2f 2a 0a 2a 2a 20  ORY_SIZE../*.** 
0410: 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 28 69 6e  Maximum size (in
0420: 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 20 6f 66 20   Mem3Blocks) of 
0430: 61 20 22 73 6d 61 6c 6c 22 20 63 68 75 6e 6b 2e  a "small" chunk.
0440: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 53  .*/.#define MX_S
0450: 4d 41 4c 4c 20 31 30 0a 0a 0a 2f 2a 0a 2a 2a 20  MALL 10.../*.** 
0460: 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 6c 69  Number of freeli
0470: 73 74 20 68 61 73 68 20 73 6c 6f 74 73 0a 2a 2f  st hash slots.*/
0480: 0a 23 64 65 66 69 6e 65 20 4e 5f 48 41 53 48 20  .#define N_HASH 
0490: 20 36 31 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 65 6d   61../*.** A mem
04a0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28  ory allocation (
04b0: 61 6c 73 6f 20 63 61 6c 6c 65 64 20 61 20 22 63  also called a "c
04c0: 68 75 6e 6b 22 29 20 63 6f 6e 73 69 73 74 73 20  hunk") consists 
04d0: 6f 66 20 74 77 6f 20 6f 72 20 0a 2a 2a 20 6d 6f  of two or .** mo
04e0: 72 65 20 62 6c 6f 63 6b 73 20 77 68 65 72 65 20  re blocks where 
04f0: 65 61 63 68 20 62 6c 6f 63 6b 20 69 73 20 38 20  each block is 8 
0500: 62 79 74 65 73 2e 20 20 54 68 65 20 66 69 72 73  bytes.  The firs
0510: 74 20 38 20 62 79 74 65 73 20 61 72 65 20 0a 2a  t 8 bytes are .*
0520: 2a 20 61 20 68 65 61 64 65 72 20 74 68 61 74 20  * a header that 
0530: 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
0540: 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 2a 2a 0a  to the user..**.
0550: 2a 2a 20 41 20 63 68 75 6e 6b 20 69 73 20 74 77  ** A chunk is tw
0560: 6f 20 6f 72 20 6d 6f 72 65 20 62 6c 6f 63 6b 73  o or more blocks
0570: 20 74 68 61 74 20 69 73 20 65 69 74 68 65 72 20   that is either 
0580: 63 68 65 63 6b 65 64 20 6f 75 74 20 6f 72 0a 2a  checked out or.*
0590: 2a 20 66 72 65 65 2e 20 20 54 68 65 20 66 69 72  * free.  The fir
05a0: 73 74 20 62 6c 6f 63 6b 20 68 61 73 20 66 6f 72  st block has for
05b0: 6d 61 74 20 75 2e 68 64 72 2e 20 20 75 2e 68 64  mat u.hdr.  u.hd
05c0: 72 2e 73 69 7a 65 34 78 20 69 73 20 34 20 74 69  r.size4x is 4 ti
05d0: 6d 65 73 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20  mes the.** size 
05e0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  of the allocatio
05f0: 6e 20 69 6e 20 62 6c 6f 63 6b 73 20 69 66 20 74  n in blocks if t
0600: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
0610: 20 66 72 65 65 2e 0a 2a 2a 20 54 68 65 20 75 2e   free..** The u.
0620: 68 64 72 2e 73 69 7a 65 34 78 26 31 20 62 69 74  hdr.size4x&1 bit
0630: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
0640: 63 68 75 6e 6b 20 69 73 20 63 68 65 63 6b 65 64  chunk is checked
0650: 20 6f 75 74 20 61 6e 64 0a 2a 2a 20 66 61 6c 73   out and.** fals
0660: 65 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69  e if the chunk i
0670: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
0680: 74 2e 20 20 54 68 65 20 75 2e 68 64 72 2e 73 69  t.  The u.hdr.si
0690: 7a 65 34 78 26 32 20 62 69 74 0a 2a 2a 20 69 73  ze4x&2 bit.** is
06a0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72 65   true if the pre
06b0: 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 73 20 63  vious chunk is c
06c0: 68 65 63 6b 65 64 20 6f 75 74 20 61 6e 64 20 66  hecked out and f
06d0: 61 6c 73 65 20 69 66 20 74 68 65 0a 2a 2a 20 70  alse if the.** p
06e0: 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 73  revious chunk is
06f0: 20 66 72 65 65 2e 20 20 54 68 65 20 75 2e 68 64   free.  The u.hd
0700: 72 2e 70 72 65 76 53 69 7a 65 20 66 69 65 6c 64  r.prevSize field
0710: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   is the size of.
0720: 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
0730: 63 68 75 6e 6b 20 69 6e 20 62 6c 6f 63 6b 73 20  chunk in blocks 
0740: 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
0750: 63 68 75 6e 6b 20 69 73 20 6f 6e 20 74 68 65 0a  chunk is on the.
0760: 2a 2a 20 66 72 65 65 6c 69 73 74 2e 20 49 66 20  ** freelist. If 
0770: 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 75  the previous chu
0780: 6e 6b 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75  nk is checked ou
0790: 74 2c 20 74 68 65 6e 0a 2a 2a 20 75 2e 68 64 72  t, then.** u.hdr
07a0: 2e 70 72 65 76 53 69 7a 65 20 63 61 6e 20 62 65  .prevSize can be
07b0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
07c0: 61 20 66 6f 72 20 74 68 61 74 20 63 68 75 6e 6b  a for that chunk
07d0: 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 6e   and should.** n
07e0: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
07f0: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  itten..**.** We 
0800: 6f 66 74 65 6e 20 69 64 65 6e 74 69 66 79 20 61  often identify a
0810: 20 63 68 75 6e 6b 20 62 79 20 69 74 73 20 69 6e   chunk by its in
0820: 64 65 78 20 69 6e 20 6d 65 6d 2e 61 50 6f 6f 6c  dex in mem.aPool
0830: 5b 5d 2e 20 20 57 68 65 6e 0a 2a 2a 20 74 68 69  [].  When.** thi
0840: 73 20 69 73 20 64 6f 6e 65 2c 20 74 68 65 20 63  s is done, the c
0850: 68 75 6e 6b 20 69 6e 64 65 78 20 72 65 66 65 72  hunk index refer
0860: 73 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20  s to the second 
0870: 62 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 74 68 65 20  block of.** the 
0880: 63 68 75 6e 6b 2e 20 20 49 6e 20 74 68 69 73 20  chunk.  In this 
0890: 77 61 79 2c 20 74 68 65 20 66 69 72 73 74 20 63  way, the first c
08a0: 68 75 6e 6b 20 68 61 73 20 61 6e 20 69 6e 64 65  hunk has an inde
08b0: 78 20 6f 66 20 31 2e 0a 2a 2a 20 41 20 63 68 75  x of 1..** A chu
08c0: 6e 6b 20 69 6e 64 65 78 20 6f 66 20 30 20 6d 65  nk index of 0 me
08d0: 61 6e 73 20 22 6e 6f 20 73 75 63 68 20 63 68 75  ans "no such chu
08e0: 6e 6b 22 20 61 6e 64 20 69 73 20 74 68 65 20 65  nk" and is the e
08f0: 71 75 69 76 61 6c 65 6e 74 0a 2a 2a 20 6f 66 20  quivalent.** of 
0900: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
0910: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
0920: 20 62 6c 6f 63 6b 20 6f 66 20 66 72 65 65 20 63   block of free c
0930: 68 75 6e 6b 73 20 69 73 20 6f 66 20 74 68 65 20  hunks is of the 
0940: 66 6f 72 6d 20 75 2e 6c 69 73 74 2e 20 20 54 68  form u.list.  Th
0950: 65 0a 2a 2a 20 74 77 6f 20 66 69 65 6c 64 73 20  e.** two fields 
0960: 66 6f 72 6d 20 61 20 64 6f 75 62 6c 65 2d 6c 69  form a double-li
0970: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 63 68 75  nked list of chu
0980: 6e 6b 73 20 6f 66 20 72 65 6c 61 74 65 64 20 73  nks of related s
0990: 69 7a 65 73 2e 0a 2a 2a 20 50 6f 69 6e 74 65 72  izes..** Pointer
09a0: 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  s to the head of
09b0: 20 74 68 65 20 6c 69 73 74 20 61 72 65 20 73 74   the list are st
09c0: 6f 72 65 64 20 69 6e 20 6d 65 6d 2e 61 69 53 6d  ored in mem.aiSm
09d0: 61 6c 6c 5b 5d 20 0a 2a 2a 20 66 6f 72 20 73 6d  all[] .** for sm
09e0: 61 6c 6c 65 72 20 63 68 75 6e 6b 73 20 61 6e 64  aller chunks and
09f0: 20 6d 65 6d 2e 61 69 48 61 73 68 5b 5d 20 66 6f   mem.aiHash[] fo
0a00: 72 20 6c 61 72 67 65 72 20 63 68 75 6e 6b 73 2e  r larger chunks.
0a10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
0a20: 64 20 62 6c 6f 63 6b 20 6f 66 20 61 20 63 68 75  d block of a chu
0a30: 6e 6b 20 69 73 20 75 73 65 72 20 64 61 74 61 20  nk is user data 
0a40: 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69 73 20  if the chunk is 
0a50: 63 68 65 63 6b 65 64 20 0a 2a 2a 20 6f 75 74 2e  checked .** out.
0a60: 20 20 49 66 20 61 20 63 68 75 6e 6b 20 69 73 20    If a chunk is 
0a70: 63 68 65 63 6b 65 64 20 6f 75 74 2c 20 74 68 65  checked out, the
0a80: 20 75 73 65 72 20 64 61 74 61 20 6d 61 79 20 65   user data may e
0a90: 78 74 65 6e 64 20 69 6e 74 6f 0a 2a 2a 20 74 68  xtend into.** th
0aa0: 65 20 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65  e u.hdr.prevSize
0ab0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6f   value of the fo
0ac0: 6c 6c 6f 77 69 6e 67 20 63 68 75 6e 6b 2e 0a 2a  llowing chunk..*
0ad0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0ae0: 20 4d 65 6d 33 42 6c 6f 63 6b 20 4d 65 6d 33 42   Mem3Block Mem3B
0af0: 6c 6f 63 6b 3b 0a 73 74 72 75 63 74 20 4d 65 6d  lock;.struct Mem
0b00: 33 42 6c 6f 63 6b 20 7b 0a 20 20 75 6e 69 6f 6e  3Block {.  union
0b10: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a   {.    struct {.
0b20: 20 20 20 20 20 20 75 33 32 20 70 72 65 76 53 69        u32 prevSi
0b30: 7a 65 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ze;   /* Size of
0b40: 20 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20   previous chunk 
0b50: 69 6e 20 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65  in Mem3Block ele
0b60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 75  ments */.      u
0b70: 33 32 20 73 69 7a 65 34 78 3b 20 20 20 20 20 2f  32 size4x;     /
0b80: 2a 20 34 78 20 74 68 65 20 73 69 7a 65 20 6f 66  * 4x the size of
0b90: 20 63 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 69   current chunk i
0ba0: 6e 20 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d  n Mem3Block elem
0bb0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 7d 20 68 64  ents */.    } hd
0bc0: 72 3b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a  r;.    struct {.
0bd0: 20 20 20 20 20 20 75 33 32 20 6e 65 78 74 3b 20        u32 next; 
0be0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
0bf0: 6e 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 5d 20 6f 66  n mem.aPool[] of
0c00: 20 6e 65 78 74 20 66 72 65 65 20 63 68 75 6e 6b   next free chunk
0c10: 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 70 72   */.      u32 pr
0c20: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ev;       /* Ind
0c30: 65 78 20 69 6e 20 6d 65 6d 2e 61 50 6f 6f 6c 5b  ex in mem.aPool[
0c40: 5d 20 6f 66 20 70 72 65 76 69 6f 75 73 20 66 72  ] of previous fr
0c50: 65 65 20 63 68 75 6e 6b 20 2a 2f 0a 20 20 20 20  ee chunk */.    
0c60: 7d 20 6c 69 73 74 3b 0a 20 20 7d 20 75 3b 0a 7d  } list;.  } u;.}
0c70: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  ;../*.** All of 
0c80: 74 68 65 20 73 74 61 74 69 63 20 76 61 72 69 61  the static varia
0c90: 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 69  bles used by thi
0ca0: 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c  s module are col
0cb0: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  lected.** into a
0cc0: 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75 72   single structur
0cd0: 65 20 6e 61 6d 65 64 20 22 6d 65 6d 22 2e 20 20  e named "mem".  
0ce0: 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65 70 20  This is to keep 
0cf0: 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20 76 61  the.** static va
0d00: 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65  riables organize
0d10: 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63 65 20  d and to reduce 
0d20: 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75 74  namespace pollut
0d30: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ion.** when this
0d40: 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 69   module is combi
0d50: 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72 20 69  ned with other i
0d60: 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  n the amalgamati
0d70: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  on..*/.static st
0d80: 72 75 63 74 20 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  ruct {.  /*.  **
0d90: 20 54 72 75 65 20 69 66 20 77 65 20 61 72 65 20   True if we are 
0da0: 65 76 61 6c 75 61 74 69 6e 67 20 61 6e 20 6f 75  evaluating an ou
0db0: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 61 6c 6c  t-of-memory call
0dc0: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  back..  */.  int
0dd0: 20 61 6c 61 72 6d 42 75 73 79 3b 0a 20 20 0a 20   alarmBusy;.  . 
0de0: 20 2f 2a 0a 20 20 2a 2a 20 4d 75 74 65 78 20 74   /*.  ** Mutex t
0df0: 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
0e00: 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   to the memory a
0e10: 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79 73  llocation subsys
0e20: 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tem..  */.  sqli
0e30: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
0e40: 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ;.  .  /*.  ** T
0e50: 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  he minimum amoun
0e60: 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 20  t of free space 
0e70: 74 68 61 74 20 77 65 20 68 61 76 65 20 73 65 65  that we have see
0e80: 6e 2e 0a 20 20 2a 2f 0a 20 20 75 33 32 20 6d 6e  n..  */.  u32 mn
0e90: 4d 61 73 74 65 72 3b 0a 0a 20 20 2f 2a 0a 20 20  Master;..  /*.  
0ea0: 2a 2a 20 69 4d 61 73 74 65 72 20 69 73 20 74 68  ** iMaster is th
0eb0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6d  e index of the m
0ec0: 61 73 74 65 72 20 63 68 75 6e 6b 2e 20 20 4d 6f  aster chunk.  Mo
0ed0: 73 74 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  st new allocatio
0ee0: 6e 73 0a 20 20 2a 2a 20 6f 63 63 75 72 20 6f 66  ns.  ** occur of
0ef0: 66 20 6f 66 20 74 68 69 73 20 63 68 75 6e 6b 2e  f of this chunk.
0f00: 20 20 73 7a 4d 61 73 74 65 72 20 69 73 20 74 68    szMaster is th
0f10: 65 20 73 69 7a 65 20 28 69 6e 20 4d 65 6d 33 42  e size (in Mem3B
0f20: 6c 6f 63 6b 73 29 0a 20 20 2a 2a 20 6f 66 20 74  locks).  ** of t
0f30: 68 65 20 63 75 72 72 65 6e 74 20 6d 61 73 74 65  he current maste
0f40: 72 2e 20 20 69 4d 61 73 74 65 72 20 69 73 20 30  r.  iMaster is 0
0f50: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   if there is not
0f60: 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 2e 0a 20   master chunk.. 
0f70: 20 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 63   ** The master c
0f80: 68 75 6e 6b 20 69 73 20 6e 6f 74 20 69 6e 20 65  hunk is not in e
0f90: 69 74 68 65 72 20 74 68 65 20 61 69 48 61 73 68  ither the aiHash
0fa0: 5b 5d 20 6f 72 20 61 69 53 6d 61 6c 6c 5b 5d 2e  [] or aiSmall[].
0fb0: 0a 20 20 2a 2f 0a 20 20 75 33 32 20 69 4d 61 73  .  */.  u32 iMas
0fc0: 74 65 72 3b 0a 20 20 75 33 32 20 73 7a 4d 61 73  ter;.  u32 szMas
0fd0: 74 65 72 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ter;..  /*.  ** 
0fe0: 41 72 72 61 79 20 6f 66 20 6c 69 73 74 73 20 6f  Array of lists o
0ff0: 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 63  f free blocks ac
1000: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62  cording to the b
1010: 6c 6f 63 6b 20 73 69 7a 65 20 0a 20 20 2a 2a 20  lock size .  ** 
1020: 66 6f 72 20 73 6d 61 6c 6c 65 72 20 63 68 75 6e  for smaller chun
1030: 6b 73 2c 20 6f 72 20 61 20 68 61 73 68 20 6f 6e  ks, or a hash on
1040: 20 74 68 65 20 62 6c 6f 63 6b 20 73 69 7a 65 20   the block size 
1050: 66 6f 72 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20  for larger.  ** 
1060: 63 68 75 6e 6b 73 2e 0a 20 20 2a 2f 0a 20 20 75  chunks..  */.  u
1070: 33 32 20 61 69 53 6d 61 6c 6c 5b 4d 58 5f 53 4d  32 aiSmall[MX_SM
1080: 41 4c 4c 2d 31 5d 3b 20 20 20 2f 2a 20 46 6f 72  ALL-1];   /* For
1090: 20 73 69 7a 65 73 20 32 20 74 68 72 6f 75 67 68   sizes 2 through
10a0: 20 4d 58 5f 53 4d 41 4c 4c 2c 20 69 6e 63 6c 75   MX_SMALL, inclu
10b0: 73 69 76 65 20 2a 2f 0a 20 20 75 33 32 20 61 69  sive */.  u32 ai
10c0: 48 61 73 68 5b 4e 5f 48 41 53 48 5d 3b 20 20 20  Hash[N_HASH];   
10d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 69 7a 65       /* For size
10e0: 73 20 4d 58 5f 53 4d 41 4c 4c 2b 31 20 61 6e 64  s MX_SMALL+1 and
10f0: 20 6c 61 72 67 65 72 20 2a 2f 0a 0a 20 20 2f 2a   larger */..  /*
1100: 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 61 76 61  .  ** Memory ava
1110: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
1120: 61 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  ation.  */.  Mem
1130: 33 42 6c 6f 63 6b 20 61 50 6f 6f 6c 5b 53 51 4c  3Block aPool[SQL
1140: 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f  ITE_MEMORY_SIZE/
1150: 73 69 7a 65 6f 66 28 4d 65 6d 33 42 6c 6f 63 6b  sizeof(Mem3Block
1160: 29 2b 32 5d 3b 0a 7d 20 6d 65 6d 3b 0a 0a 2f 2a  )+2];.} mem;../*
1170: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63  .** Unlink the c
1180: 68 75 6e 6b 20 61 74 20 6d 65 6d 2e 61 50 6f 6f  hunk at mem.aPoo
1190: 6c 5b 69 5d 20 66 72 6f 6d 20 6c 69 73 74 20 69  l[i] from list i
11a0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  t is currently.*
11b0: 2a 20 6f 6e 2e 20 20 2a 70 52 6f 6f 74 20 69 73  * on.  *pRoot is
11c0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
11d0: 20 69 73 20 61 20 6d 65 6d 62 65 72 20 6f 66 2e   is a member of.
11e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11f0: 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72 6f  memsys3UnlinkFro
1200: 6d 4c 69 73 74 28 75 33 32 20 69 2c 20 75 33 32  mList(u32 i, u32
1210: 20 2a 70 52 6f 6f 74 29 7b 0a 20 20 75 33 32 20   *pRoot){.  u32 
1220: 6e 65 78 74 20 3d 20 6d 65 6d 2e 61 50 6f 6f 6c  next = mem.aPool
1230: 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b  [i].u.list.next;
1240: 0a 20 20 75 33 32 20 70 72 65 76 20 3d 20 6d 65  .  u32 prev = me
1250: 6d 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73  m.aPool[i].u.lis
1260: 74 2e 70 72 65 76 3b 0a 20 20 61 73 73 65 72 74  t.prev;.  assert
1270: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1280: 68 65 6c 64 28 6d 65 6d 2e 6d 75 74 65 78 29 20  held(mem.mutex) 
1290: 29 3b 0a 20 20 69 66 28 20 70 72 65 76 3d 3d 30  );.  if( prev==0
12a0: 20 29 7b 0a 20 20 20 20 2a 70 52 6f 6f 74 20 3d   ){.    *pRoot =
12b0: 20 6e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   next;.  }else{.
12c0: 20 20 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 70 72      mem.aPool[pr
12d0: 65 76 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 20  ev].u.list.next 
12e0: 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  = next;.  }.  if
12f0: 28 20 6e 65 78 74 20 29 7b 0a 20 20 20 20 6d 65  ( next ){.    me
1300: 6d 2e 61 50 6f 6f 6c 5b 6e 65 78 74 5d 2e 75 2e  m.aPool[next].u.
1310: 6c 69 73 74 2e 70 72 65 76 20 3d 20 70 72 65 76  list.prev = prev
1320: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 2e 61 50 6f 6f  ;.  }.  mem.aPoo
1330: 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74  l[i].u.list.next
1340: 20 3d 20 30 3b 0a 20 20 6d 65 6d 2e 61 50 6f 6f   = 0;.  mem.aPoo
1350: 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 70 72 65 76  l[i].u.list.prev
1360: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
1370: 6e 6c 69 6e 6b 20 74 68 65 20 63 68 75 6e 6b 20  nlink the chunk 
1380: 61 74 20 69 6e 64 65 78 20 69 20 66 72 6f 6d 20  at index i from 
1390: 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 6c 69 73  .** whatever lis
13a0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
13b0: 20 6d 65 6d 62 65 72 20 6f 66 2e 0a 2a 2f 0a 73   member of..*/.s
13c0: 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79  tatic void memsy
13d0: 73 33 55 6e 6c 69 6e 6b 28 75 33 32 20 69 29 7b  s3Unlink(u32 i){
13e0: 0a 20 20 75 33 32 20 73 69 7a 65 2c 20 68 61 73  .  u32 size, has
13f0: 68 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  h;.  assert( sql
1400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1410: 6d 65 6d 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20  mem.mutex) );.  
1420: 61 73 73 65 72 74 28 20 28 6d 65 6d 2e 61 50 6f  assert( (mem.aPo
1430: 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ol[i-1].u.hdr.si
1440: 7a 65 34 78 20 26 20 31 29 3d 3d 30 20 29 3b 0a  ze4x & 1)==0 );.
1450: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 31 20 29    assert( i>=1 )
1460: 3b 0a 20 20 73 69 7a 65 20 3d 20 6d 65 6d 2e 61  ;.  size = mem.a
1470: 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e  Pool[i-1].u.hdr.
1480: 73 69 7a 65 34 78 2f 34 3b 0a 20 20 61 73 73 65  size4x/4;.  asse
1490: 72 74 28 20 73 69 7a 65 3d 3d 6d 65 6d 2e 61 50  rt( size==mem.aP
14a0: 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e  ool[i+size-1].u.
14b0: 68 64 72 2e 70 72 65 76 53 69 7a 65 20 29 3b 0a  hdr.prevSize );.
14c0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
14d0: 32 20 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 20  2 );.  if( size 
14e0: 3c 3d 20 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20  <= MX_SMALL ){. 
14f0: 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b     memsys3Unlink
1500: 46 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d  FromList(i, &mem
1510: 2e 61 69 53 6d 61 6c 6c 5b 73 69 7a 65 2d 32 5d  .aiSmall[size-2]
1520: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1530: 68 61 73 68 20 3d 20 73 69 7a 65 20 25 20 4e 5f  hash = size % N_
1540: 48 41 53 48 3b 0a 20 20 20 20 6d 65 6d 73 79 73  HASH;.    memsys
1550: 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74 28  3UnlinkFromList(
1560: 69 2c 20 26 6d 65 6d 2e 61 69 48 61 73 68 5b 68  i, &mem.aiHash[h
1570: 61 73 68 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ash]);.  }.}../*
1580: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 63 68 75  .** Link the chu
1590: 6e 6b 20 61 74 20 6d 65 6d 2e 61 50 6f 6f 6c 5b  nk at mem.aPool[
15a0: 69 5d 20 73 6f 20 74 68 61 74 20 69 73 20 6f 6e  i] so that is on
15b0: 20 74 68 65 20 6c 69 73 74 20 72 6f 6f 74 65 64   the list rooted
15c0: 0a 2a 2a 20 61 74 20 2a 70 52 6f 6f 74 2e 0a 2a  .** at *pRoot..*
15d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
15e0: 6d 73 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69 73  msys3LinkIntoLis
15f0: 74 28 75 33 32 20 69 2c 20 75 33 32 20 2a 70 52  t(u32 i, u32 *pR
1600: 6f 6f 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  oot){.  assert( 
1610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1620: 6c 64 28 6d 65 6d 2e 6d 75 74 65 78 29 20 29 3b  ld(mem.mutex) );
1630: 0a 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 5d 2e  .  mem.aPool[i].
1640: 75 2e 6c 69 73 74 2e 6e 65 78 74 20 3d 20 2a 70  u.list.next = *p
1650: 52 6f 6f 74 3b 0a 20 20 6d 65 6d 2e 61 50 6f 6f  Root;.  mem.aPoo
1660: 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 70 72 65 76  l[i].u.list.prev
1670: 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 6f   = 0;.  if( *pRo
1680: 6f 74 20 29 7b 0a 20 20 20 20 6d 65 6d 2e 61 50  ot ){.    mem.aP
1690: 6f 6f 6c 5b 2a 70 52 6f 6f 74 5d 2e 75 2e 6c 69  ool[*pRoot].u.li
16a0: 73 74 2e 70 72 65 76 20 3d 20 69 3b 0a 20 20 7d  st.prev = i;.  }
16b0: 0a 20 20 2a 70 52 6f 6f 74 20 3d 20 69 3b 0a 7d  .  *pRoot = i;.}
16c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
16d0: 20 63 68 75 6e 6b 20 61 74 20 69 6e 64 65 78 20   chunk at index 
16e0: 69 20 69 6e 74 6f 20 65 69 74 68 65 72 20 74 68  i into either th
16f0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
1700: 20 73 6d 61 6c 6c 20 63 68 75 6e 6b 20 6c 69 73   small chunk lis
1710: 74 2c 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6c  t, or into the l
1720: 61 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 20  arge chunk hash 
1730: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1740: 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 4c 69 6e   void memsys3Lin
1750: 6b 28 75 33 32 20 69 29 7b 0a 20 20 75 33 32 20  k(u32 i){.  u32 
1760: 73 69 7a 65 2c 20 68 61 73 68 3b 0a 20 20 61 73  size, hash;.  as
1770: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1780: 74 65 78 5f 68 65 6c 64 28 6d 65 6d 2e 6d 75 74  tex_held(mem.mut
1790: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17a0: 20 69 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   i>=1 );.  asser
17b0: 74 28 20 28 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d  t( (mem.aPool[i-
17c0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20  1].u.hdr.size4x 
17d0: 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 73 69 7a  & 1)==0 );.  siz
17e0: 65 20 3d 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d  e = mem.aPool[i-
17f0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
1800: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  4;.  assert( siz
1810: 65 3d 3d 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2b 73  e==mem.aPool[i+s
1820: 69 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65  ize-1].u.hdr.pre
1830: 76 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  vSize );.  asser
1840: 74 28 20 73 69 7a 65 3e 3d 32 20 29 3b 0a 20 20  t( size>=2 );.  
1850: 69 66 28 20 73 69 7a 65 20 3c 3d 20 4d 58 5f 53  if( size <= MX_S
1860: 4d 41 4c 4c 20 29 7b 0a 20 20 20 20 6d 65 6d 73  MALL ){.    mems
1870: 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69 73 74 28  ys3LinkIntoList(
1880: 69 2c 20 26 6d 65 6d 2e 61 69 53 6d 61 6c 6c 5b  i, &mem.aiSmall[
1890: 73 69 7a 65 2d 32 5d 29 3b 0a 20 20 7d 65 6c 73  size-2]);.  }els
18a0: 65 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 73 69  e{.    hash = si
18b0: 7a 65 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20  ze % N_HASH;.   
18c0: 20 6d 65 6d 73 79 73 33 4c 69 6e 6b 49 6e 74 6f   memsys3LinkInto
18d0: 4c 69 73 74 28 69 2c 20 26 6d 65 6d 2e 61 69 48  List(i, &mem.aiH
18e0: 61 73 68 5b 68 61 73 68 5d 29 3b 0a 20 20 7d 0a  ash[hash]);.  }.
18f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 74 65 72 20 74  }../*.** Enter t
1900: 68 65 20 6d 75 74 65 78 20 6d 65 6d 2e 6d 75 74  he mutex mem.mut
1910: 65 78 2e 20 41 6c 6c 6f 63 61 74 65 20 69 74 20  ex. Allocate it 
1920: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1930: 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  eady allocated..
1940: 2a 2a 0a 2a 2a 20 41 6c 73 6f 3a 20 20 49 6e 69  **.** Also:  Ini
1950: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
1960: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75  ry allocation su
1970: 62 73 79 73 74 65 6d 20 74 68 65 20 66 69 72 73  bsystem the firs
1980: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 69 73 20 72  t time.** this r
1990: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19b0: 20 6d 65 6d 73 79 73 33 45 6e 74 65 72 28 76 6f   memsys3Enter(vo
19c0: 69 64 29 7b 0a 20 20 69 66 28 20 6d 65 6d 2e 6d  id){.  if( mem.m
19d0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  utex==0 ){.    m
19e0: 65 6d 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  em.mutex = sqlit
19f0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1a00: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1a10: 49 43 5f 4d 45 4d 29 3b 0a 20 20 20 20 6d 65 6d  IC_MEM);.    mem
1a20: 2e 61 50 6f 6f 6c 5b 30 5d 2e 75 2e 68 64 72 2e  .aPool[0].u.hdr.
1a30: 73 69 7a 65 34 78 20 3d 20 53 51 4c 49 54 45 5f  size4x = SQLITE_
1a40: 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f 32 20 2b 20  MEMORY_SIZE/2 + 
1a50: 32 3b 0a 20 20 20 20 6d 65 6d 2e 61 50 6f 6f 6c  2;.    mem.aPool
1a60: 5b 53 51 4c 49 54 45 5f 4d 45 4d 4f 52 59 5f 53  [SQLITE_MEMORY_S
1a70: 49 5a 45 2f 38 5d 2e 75 2e 68 64 72 2e 70 72 65  IZE/8].u.hdr.pre
1a80: 76 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 4d  vSize = SQLITE_M
1a90: 45 4d 4f 52 59 5f 53 49 5a 45 2f 38 3b 0a 20 20  EMORY_SIZE/8;.  
1aa0: 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 53 51 4c 49    mem.aPool[SQLI
1ab0: 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f 38  TE_MEMORY_SIZE/8
1ac0: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 3d  ].u.hdr.size4x =
1ad0: 20 31 3b 0a 20 20 20 20 6d 65 6d 2e 69 4d 61 73   1;.    mem.iMas
1ae0: 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  ter = 1;.    mem
1af0: 2e 73 7a 4d 61 73 74 65 72 20 3d 20 53 51 4c 49  .szMaster = SQLI
1b00: 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f 38  TE_MEMORY_SIZE/8
1b10: 3b 0a 20 20 20 20 6d 65 6d 2e 6d 6e 4d 61 73 74  ;.    mem.mnMast
1b20: 65 72 20 3d 20 6d 65 6d 2e 73 7a 4d 61 73 74 65  er = mem.szMaste
1b30: 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
1b40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
1b50: 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .mutex);.}../*.*
1b60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f  * Return the amo
1b70: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75  unt of memory cu
1b80: 72 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20  rrently checked 
1b90: 6f 75 74 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  out..*/.sqlite3_
1ba0: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6d 65  int64 sqlite3_me
1bb0: 6d 6f 72 79 5f 75 73 65 64 28 76 6f 69 64 29 7b  mory_used(void){
1bc0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1bd0: 20 6e 3b 0a 20 20 6d 65 6d 73 79 73 33 45 6e 74   n;.  memsys3Ent
1be0: 65 72 28 29 3b 0a 20 20 6e 20 3d 20 53 51 4c 49  er();.  n = SQLI
1bf0: 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 20 2d  TE_MEMORY_SIZE -
1c00: 20 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 2a 38 3b   mem.szMaster*8;
1c10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c20: 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78  _leave(mem.mutex
1c30: 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 3b  );  .  return n;
1c40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c50: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
1c60: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 74 68  unt of memory th
1c70: 61 74 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  at has ever been
1c80: 0a 2a 2a 20 63 68 65 63 6b 65 64 20 6f 75 74 20  .** checked out 
1c90: 73 69 6e 63 65 20 65 69 74 68 65 72 20 74 68 65  since either the
1ca0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1cb0: 69 73 20 70 72 6f 63 65 73 73 0a 2a 2a 20 6f 72  is process.** or
1cc0: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
1cd0: 72 65 63 65 6e 74 20 72 65 73 65 74 2e 0a 2a 2f  recent reset..*/
1ce0: 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73  .sqlite3_int64 s
1cf0: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69  qlite3_memory_hi
1d00: 67 68 77 61 74 65 72 28 69 6e 74 20 72 65 73 65  ghwater(int rese
1d10: 74 46 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  tFlag){.  sqlite
1d20: 33 5f 69 6e 74 36 34 20 6e 3b 0a 20 20 6d 65 6d  3_int64 n;.  mem
1d30: 73 79 73 33 45 6e 74 65 72 28 29 3b 0a 20 20 6e  sys3Enter();.  n
1d40: 20 3d 20 53 51 4c 49 54 45 5f 4d 45 4d 4f 52 59   = SQLITE_MEMORY
1d50: 5f 53 49 5a 45 20 2d 20 6d 65 6d 2e 6d 6e 4d 61  _SIZE - mem.mnMa
1d60: 73 74 65 72 2a 38 3b 0a 20 20 69 66 28 20 72 65  ster*8;.  if( re
1d70: 73 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 6d  setFlag ){.    m
1d80: 65 6d 2e 6d 6e 4d 61 73 74 65 72 20 3d 20 6d 65  em.mnMaster = me
1d90: 6d 2e 73 7a 4d 61 73 74 65 72 3b 0a 20 20 7d 0a  m.szMaster;.  }.
1da0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1db0: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
1dc0: 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ;  .  return n;.
1dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1de0: 74 68 65 20 61 6c 61 72 6d 20 63 61 6c 6c 62 61  the alarm callba
1df0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ck..**.** This i
1e00: 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
1e10: 65 20 73 74 61 74 69 63 20 6d 65 6d 6f 72 79 20  e static memory 
1e20: 61 6c 6c 6f 63 61 74 6f 72 2e 20 20 54 68 65 20  allocator.  The 
1e30: 70 75 72 70 6f 73 65 0a 2a 2a 20 6f 66 20 74 68  purpose.** of th
1e40: 65 20 6d 65 6d 6f 72 79 20 61 6c 61 72 6d 20 69  e memory alarm i
1e50: 73 20 74 6f 20 73 75 70 70 6f 72 74 20 73 71 6c  s to support sql
1e60: 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
1e70: 69 6d 69 74 28 29 2e 0a 2a 2a 20 42 75 74 20 77  imit()..** But w
1e80: 69 74 68 20 74 68 69 73 20 6d 65 6d 6f 72 79 20  ith this memory 
1e90: 61 6c 6c 6f 63 61 74 6f 72 2c 20 74 68 65 20 73  allocator, the s
1ea0: 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 69  oft_heap_limit i
1eb0: 73 20 72 65 61 6c 6c 79 0a 2a 2a 20 61 20 68 61  s really.** a ha
1ec0: 72 64 20 6c 69 6d 69 74 20 74 68 61 74 20 69 73  rd limit that is
1ed0: 20 66 69 78 65 64 20 61 74 20 53 51 4c 49 54 45   fixed at SQLITE
1ee0: 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2e 0a 2a 2f  _MEMORY_SIZE..*/
1ef0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  .int sqlite3_mem
1f00: 6f 72 79 5f 61 6c 61 72 6d 28 0a 20 20 76 6f 69  ory_alarm(.  voi
1f10: 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  d(*xCallback)(vo
1f20: 69 64 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65  id *pArg, sqlite
1f30: 33 5f 69 6e 74 36 34 20 75 73 65 64 2c 69 6e 74  3_int64 used,int
1f40: 20 4e 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72   N),.  void *pAr
1f50: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  g,.  sqlite3_int
1f60: 36 34 20 69 54 68 72 65 73 68 6f 6c 64 0a 29 7b  64 iThreshold.){
1f70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
1f90: 6c 6c 65 64 20 77 68 65 6e 20 77 65 20 61 72 65  lled when we are
1fa0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
1fb0: 66 79 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  fy an allocation
1fc0: 20 6f 66 20 6e 42 79 74 65 73 2e 0a 2a 2f 0a 73   of nBytes..*/.s
1fd0: 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79  tatic void memsy
1fe0: 73 33 4f 75 74 4f 66 4d 65 6d 6f 72 79 28 69 6e  s3OutOfMemory(in
1ff0: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  t nByte){.  if( 
2000: 21 6d 65 6d 2e 61 6c 61 72 6d 42 75 73 79 20 29  !mem.alarmBusy )
2010: 7b 0a 20 20 20 20 6d 65 6d 2e 61 6c 61 72 6d 42  {.    mem.alarmB
2020: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  usy = 1;.    ass
2030: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2040: 65 78 5f 68 65 6c 64 28 6d 65 6d 2e 6d 75 74 65  ex_held(mem.mute
2050: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
2060: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
2070: 6d 2e 6d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  m.mutex);.    sq
2080: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
2090: 6d 6f 72 79 28 6e 42 79 74 65 29 3b 0a 20 20 20  mory(nByte);.   
20a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
20b0: 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78 29 3b  nter(mem.mutex);
20c0: 0a 20 20 20 20 6d 65 6d 2e 61 6c 61 72 6d 42 75  .    mem.alarmBu
20d0: 73 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  sy = 0;.  }.}../
20e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20f0: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
2100: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
2110: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  n, in bytes.  Th
2120: 65 0a 2a 2a 20 73 69 7a 65 20 72 65 74 75 72 6e  e.** size return
2130: 65 64 20 6f 6d 69 74 73 20 74 68 65 20 38 2d 62  ed omits the 8-b
2140: 79 74 65 20 68 65 61 64 65 72 20 6f 76 65 72 68  yte header overh
2150: 65 61 64 2e 20 20 54 68 69 73 20 6f 6e 6c 79 0a  ead.  This only.
2160: 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 63 68 75  ** works for chu
2170: 6e 6b 73 20 74 68 61 74 20 61 72 65 20 63 75 72  nks that are cur
2180: 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f  rently checked o
2190: 75 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ut..*/.int sqlit
21a0: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 76 6f 69  e3MallocSize(voi
21b0: 64 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 53 69  d *p){.  int iSi
21c0: 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  ze = 0;.  if( p 
21d0: 29 7b 0a 20 20 20 20 4d 65 6d 33 42 6c 6f 63 6b  ){.    Mem3Block
21e0: 20 2a 70 42 6c 6f 63 6b 20 3d 20 28 4d 65 6d 33   *pBlock = (Mem3
21f0: 42 6c 6f 63 6b 2a 29 70 3b 0a 20 20 20 20 61 73  Block*)p;.    as
2200: 73 65 72 74 28 20 28 70 42 6c 6f 63 6b 5b 2d 31  sert( (pBlock[-1
2210: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 31  ].u.hdr.size4x&1
2220: 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 53 69 7a  )!=0 );.    iSiz
2230: 65 20 3d 20 28 70 42 6c 6f 63 6b 5b 2d 31 5d 2e  e = (pBlock[-1].
2240: 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 7e 33 29  u.hdr.size4x&~3)
2250: 2a 32 20 2d 20 34 3b 0a 20 20 7d 0a 20 20 72 65  *2 - 4;.  }.  re
2260: 74 75 72 6e 20 69 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn iSize;.}../
2270: 2a 0a 2a 2a 20 43 68 75 6e 6b 20 69 20 69 73 20  *.** Chunk i is 
2280: 61 20 66 72 65 65 20 63 68 75 6e 6b 20 74 68 61  a free chunk tha
2290: 74 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  t has been unlin
22a0: 6b 65 64 2e 20 20 41 64 6a 75 73 74 20 69 74 73  ked.  Adjust its
22b0: 20 0a 2a 2a 20 73 69 7a 65 20 70 61 72 61 6d 65   .** size parame
22c0: 74 65 72 73 20 66 6f 72 20 63 68 65 63 6b 2d 6f  ters for check-o
22d0: 75 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ut and return a 
22e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 0a  pointer to the .
22f0: 2a 2a 20 75 73 65 72 20 70 6f 72 74 69 6f 6e 20  ** user portion 
2300: 6f 66 20 74 68 65 20 63 68 75 6e 6b 2e 0a 2a 2f  of the chunk..*/
2310: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65  .static void *me
2320: 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 75 33  msys3Checkout(u3
2330: 32 20 69 2c 20 69 6e 74 20 6e 42 6c 6f 63 6b 29  2 i, int nBlock)
2340: 7b 0a 20 20 75 33 32 20 78 3b 0a 20 20 61 73 73  {.  u32 x;.  ass
2350: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2360: 65 78 5f 68 65 6c 64 28 6d 65 6d 2e 6d 75 74 65  ex_held(mem.mute
2370: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2380: 69 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  i>=1 );.  assert
2390: 28 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d 31 5d  ( mem.aPool[i-1]
23a0: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3d  .u.hdr.size4x/4=
23b0: 3d 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 61 73 73  =nBlock );.  ass
23c0: 65 72 74 28 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69  ert( mem.aPool[i
23d0: 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72  +nBlock-1].u.hdr
23e0: 2e 70 72 65 76 53 69 7a 65 3d 3d 6e 42 6c 6f 63  .prevSize==nBloc
23f0: 6b 20 29 3b 0a 20 20 78 20 3d 20 6d 65 6d 2e 61  k );.  x = mem.a
2400: 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e  Pool[i-1].u.hdr.
2410: 73 69 7a 65 34 78 3b 0a 20 20 6d 65 6d 2e 61 50  size4x;.  mem.aP
2420: 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73  ool[i-1].u.hdr.s
2430: 69 7a 65 34 78 20 3d 20 6e 42 6c 6f 63 6b 2a 34  ize4x = nBlock*4
2440: 20 7c 20 31 20 7c 20 28 78 26 32 29 3b 0a 20 20   | 1 | (x&2);.  
2450: 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2b 6e 42 6c 6f  mem.aPool[i+nBlo
2460: 63 6b 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76  ck-1].u.hdr.prev
2470: 53 69 7a 65 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20  Size = nBlock;. 
2480: 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2b 6e 42 6c   mem.aPool[i+nBl
2490: 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ock-1].u.hdr.siz
24a0: 65 34 78 20 7c 3d 20 32 3b 0a 20 20 72 65 74 75  e4x |= 2;.  retu
24b0: 72 6e 20 26 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 5d  rn &mem.aPool[i]
24c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 72 76 65  ;.}../*.** Carve
24d0: 20 61 20 70 69 65 63 65 20 6f 66 66 20 6f 66 20   a piece off of 
24e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
24f0: 65 6d 2e 69 4d 61 73 74 65 72 20 66 72 65 65 20  em.iMaster free 
2500: 63 68 75 6e 6b 2e 0a 2a 2a 20 52 65 74 75 72 6e  chunk..** Return
2510: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2520: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
2530: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 6d 61  .  Or, if the ma
2540: 73 74 65 72 20 63 68 75 6e 6b 0a 2a 2a 20 69 73  ster chunk.** is
2550: 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75 67   not large enoug
2560: 68 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  h, return 0..*/.
2570: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d  static void *mem
2580: 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72 28 69  sys3FromMaster(i
2590: 6e 74 20 6e 42 6c 6f 63 6b 29 7b 0a 20 20 61 73  nt nBlock){.  as
25a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25b0: 74 65 78 5f 68 65 6c 64 28 6d 65 6d 2e 6d 75 74  tex_held(mem.mut
25c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
25d0: 20 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 3e 3d 6e   mem.szMaster>=n
25e0: 42 6c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 6e  Block );.  if( n
25f0: 42 6c 6f 63 6b 3e 3d 6d 65 6d 2e 73 7a 4d 61 73  Block>=mem.szMas
2600: 74 65 72 2d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  ter-1 ){.    /* 
2610: 55 73 65 20 74 68 65 20 65 6e 74 69 72 65 20 6d  Use the entire m
2620: 61 73 74 65 72 20 2a 2f 0a 20 20 20 20 76 6f 69  aster */.    voi
2630: 64 20 2a 70 20 3d 20 6d 65 6d 73 79 73 33 43 68  d *p = memsys3Ch
2640: 65 63 6b 6f 75 74 28 6d 65 6d 2e 69 4d 61 73 74  eckout(mem.iMast
2650: 65 72 2c 20 6d 65 6d 2e 73 7a 4d 61 73 74 65 72  er, mem.szMaster
2660: 29 3b 0a 20 20 20 20 6d 65 6d 2e 69 4d 61 73 74  );.    mem.iMast
2670: 65 72 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 2e  er = 0;.    mem.
2680: 73 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  szMaster = 0;.  
2690: 20 20 6d 65 6d 2e 6d 6e 4d 61 73 74 65 72 20 3d    mem.mnMaster =
26a0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   0;.    return p
26b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26c0: 2a 20 53 70 6c 69 74 20 74 68 65 20 6d 61 73 74  * Split the mast
26d0: 65 72 20 62 6c 6f 63 6b 2e 20 20 52 65 74 75 72  er block.  Retur
26e0: 6e 20 74 68 65 20 74 61 69 6c 2e 20 2a 2f 0a 20  n the tail. */. 
26f0: 20 20 20 75 33 32 20 6e 65 77 69 2c 20 78 3b 0a     u32 newi, x;.
2700: 20 20 20 20 6e 65 77 69 20 3d 20 6d 65 6d 2e 69      newi = mem.i
2710: 4d 61 73 74 65 72 20 2b 20 6d 65 6d 2e 73 7a 4d  Master + mem.szM
2720: 61 73 74 65 72 20 2d 20 6e 42 6c 6f 63 6b 3b 0a  aster - nBlock;.
2730: 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 77 69      assert( newi
2740: 20 3e 20 6d 65 6d 2e 69 4d 61 73 74 65 72 2b 31   > mem.iMaster+1
2750: 20 29 3b 0a 20 20 20 20 6d 65 6d 2e 61 50 6f 6f   );.    mem.aPoo
2760: 6c 5b 6d 65 6d 2e 69 4d 61 73 74 65 72 2b 6d 65  l[mem.iMaster+me
2770: 6d 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e  m.szMaster-1].u.
2780: 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 6e  hdr.prevSize = n
2790: 42 6c 6f 63 6b 3b 0a 20 20 20 20 6d 65 6d 2e 61  Block;.    mem.a
27a0: 50 6f 6f 6c 5b 6d 65 6d 2e 69 4d 61 73 74 65 72  Pool[mem.iMaster
27b0: 2b 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 2d 31 5d  +mem.szMaster-1]
27c0: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 7c 3d  .u.hdr.size4x |=
27d0: 20 32 3b 0a 20 20 20 20 6d 65 6d 2e 61 50 6f 6f   2;.    mem.aPoo
27e0: 6c 5b 6e 65 77 69 2d 31 5d 2e 75 2e 68 64 72 2e  l[newi-1].u.hdr.
27f0: 73 69 7a 65 34 78 20 3d 20 6e 42 6c 6f 63 6b 2a  size4x = nBlock*
2800: 34 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 2e 73  4 + 1;.    mem.s
2810: 7a 4d 61 73 74 65 72 20 2d 3d 20 6e 42 6c 6f 63  zMaster -= nBloc
2820: 6b 3b 0a 20 20 20 20 6d 65 6d 2e 61 50 6f 6f 6c  k;.    mem.aPool
2830: 5b 6e 65 77 69 2d 31 5d 2e 75 2e 68 64 72 2e 70  [newi-1].u.hdr.p
2840: 72 65 76 53 69 7a 65 20 3d 20 6d 65 6d 2e 73 7a  revSize = mem.sz
2850: 4d 61 73 74 65 72 3b 0a 20 20 20 20 78 20 3d 20  Master;.    x = 
2860: 6d 65 6d 2e 61 50 6f 6f 6c 5b 6d 65 6d 2e 69 4d  mem.aPool[mem.iM
2870: 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73  aster-1].u.hdr.s
2880: 69 7a 65 34 78 20 26 20 32 3b 0a 20 20 20 20 6d  ize4x & 2;.    m
2890: 65 6d 2e 61 50 6f 6f 6c 5b 6d 65 6d 2e 69 4d 61  em.aPool[mem.iMa
28a0: 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ster-1].u.hdr.si
28b0: 7a 65 34 78 20 3d 20 6d 65 6d 2e 73 7a 4d 61 73  ze4x = mem.szMas
28c0: 74 65 72 2a 34 20 7c 20 78 3b 0a 20 20 20 20 69  ter*4 | x;.    i
28d0: 66 28 20 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 20  f( mem.szMaster 
28e0: 3c 20 6d 65 6d 2e 6d 6e 4d 61 73 74 65 72 20 29  < mem.mnMaster )
28f0: 7b 0a 20 20 20 20 20 20 6d 65 6d 2e 6d 6e 4d 61  {.      mem.mnMa
2900: 73 74 65 72 20 3d 20 6d 65 6d 2e 73 7a 4d 61 73  ster = mem.szMas
2910: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ter;.    }.    r
2920: 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 26 6d 65  eturn (void*)&me
2930: 6d 2e 61 50 6f 6f 6c 5b 6e 65 77 69 5d 3b 0a 20  m.aPool[newi];. 
2940: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 2a 70 52 6f   }.}../*.** *pRo
2950: 6f 74 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  ot is the head o
2960: 66 20 61 20 6c 69 73 74 20 6f 66 20 66 72 65 65  f a list of free
2970: 20 63 68 75 6e 6b 73 20 6f 66 20 74 68 65 20 73   chunks of the s
2980: 61 6d 65 20 73 69 7a 65 0a 2a 2a 20 6f 72 20 73  ame size.** or s
2990: 61 6d 65 20 73 69 7a 65 20 68 61 73 68 2e 20 20  ame size hash.  
29a0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29b0: 2a 70 52 6f 6f 74 20 69 73 20 61 6e 20 65 6e 74  *pRoot is an ent
29c0: 72 79 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  ry in either.** 
29d0: 6d 65 6d 2e 61 69 53 6d 61 6c 6c 5b 5d 20 6f 72  mem.aiSmall[] or
29e0: 20 6d 65 6d 2e 61 69 48 61 73 68 5b 5d 2e 20 20   mem.aiHash[].  
29f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a00: 69 6e 65 20 65 78 61 6d 69 6e 65 73 20 61 6c 6c  ine examines all
2a10: 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20   entries on the 
2a20: 67 69 76 65 6e 20 6c 69 73 74 20 61 6e 64 20 74  given list and t
2a30: 72 69 65 73 0a 2a 2a 20 74 6f 20 63 6f 61 6c 65  ries.** to coale
2a40: 73 63 65 20 65 61 63 68 20 65 6e 74 72 69 65 73  sce each entries
2a50: 20 77 69 74 68 20 61 64 6a 61 63 65 6e 74 20 66   with adjacent f
2a60: 72 65 65 20 63 68 75 6e 6b 73 2e 20 20 0a 2a 2a  ree chunks.  .**
2a70: 0a 2a 2a 20 49 66 20 69 74 20 73 65 65 73 20 61  .** If it sees a
2a80: 20 63 68 75 6e 6b 20 74 68 61 74 20 69 73 20 6c   chunk that is l
2a90: 61 72 67 65 72 20 74 68 61 6e 20 6d 65 6d 2e 69  arger than mem.i
2aa0: 4d 61 73 74 65 72 2c 20 69 74 20 72 65 70 6c 61  Master, it repla
2ab0: 63 65 73 20 0a 2a 2a 20 74 68 65 20 63 75 72 72  ces .** the curr
2ac0: 65 6e 74 20 6d 65 6d 2e 69 4d 61 73 74 65 72 20  ent mem.iMaster 
2ad0: 77 69 74 68 20 74 68 65 20 6e 65 77 20 6c 61 72  with the new lar
2ae0: 67 65 72 20 63 68 75 6e 6b 2e 20 20 49 6e 20 6f  ger chunk.  In o
2af0: 72 64 65 72 20 66 6f 72 0a 2a 2a 20 74 68 69 73  rder for.** this
2b00: 20 6d 65 6d 2e 69 4d 61 73 74 65 72 20 72 65 70   mem.iMaster rep
2b10: 6c 61 63 65 6d 65 6e 74 20 74 6f 20 77 6f 72 6b  lacement to work
2b20: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 63 68 75  , the master chu
2b30: 6e 6b 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6c 69  nk must be.** li
2b40: 6e 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 68 61  nked into the ha
2b50: 73 68 20 74 61 62 6c 65 73 2e 20 20 54 68 61 74  sh tables.  That
2b60: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 6f 72 6d   is not the norm
2b70: 61 6c 20 73 74 61 74 65 20 6f 66 0a 2a 2a 20 61  al state of.** a
2b80: 66 66 61 69 72 73 2c 20 6f 66 20 63 6f 75 72 73  ffairs, of cours
2b90: 65 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  e.  The calling 
2ba0: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 6c 69 6e  routine must lin
2bb0: 6b 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  k the master.** 
2bc0: 63 68 75 6e 6b 20 62 65 66 6f 72 65 20 69 6e 76  chunk before inv
2bd0: 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
2be0: 6e 65 2c 20 74 68 65 6e 20 6d 75 73 74 20 75 6e  ne, then must un
2bf0: 6c 69 6e 6b 20 74 68 65 20 28 70 6f 73 73 69 62  link the (possib
2c00: 6c 79 0a 2a 2a 20 63 68 61 6e 67 65 64 29 20 6d  ly.** changed) m
2c10: 61 73 74 65 72 20 63 68 75 6e 6b 20 6f 6e 63 65  aster chunk once
2c20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   this routine ha
2c30: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2f 0a 73  s finished..*/.s
2c40: 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79  tatic void memsy
2c50: 73 33 4d 65 72 67 65 28 75 33 32 20 2a 70 52 6f  s3Merge(u32 *pRo
2c60: 6f 74 29 7b 0a 20 20 75 33 32 20 69 4e 65 78 74  ot){.  u32 iNext
2c70: 2c 20 70 72 65 76 2c 20 73 69 7a 65 2c 20 69 2c  , prev, size, i,
2c80: 20 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   x;..  assert( s
2c90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ca0: 64 28 6d 65 6d 2e 6d 75 74 65 78 29 20 29 3b 0a  d(mem.mutex) );.
2cb0: 20 20 66 6f 72 28 69 3d 2a 70 52 6f 6f 74 3b 20    for(i=*pRoot; 
2cc0: 69 3e 30 3b 20 69 3d 69 4e 65 78 74 29 7b 0a 20  i>0; i=iNext){. 
2cd0: 20 20 20 69 4e 65 78 74 20 3d 20 6d 65 6d 2e 61     iNext = mem.a
2ce0: 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e  Pool[i].u.list.n
2cf0: 65 78 74 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  ext;.    size = 
2d00: 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75  mem.aPool[i-1].u
2d10: 2e 68 64 72 2e 73 69 7a 65 34 78 3b 0a 20 20 20  .hdr.size4x;.   
2d20: 20 61 73 73 65 72 74 28 20 28 73 69 7a 65 26 31   assert( (size&1
2d30: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
2d40: 28 73 69 7a 65 26 32 29 3d 3d 30 20 29 7b 0a 20  (size&2)==0 ){. 
2d50: 20 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69       memsys3Unli
2d60: 6e 6b 46 72 6f 6d 4c 69 73 74 28 69 2c 20 70 52  nkFromList(i, pR
2d70: 6f 6f 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  oot);.      asse
2d80: 72 74 28 20 69 20 3e 20 6d 65 6d 2e 61 50 6f 6f  rt( i > mem.aPoo
2d90: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65  l[i-1].u.hdr.pre
2da0: 76 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 70  vSize );.      p
2db0: 72 65 76 20 3d 20 69 20 2d 20 6d 65 6d 2e 61 50  rev = i - mem.aP
2dc0: 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 70  ool[i-1].u.hdr.p
2dd0: 72 65 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  revSize;.      i
2de0: 66 28 20 70 72 65 76 3d 3d 69 4e 65 78 74 20 29  f( prev==iNext )
2df0: 7b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 20  {.        iNext 
2e00: 3d 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 70 72 65 76  = mem.aPool[prev
2e10: 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b 0a 20  ].u.list.next;. 
2e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
2e30: 73 79 73 33 55 6e 6c 69 6e 6b 28 70 72 65 76 29  sys3Unlink(prev)
2e40: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 69  ;.      size = i
2e50: 20 2b 20 73 69 7a 65 2f 34 20 2d 20 70 72 65 76   + size/4 - prev
2e60: 3b 0a 20 20 20 20 20 20 78 20 3d 20 6d 65 6d 2e  ;.      x = mem.
2e70: 61 50 6f 6f 6c 5b 70 72 65 76 2d 31 5d 2e 75 2e  aPool[prev-1].u.
2e80: 68 64 72 2e 73 69 7a 65 34 78 20 26 20 32 3b 0a  hdr.size4x & 2;.
2e90: 20 20 20 20 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b        mem.aPool[
2ea0: 70 72 65 76 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  prev-1].u.hdr.si
2eb0: 7a 65 34 78 20 3d 20 73 69 7a 65 2a 34 20 7c 20  ze4x = size*4 | 
2ec0: 78 3b 0a 20 20 20 20 20 20 6d 65 6d 2e 61 50 6f  x;.      mem.aPo
2ed0: 6f 6c 5b 70 72 65 76 2b 73 69 7a 65 2d 31 5d 2e  ol[prev+size-1].
2ee0: 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 3d  u.hdr.prevSize =
2ef0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d   size;.      mem
2f00: 73 79 73 33 4c 69 6e 6b 28 70 72 65 76 29 3b 0a  sys3Link(prev);.
2f10: 20 20 20 20 20 20 69 20 3d 20 70 72 65 76 3b 0a        i = prev;.
2f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f30: 20 73 69 7a 65 20 2f 3d 20 34 3b 0a 20 20 20 20   size /= 4;.    
2f40: 7d 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3e 6d  }.    if( size>m
2f50: 65 6d 2e 73 7a 4d 61 73 74 65 72 20 29 7b 0a 20  em.szMaster ){. 
2f60: 20 20 20 20 20 6d 65 6d 2e 69 4d 61 73 74 65 72       mem.iMaster
2f70: 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 65 6d 2e   = i;.      mem.
2f80: 73 7a 4d 61 73 74 65 72 20 3d 20 73 69 7a 65 3b  szMaster = size;
2f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2fa0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6c 6f  .** Return a blo
2fb0: 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 66 20  ck of memory of 
2fc0: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 73 20  at least nBytes 
2fd0: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 52 65 74 75  in size..** Retu
2fe0: 72 6e 20 4e 55 4c 4c 20 69 66 20 75 6e 61 62 6c  rn NULL if unabl
2ff0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
3000: 64 20 2a 6d 65 6d 73 79 73 33 4d 61 6c 6c 6f 63  d *memsys3Malloc
3010: 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 75  (int nByte){.  u
3020: 33 32 20 69 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f  32 i;.  int nBlo
3030: 63 6b 3b 0a 20 20 69 6e 74 20 74 6f 46 72 65 65  ck;.  int toFree
3040: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
3050: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3060: 6d 65 6d 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20  mem.mutex) );.  
3070: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 4d  assert( sizeof(M
3080: 65 6d 33 42 6c 6f 63 6b 29 3d 3d 38 20 29 3b 0a  em3Block)==8 );.
3090: 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 31 32 20    if( nByte<=12 
30a0: 29 7b 0a 20 20 20 20 6e 42 6c 6f 63 6b 20 3d 20  ){.    nBlock = 
30b0: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
30c0: 6e 42 6c 6f 63 6b 20 3d 20 28 6e 42 79 74 65 20  nBlock = (nByte 
30d0: 2b 20 31 31 29 2f 38 3b 0a 20 20 7d 0a 20 20 61  + 11)/8;.  }.  a
30e0: 73 73 65 72 74 28 20 6e 42 6c 6f 63 6b 20 3e 3d  ssert( nBlock >=
30f0: 20 32 20 29 3b 0a 0a 20 20 2f 2a 20 53 54 45 50   2 );..  /* STEP
3100: 20 31 3a 0a 20 20 2a 2a 20 4c 6f 6f 6b 20 66 6f   1:.  ** Look fo
3110: 72 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  r an entry of th
3120: 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 69  e correct size i
3130: 6e 20 65 69 74 68 65 72 20 74 68 65 20 73 6d 61  n either the sma
3140: 6c 6c 0a 20 20 2a 2a 20 63 68 75 6e 6b 20 74 61  ll.  ** chunk ta
3150: 62 6c 65 20 6f 72 20 69 6e 20 74 68 65 20 6c 61  ble or in the la
3160: 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 20 74  rge chunk hash t
3170: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
3180: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6d   ** successful m
3190: 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20  ost of the time 
31a0: 28 61 62 6f 75 74 20 39 20 74 69 6d 65 73 20 6f  (about 9 times o
31b0: 75 74 20 6f 66 20 31 30 29 2e 0a 20 20 2a 2f 0a  ut of 10)..  */.
31c0: 20 20 69 66 28 20 6e 42 6c 6f 63 6b 20 3c 3d 20    if( nBlock <= 
31d0: 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20 20 20 20  MX_SMALL ){.    
31e0: 69 20 3d 20 6d 65 6d 2e 61 69 53 6d 61 6c 6c 5b  i = mem.aiSmall[
31f0: 6e 42 6c 6f 63 6b 2d 32 5d 3b 0a 20 20 20 20 69  nBlock-2];.    i
3200: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
3210: 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72 6f  memsys3UnlinkFro
3220: 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 2e 61 69  mList(i, &mem.ai
3230: 53 6d 61 6c 6c 5b 6e 42 6c 6f 63 6b 2d 32 5d 29  Small[nBlock-2])
3240: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
3250: 65 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 69  emsys3Checkout(i
3260: 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d  , nBlock);.    }
3270: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
3280: 74 20 68 61 73 68 20 3d 20 6e 42 6c 6f 63 6b 20  t hash = nBlock 
3290: 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20 66 6f  % N_HASH;.    fo
32a0: 72 28 69 3d 6d 65 6d 2e 61 69 48 61 73 68 5b 68  r(i=mem.aiHash[h
32b0: 61 73 68 5d 3b 20 69 3e 30 3b 20 69 3d 6d 65 6d  ash]; i>0; i=mem
32c0: 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74  .aPool[i].u.list
32d0: 2e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  .next){.      if
32e0: 28 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d 31 5d  ( mem.aPool[i-1]
32f0: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3d  .u.hdr.size4x/4=
3300: 3d 6e 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  =nBlock ){.     
3310: 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b     memsys3Unlink
3320: 46 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d  FromList(i, &mem
3330: 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b 0a  .aiHash[hash]);.
3340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
3350: 65 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 69  emsys3Checkout(i
3360: 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , nBlock);.     
3370: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
3380: 2f 2a 20 53 54 45 50 20 32 3a 0a 20 20 2a 2a 20  /* STEP 2:.  ** 
3390: 54 72 79 20 74 6f 20 73 61 74 69 73 66 79 20 74  Try to satisfy t
33a0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 62 79  he allocation by
33b0: 20 63 61 72 76 69 6e 67 20 61 20 70 69 65 63 65   carving a piece
33c0: 20 6f 66 66 20 6f 66 20 74 68 65 20 65 6e 64 0a   off of the end.
33d0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 73 74    ** of the mast
33e0: 65 72 20 63 68 75 6e 6b 2e 20 20 54 68 69 73 20  er chunk.  This 
33f0: 73 74 65 70 20 75 73 75 61 6c 6c 79 20 77 6f 72  step usually wor
3400: 6b 73 20 69 66 20 73 74 65 70 20 31 20 66 61 69  ks if step 1 fai
3410: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6d  ls..  */.  if( m
3420: 65 6d 2e 73 7a 4d 61 73 74 65 72 3e 3d 6e 42 6c  em.szMaster>=nBl
3430: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
3440: 6e 20 6d 65 6d 73 79 73 33 46 72 6f 6d 4d 61 73  n memsys3FromMas
3450: 74 65 72 28 6e 42 6c 6f 63 6b 29 3b 0a 20 20 7d  ter(nBlock);.  }
3460: 0a 0a 0a 20 20 2f 2a 20 53 54 45 50 20 33 3a 20  ...  /* STEP 3: 
3470: 20 0a 20 20 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f   .  ** Loop thro
3480: 75 67 68 20 74 68 65 20 65 6e 74 69 72 65 20 6d  ugh the entire m
3490: 65 6d 6f 72 79 20 70 6f 6f 6c 2e 20 20 43 6f 61  emory pool.  Coa
34a0: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
34b0: 72 65 65 0a 20 20 2a 2a 20 63 68 75 6e 6b 73 2e  ree.  ** chunks.
34c0: 20 20 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20    Recompute the 
34d0: 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 61 73 20  master chunk as 
34e0: 74 68 65 20 6c 61 72 67 65 73 74 20 66 72 65 65  the largest free
34f0: 20 63 68 75 6e 6b 2e 0a 20 20 2a 2a 20 54 68 65   chunk..  ** The
3500: 6e 20 74 72 79 20 61 67 61 69 6e 20 74 6f 20 73  n try again to s
3510: 61 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63  atisfy the alloc
3520: 61 74 69 6f 6e 20 62 79 20 63 61 72 76 69 6e 67  ation by carving
3530: 20 61 20 70 69 65 63 65 20 6f 66 66 0a 20 20 2a   a piece off.  *
3540: 2a 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  * of the end of 
3550: 74 68 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b  the master chunk
3560: 2e 20 20 54 68 69 73 20 73 74 65 70 20 68 61 70  .  This step hap
3570: 70 65 6e 73 20 76 65 72 79 0a 20 20 2a 2a 20 72  pens very.  ** r
3580: 61 72 65 6c 79 20 28 77 65 20 68 6f 70 65 21 29  arely (we hope!)
3590: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 74 6f 46 72  .  */.  for(toFr
35a0: 65 65 3d 6e 42 6c 6f 63 6b 2a 31 36 3b 20 74 6f  ee=nBlock*16; to
35b0: 46 72 65 65 3c 53 51 4c 49 54 45 5f 4d 45 4d 4f  Free<SQLITE_MEMO
35c0: 52 59 5f 53 49 5a 45 2a 32 3b 20 74 6f 46 72 65  RY_SIZE*2; toFre
35d0: 65 20 2a 3d 20 32 29 7b 0a 20 20 20 20 6d 65 6d  e *= 2){.    mem
35e0: 73 79 73 33 4f 75 74 4f 66 4d 65 6d 6f 72 79 28  sys3OutOfMemory(
35f0: 74 6f 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28  toFree);.    if(
3600: 20 6d 65 6d 2e 69 4d 61 73 74 65 72 20 29 7b 0a   mem.iMaster ){.
3610: 20 20 20 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e        memsys3Lin
3620: 6b 28 6d 65 6d 2e 69 4d 61 73 74 65 72 29 3b 0a  k(mem.iMaster);.
3630: 20 20 20 20 20 20 6d 65 6d 2e 69 4d 61 73 74 65        mem.iMaste
3640: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d  r = 0;.      mem
3650: 2e 73 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  .szMaster = 0;. 
3660: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3670: 3b 20 69 3c 4e 5f 48 41 53 48 3b 20 69 2b 2b 29  ; i<N_HASH; i++)
3680: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33 4d  {.      memsys3M
3690: 65 72 67 65 28 26 6d 65 6d 2e 61 69 48 61 73 68  erge(&mem.aiHash
36a0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
36b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 53 4d  for(i=0; i<MX_SM
36c0: 41 4c 4c 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ALL-1; i++){.   
36d0: 20 20 20 6d 65 6d 73 79 73 33 4d 65 72 67 65 28     memsys3Merge(
36e0: 26 6d 65 6d 2e 61 69 53 6d 61 6c 6c 5b 69 5d 29  &mem.aiSmall[i])
36f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3700: 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 20 29 7b 0a  mem.szMaster ){.
3710: 20 20 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c        memsys3Unl
3720: 69 6e 6b 28 6d 65 6d 2e 69 4d 61 73 74 65 72 29  ink(mem.iMaster)
3730: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 2e  ;.      if( mem.
3740: 73 7a 4d 61 73 74 65 72 3e 3d 6e 42 6c 6f 63 6b  szMaster>=nBlock
3750: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3760: 72 6e 20 6d 65 6d 73 79 73 33 46 72 6f 6d 4d 61  rn memsys3FromMa
3770: 73 74 65 72 28 6e 42 6c 6f 63 6b 29 3b 0a 20 20  ster(nBlock);.  
3780: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3790: 0a 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66  .  /* If none of
37a0: 20 74 68 65 20 61 62 6f 76 65 20 77 6f 72 6b 65   the above worke
37b0: 64 2c 20 74 68 65 6e 20 77 65 20 66 61 69 6c 2e  d, then we fail.
37c0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
37d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
37e0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d   outstanding mem
37f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ory allocation..
3800: 2a 2f 0a 76 6f 69 64 20 6d 65 6d 73 79 73 33 46  */.void memsys3F
3810: 72 65 65 28 76 6f 69 64 20 2a 70 4f 6c 64 29 7b  ree(void *pOld){
3820: 0a 20 20 4d 65 6d 33 42 6c 6f 63 6b 20 2a 70 20  .  Mem3Block *p 
3830: 3d 20 28 4d 65 6d 33 42 6c 6f 63 6b 2a 29 70 4f  = (Mem3Block*)pO
3840: 6c 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  ld;.  int i;.  u
3850: 33 32 20 73 69 7a 65 2c 20 78 3b 0a 20 20 61 73  32 size, x;.  as
3860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3870: 74 65 78 5f 68 65 6c 64 28 6d 65 6d 2e 6d 75 74  tex_held(mem.mut
3880: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
3890: 20 70 3e 6d 65 6d 2e 61 50 6f 6f 6c 20 26 26 20   p>mem.aPool && 
38a0: 70 3c 26 6d 65 6d 2e 61 50 6f 6f 6c 5b 53 51 4c  p<&mem.aPool[SQL
38b0: 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f  ITE_MEMORY_SIZE/
38c0: 38 5d 20 29 3b 0a 20 20 69 20 3d 20 70 20 2d 20  8] );.  i = p - 
38d0: 6d 65 6d 2e 61 50 6f 6f 6c 3b 0a 20 20 61 73 73  mem.aPool;.  ass
38e0: 65 72 74 28 20 28 6d 65 6d 2e 61 50 6f 6f 6c 5b  ert( (mem.aPool[
38f0: 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34  i-1].u.hdr.size4
3900: 78 26 31 29 3d 3d 31 20 29 3b 0a 20 20 73 69 7a  x&1)==1 );.  siz
3910: 65 20 3d 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d  e = mem.aPool[i-
3920: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
3930: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 69 2b 73  4;.  assert( i+s
3940: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 45 4d 4f  ize<=SQLITE_MEMO
3950: 52 59 5f 53 49 5a 45 2f 38 2b 31 20 29 3b 0a 20  RY_SIZE/8+1 );. 
3960: 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e   mem.aPool[i-1].
3970: 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 3d 20  u.hdr.size4x &= 
3980: 7e 31 3b 0a 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b  ~1;.  mem.aPool[
3990: 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e  i+size-1].u.hdr.
39a0: 70 72 65 76 53 69 7a 65 20 3d 20 73 69 7a 65 3b  prevSize = size;
39b0: 0a 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2b 73  .  mem.aPool[i+s
39c0: 69 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ize-1].u.hdr.siz
39d0: 65 34 78 20 26 3d 20 7e 32 3b 0a 20 20 6d 65 6d  e4x &= ~2;.  mem
39e0: 73 79 73 33 4c 69 6e 6b 28 69 29 3b 0a 0a 20 20  sys3Link(i);..  
39f0: 2f 2a 20 54 72 79 20 74 6f 20 65 78 70 61 6e 64  /* Try to expand
3a00: 20 74 68 65 20 6d 61 73 74 65 72 20 75 73 69 6e   the master usin
3a10: 67 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65  g the newly free
3a20: 64 20 63 68 75 6e 6b 20 2a 2f 0a 20 20 69 66 28  d chunk */.  if(
3a30: 20 6d 65 6d 2e 69 4d 61 73 74 65 72 20 29 7b 0a   mem.iMaster ){.
3a40: 20 20 20 20 77 68 69 6c 65 28 20 28 6d 65 6d 2e      while( (mem.
3a50: 61 50 6f 6f 6c 5b 6d 65 6d 2e 69 4d 61 73 74 65  aPool[mem.iMaste
3a60: 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34  r-1].u.hdr.size4
3a70: 78 26 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x&2)==0 ){.     
3a80: 20 73 69 7a 65 20 3d 20 6d 65 6d 2e 61 50 6f 6f   size = mem.aPoo
3a90: 6c 5b 6d 65 6d 2e 69 4d 61 73 74 65 72 2d 31 5d  l[mem.iMaster-1]
3aa0: 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 3b  .u.hdr.prevSize;
3ab0: 0a 20 20 20 20 20 20 6d 65 6d 2e 69 4d 61 73 74  .      mem.iMast
3ac0: 65 72 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  er -= size;.    
3ad0: 20 20 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 20 2b    mem.szMaster +
3ae0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65  = size;.      me
3af0: 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 6d 65 6d 2e  msys3Unlink(mem.
3b00: 69 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  iMaster);.      
3b10: 78 20 3d 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 6d 65  x = mem.aPool[me
3b20: 6d 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68  m.iMaster-1].u.h
3b30: 64 72 2e 73 69 7a 65 34 78 20 26 20 32 3b 0a 20  dr.size4x & 2;. 
3b40: 20 20 20 20 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 6d       mem.aPool[m
3b50: 65 6d 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75 2e  em.iMaster-1].u.
3b60: 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6d 65 6d  hdr.size4x = mem
3b70: 2e 73 7a 4d 61 73 74 65 72 2a 34 20 7c 20 78 3b  .szMaster*4 | x;
3b80: 0a 20 20 20 20 20 20 6d 65 6d 2e 61 50 6f 6f 6c  .      mem.aPool
3b90: 5b 6d 65 6d 2e 69 4d 61 73 74 65 72 2b 6d 65 6d  [mem.iMaster+mem
3ba0: 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68  .szMaster-1].u.h
3bb0: 64 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 6d 65  dr.prevSize = me
3bc0: 6d 2e 73 7a 4d 61 73 74 65 72 3b 0a 20 20 20 20  m.szMaster;.    
3bd0: 7d 0a 20 20 20 20 78 20 3d 20 6d 65 6d 2e 61 50  }.    x = mem.aP
3be0: 6f 6f 6c 5b 6d 65 6d 2e 69 4d 61 73 74 65 72 2d  ool[mem.iMaster-
3bf0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20  1].u.hdr.size4x 
3c00: 26 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  & 2;.    while( 
3c10: 28 6d 65 6d 2e 61 50 6f 6f 6c 5b 6d 65 6d 2e 69  (mem.aPool[mem.i
3c20: 4d 61 73 74 65 72 2b 6d 65 6d 2e 73 7a 4d 61 73  Master+mem.szMas
3c30: 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ter-1].u.hdr.siz
3c40: 65 34 78 26 31 29 3d 3d 30 20 29 7b 0a 20 20 20  e4x&1)==0 ){.   
3c50: 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b     memsys3Unlink
3c60: 28 6d 65 6d 2e 69 4d 61 73 74 65 72 2b 6d 65 6d  (mem.iMaster+mem
3c70: 2e 73 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  .szMaster);.    
3c80: 20 20 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 20 2b    mem.szMaster +
3c90: 3d 20 6d 65 6d 2e 61 50 6f 6f 6c 5b 6d 65 6d 2e  = mem.aPool[mem.
3ca0: 69 4d 61 73 74 65 72 2b 6d 65 6d 2e 73 7a 4d 61  iMaster+mem.szMa
3cb0: 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ster-1].u.hdr.si
3cc0: 7a 65 34 78 2f 34 3b 0a 20 20 20 20 20 20 6d 65  ze4x/4;.      me
3cd0: 6d 2e 61 50 6f 6f 6c 5b 6d 65 6d 2e 69 4d 61 73  m.aPool[mem.iMas
3ce0: 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ter-1].u.hdr.siz
3cf0: 65 34 78 20 3d 20 6d 65 6d 2e 73 7a 4d 61 73 74  e4x = mem.szMast
3d00: 65 72 2a 34 20 7c 20 78 3b 0a 20 20 20 20 20 20  er*4 | x;.      
3d10: 6d 65 6d 2e 61 50 6f 6f 6c 5b 6d 65 6d 2e 69 4d  mem.aPool[mem.iM
3d20: 61 73 74 65 72 2b 6d 65 6d 2e 73 7a 4d 61 73 74  aster+mem.szMast
3d30: 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76  er-1].u.hdr.prev
3d40: 53 69 7a 65 20 3d 20 6d 65 6d 2e 73 7a 4d 61 73  Size = mem.szMas
3d50: 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ter;.    }.  }.}
3d60: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
3d70: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
3d80: 79 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  y.*/.void *sqlit
3d90: 65 33 5f 6d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  e3_malloc(int nB
3da0: 79 74 65 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ytes){.  sqlite3
3db0: 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b 0a 20  _int64 *p = 0;. 
3dc0: 20 69 66 28 20 6e 42 79 74 65 73 3e 30 20 29 7b   if( nBytes>0 ){
3dd0: 0a 20 20 20 20 6d 65 6d 73 79 73 33 45 6e 74 65  .    memsys3Ente
3de0: 72 28 29 3b 0a 20 20 20 20 70 20 3d 20 6d 65 6d  r();.    p = mem
3df0: 73 79 73 33 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  sys3Malloc(nByte
3e00: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
3e10: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e  mutex_leave(mem.
3e20: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 65  mutex);.  }.  re
3e30: 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 20 0a  turn (void*)p; .
3e40: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
3e50: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
3e60: 6c 69 74 65 33 5f 66 72 65 65 28 76 6f 69 64 20  lite3_free(void 
3e70: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 69 66 28 20  *pPrior){.  if( 
3e80: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
3e90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3ea0: 73 73 65 72 74 28 20 6d 65 6d 2e 6d 75 74 65 78  ssert( mem.mutex
3eb0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
3ec0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
3ed0: 2e 6d 75 74 65 78 29 3b 0a 20 20 6d 65 6d 73 79  .mutex);.  memsy
3ee0: 73 33 46 72 65 65 28 70 50 72 69 6f 72 29 3b 0a  s3Free(pPrior);.
3ef0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
3f00: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
3f10: 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ;  .}../*.** Cha
3f20: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
3f30: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f  an existing memo
3f40: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ry allocation.*/
3f50: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
3f60: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
3f70: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
3f80: 7b 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 0a 20 20  {.  int nOld;.  
3f90: 76 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 70  void *p;.  if( p
3fa0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
3fb0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
3fc0: 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20  alloc(nBytes);. 
3fd0: 20 7d 0a 20 20 69 66 28 20 6e 42 79 74 65 73 3c   }.  if( nBytes<
3fe0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3ff0: 33 5f 66 72 65 65 28 70 50 72 69 6f 72 29 3b 0a  3_free(pPrior);.
4000: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4010: 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 2e  }.  assert( mem.
4020: 6d 75 74 65 78 21 3d 30 20 29 3b 0a 20 20 6e 4f  mutex!=0 );.  nO
4030: 6c 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ld = sqlite3Mall
4040: 6f 63 53 69 7a 65 28 70 50 72 69 6f 72 29 3b 0a  ocSize(pPrior);.
4050: 20 20 69 66 28 20 6e 42 79 74 65 73 3c 3d 6e 4f    if( nBytes<=nO
4060: 6c 64 20 26 26 20 6e 42 79 74 65 73 3e 3d 6e 4f  ld && nBytes>=nO
4070: 6c 64 2d 31 32 38 20 29 7b 0a 20 20 20 20 72 65  ld-128 ){.    re
4080: 74 75 72 6e 20 70 50 72 69 6f 72 3b 0a 20 20 7d  turn pPrior;.  }
4090: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
40a0: 5f 65 6e 74 65 72 28 6d 65 6d 2e 6d 75 74 65 78  _enter(mem.mutex
40b0: 29 3b 0a 20 20 70 20 3d 20 6d 65 6d 73 79 73 33  );.  p = memsys3
40c0: 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 73 29 3b 0a  Malloc(nBytes);.
40d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
40e0: 66 28 20 6e 4f 6c 64 3c 6e 42 79 74 65 73 20 29  f( nOld<nBytes )
40f0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
4100: 2c 20 70 50 72 69 6f 72 2c 20 6e 4f 6c 64 29 3b  , pPrior, nOld);
4110: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4120: 20 20 6d 65 6d 63 70 79 28 70 2c 20 70 50 72 69    memcpy(p, pPri
4130: 6f 72 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20  or, nBytes);.   
4140: 20 7d 0a 20 20 20 20 6d 65 6d 73 79 73 33 46 72   }.    memsys3Fr
4150: 65 65 28 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  ee(pPrior);.  }.
4160: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4170: 6c 65 61 76 65 28 6d 65 6d 2e 6d 75 74 65 78 29  leave(mem.mutex)
4180: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
4190: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
41a0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 20 61  file indicated a
41b0: 6e 64 20 77 72 69 74 65 20 61 20 6c 6f 67 20 6f  nd write a log o
41c0: 66 20 61 6c 6c 20 75 6e 66 72 65 65 64 20 6d 65  f all unfreed me
41d0: 6d 6f 72 79 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  mory .** allocat
41e0: 69 6f 6e 73 20 69 6e 74 6f 20 74 68 61 74 20 6c  ions into that l
41f0: 6f 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  og..*/.void sqli
4200: 74 65 33 4d 65 6d 64 65 62 75 67 44 75 6d 70 28  te3MemdebugDump(
4210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
4220: 65 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  ename){.#ifdef S
4230: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 46 49  QLITE_DEBUG.  FI
4240: 4c 45 20 2a 6f 75 74 3b 0a 20 20 69 6e 74 20 69  LE *out;.  int i
4250: 2c 20 6a 3b 0a 20 20 75 33 32 20 73 69 7a 65 3b  , j;.  u32 size;
4260: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
4270: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
4280: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75  [0]==0 ){.    ou
4290: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65  t = stdout;.  }e
42a0: 6c 73 65 7b 0a 20 20 20 20 6f 75 74 20 3d 20 66  lse{.    out = f
42b0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
42c0: 22 77 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "w");.    if( ou
42d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
42e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2a  rintf(stderr, "*
42f0: 2a 20 55 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70  * Unable to outp
4300: 75 74 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 20  ut memory debug 
4310: 6f 75 74 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a  output log: %s *
4320: 2a 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  *\n",.          
4330: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
4340: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  ename);.      re
4350: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4360: 20 20 6d 65 6d 73 79 73 33 45 6e 74 65 72 28 29    memsys3Enter()
4370: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
4380: 20 22 43 48 55 4e 4b 53 3a 5c 6e 22 29 3b 0a 20   "CHUNKS:\n");. 
4390: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 53 51 4c   for(i=1; i<=SQL
43a0: 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 2f  ITE_MEMORY_SIZE/
43b0: 38 3b 20 69 2b 3d 73 69 7a 65 2f 34 29 7b 0a 20  8; i+=size/4){. 
43c0: 20 20 20 73 69 7a 65 20 3d 20 6d 65 6d 2e 61 50     size = mem.aP
43d0: 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73  ool[i-1].u.hdr.s
43e0: 69 7a 65 34 78 3b 0a 20 20 20 20 69 66 28 20 73  ize4x;.    if( s
43f0: 69 7a 65 2f 34 3c 3d 31 20 29 7b 0a 20 20 20 20  ize/4<=1 ){.    
4400: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
4410: 25 70 20 73 69 7a 65 20 65 72 72 6f 72 5c 6e 22  %p size error\n"
4420: 2c 20 26 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 5d 29  , &mem.aPool[i])
4430: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4440: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
4450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4460: 28 73 69 7a 65 26 31 29 3d 3d 30 20 26 26 20 6d  (size&1)==0 && m
4470: 65 6d 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2f  em.aPool[i+size/
4480: 34 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53  4-1].u.hdr.prevS
4490: 69 7a 65 21 3d 73 69 7a 65 2f 34 20 29 7b 0a 20  ize!=size/4 ){. 
44a0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
44b0: 2c 20 22 25 70 20 74 61 69 6c 20 73 69 7a 65 20  , "%p tail size 
44c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 5c 6e  does not match\n
44d0: 22 2c 20 26 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 5d  ", &mem.aPool[i]
44e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
44f0: 20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61   0 );.      brea
4500: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
4510: 20 28 28 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 2b 73   ((mem.aPool[i+s
4520: 69 7a 65 2f 34 2d 31 5d 2e 75 2e 68 64 72 2e 73  ize/4-1].u.hdr.s
4530: 69 7a 65 34 78 26 32 29 3e 3e 31 29 21 3d 28 73  ize4x&2)>>1)!=(s
4540: 69 7a 65 26 31 29 20 29 7b 0a 20 20 20 20 20 20  ize&1) ){.      
4550: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 70  fprintf(out, "%p
4560: 20 74 61 69 6c 20 63 68 65 63 6b 6f 75 74 20 62   tail checkout b
4570: 69 74 20 69 73 20 69 6e 63 6f 72 72 65 63 74 5c  it is incorrect\
4580: 6e 22 2c 20 26 6d 65 6d 2e 61 50 6f 6f 6c 5b 69  n", &mem.aPool[i
4590: 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ]);.      assert
45a0: 28 20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ( 0 );.      bre
45b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
45c0: 28 20 73 69 7a 65 26 31 20 29 7b 0a 20 20 20 20  ( size&1 ){.    
45d0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
45e0: 25 70 20 25 36 64 20 62 79 74 65 73 20 63 68 65  %p %6d bytes che
45f0: 63 6b 65 64 20 6f 75 74 5c 6e 22 2c 20 26 6d 65  cked out\n", &me
4600: 6d 2e 61 50 6f 6f 6c 5b 69 5d 2c 20 28 73 69 7a  m.aPool[i], (siz
4610: 65 2f 34 29 2a 38 2d 38 29 3b 0a 20 20 20 20 7d  e/4)*8-8);.    }
4620: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
4630: 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 25 36 64  ntf(out, "%p %6d
4640: 20 62 79 74 65 73 20 66 72 65 65 25 73 5c 6e 22   bytes free%s\n"
4650: 2c 20 26 6d 65 6d 2e 61 50 6f 6f 6c 5b 69 5d 2c  , &mem.aPool[i],
4660: 20 28 73 69 7a 65 2f 34 29 2a 38 2d 38 2c 0a 20   (size/4)*8-8,. 
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 69 3d 3d 6d 65 6d 2e 69 4d 61 73 74 65 72 20   i==mem.iMaster 
4690: 3f 20 22 20 2a 2a 6d 61 73 74 65 72 2a 2a 22 20  ? " **master**" 
46a0: 3a 20 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  : "");.    }.  }
46b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58  .  for(i=0; i<MX
46c0: 5f 53 4d 41 4c 4c 2d 31 3b 20 69 2b 2b 29 7b 0a  _SMALL-1; i++){.
46d0: 20 20 20 20 69 66 28 20 6d 65 6d 2e 61 69 53 6d      if( mem.aiSm
46e0: 61 6c 6c 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  all[i]==0 ) cont
46f0: 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
4700: 66 28 6f 75 74 2c 20 22 73 6d 61 6c 6c 28 25 32  f(out, "small(%2
4710: 64 29 3a 22 2c 20 69 29 3b 0a 20 20 20 20 66 6f  d):", i);.    fo
4720: 72 28 6a 20 3d 20 6d 65 6d 2e 61 69 53 6d 61 6c  r(j = mem.aiSmal
4730: 6c 5b 69 5d 3b 20 6a 3e 30 3b 20 6a 3d 6d 65 6d  l[i]; j>0; j=mem
4740: 2e 61 50 6f 6f 6c 5b 6a 5d 2e 75 2e 6c 69 73 74  .aPool[j].u.list
4750: 2e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 70  .next){.      fp
4760: 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 70 28  rintf(out, " %p(
4770: 25 64 29 22 2c 20 26 6d 65 6d 2e 61 50 6f 6f 6c  %d)", &mem.aPool
4780: 5b 6a 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [j],.           
4790: 20 20 20 28 6d 65 6d 2e 61 50 6f 6f 6c 5b 6a 2d     (mem.aPool[j-
47a0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
47b0: 34 29 2a 38 2d 38 29 3b 0a 20 20 20 20 7d 0a 20  4)*8-8);.    }. 
47c0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
47d0: 22 5c 6e 22 29 3b 20 0a 20 20 7d 0a 20 20 66 6f  "\n"); .  }.  fo
47e0: 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 41 53 48 3b  r(i=0; i<N_HASH;
47f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6d   i++){.    if( m
4800: 65 6d 2e 61 69 48 61 73 68 5b 69 5d 3d 3d 30 20  em.aiHash[i]==0 
4810: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4820: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 68 61  fprintf(out, "ha
4830: 73 68 28 25 32 64 29 3a 22 2c 20 69 29 3b 0a 20  sh(%2d):", i);. 
4840: 20 20 20 66 6f 72 28 6a 20 3d 20 6d 65 6d 2e 61     for(j = mem.a
4850: 69 48 61 73 68 5b 69 5d 3b 20 6a 3e 30 3b 20 6a  iHash[i]; j>0; j
4860: 3d 6d 65 6d 2e 61 50 6f 6f 6c 5b 6a 5d 2e 75 2e  =mem.aPool[j].u.
4870: 6c 69 73 74 2e 6e 65 78 74 29 7b 0a 20 20 20 20  list.next){.    
4880: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
4890: 20 25 70 28 25 64 29 22 2c 20 26 6d 65 6d 2e 61   %p(%d)", &mem.a
48a0: 50 6f 6f 6c 5b 6a 5d 2c 0a 20 20 20 20 20 20 20  Pool[j],.       
48b0: 20 20 20 20 20 20 20 28 6d 65 6d 2e 61 50 6f 6f         (mem.aPoo
48c0: 6c 5b 6a 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[j-1].u.hdr.siz
48d0: 65 34 78 2f 34 29 2a 38 2d 38 29 3b 0a 20 20 20  e4x/4)*8-8);.   
48e0: 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
48f0: 75 74 2c 20 22 5c 6e 22 29 3b 20 0a 20 20 7d 0a  ut, "\n"); .  }.
4900: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
4910: 6d 61 73 74 65 72 3d 25 64 5c 6e 22 2c 20 6d 65  master=%d\n", me
4920: 6d 2e 69 4d 61 73 74 65 72 29 3b 0a 20 20 66 70  m.iMaster);.  fp
4930: 72 69 6e 74 66 28 6f 75 74 2c 20 22 6e 6f 77 55  rintf(out, "nowU
4940: 73 65 64 3d 25 64 5c 6e 22 2c 20 53 51 4c 49 54  sed=%d\n", SQLIT
4950: 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a 45 20 2d 20  E_MEMORY_SIZE - 
4960: 6d 65 6d 2e 73 7a 4d 61 73 74 65 72 2a 38 29 3b  mem.szMaster*8);
4970: 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
4980: 22 6d 78 55 73 65 64 3d 25 64 5c 6e 22 2c 20 53  "mxUsed=%d\n", S
4990: 51 4c 49 54 45 5f 4d 45 4d 4f 52 59 5f 53 49 5a  QLITE_MEMORY_SIZ
49a0: 45 20 2d 20 6d 65 6d 2e 6d 6e 4d 61 73 74 65 72  E - mem.mnMaster
49b0: 2a 38 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  *8);.  sqlite3_m
49c0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 2e 6d  utex_leave(mem.m
49d0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6f 75 74  utex);.  if( out
49e0: 3d 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20 20 20  ==stdout ){.    
49f0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
4a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 63 6c    }else{.    fcl
4a10: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 23 65  ose(out);.  }.#e
4a20: 6e 64 69 66 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20  ndif.}...#endif 
4a30: 2f 2a 20 21 53 51 4c 49 54 45 5f 4d 45 4d 4f 52  /* !SQLITE_MEMOR
4a40: 59 5f 53 49 5a 45 20 2a 2f 0a                    Y_SIZE */.