/ Hex Artifact Content
Login

Artifact 61eeb90134f9a5be6c2e68d8daae7628b25953fb:


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 61 70 70 6c 69 63 61 74 69  ). The applicati
0240: 6f 6e 20 67 69 76 65 73 20 53 51 4c 69 74 65 20  on gives SQLite 
0250: 61 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  a block of memor
0260: 79 0a 2a 2a 20 62 65 66 6f 72 65 20 63 61 6c 6c  y.** before call
0270: 69 6e 67 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  ing sqlite3_init
0280: 69 61 6c 69 7a 65 28 29 20 66 72 6f 6d 20 77 68  ialize() from wh
0290: 69 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a  ich allocations.
02a0: 2a 2a 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  ** are made and 
02b0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
02c0: 78 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 78 52  xMalloc() and xR
02d0: 65 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 69 6d 70  ealloc() .** imp
02e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 20 4f 6e  lementations. On
02f0: 63 65 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ce sqlite3_initi
0300: 61 6c 69 7a 65 28 29 20 68 61 73 20 62 65 65 6e  alize() has been
0310: 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20   called,.** the 
0320: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
0330: 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 53 51   available to SQ
0340: 4c 69 74 65 20 69 73 20 66 69 78 65 64 20 61 6e  Lite is fixed an
0350: 64 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 63  d cannot.** be c
0360: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
0370: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  is version of th
0380: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
0390: 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 20 69 73  ion subsystem is
03a0: 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e 20   included.** in 
03b0: 74 68 65 20 62 75 69 6c 64 20 6f 6e 6c 79 20 69  the build only i
03c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
03d0: 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e  MEMSYS5 is defin
03e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ed..**.** This m
03f0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20  emory allocator 
0400: 75 73 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  uses the followi
0410: 6e 67 20 61 6c 67 6f 72 69 74 68 6d 3a 0a 2a 2a  ng algorithm:.**
0420: 0a 2a 2a 20 20 20 31 2e 20 20 41 6c 6c 20 6d 65  .**   1.  All me
0430: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
0440: 20 73 69 7a 65 73 20 61 72 65 20 72 6f 75 6e 64   sizes are round
0450: 65 64 20 75 70 20 74 6f 20 61 20 70 6f 77 65 72  ed up to a power
0460: 20 6f 66 20 32 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   of 2..**.**   2
0470: 2e 20 20 49 66 20 74 77 6f 20 61 64 6a 61 63 65  .  If two adjace
0480: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61  nt free blocks a
0490: 72 65 20 74 68 65 20 68 61 6c 76 65 73 20 6f 66  re the halves of
04a0: 20 61 20 6c 61 72 67 65 72 20 62 6c 6f 63 6b 2c   a larger block,
04b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 74  .**       then t
04c0: 68 65 20 74 77 6f 20 62 6c 6f 63 6b 73 20 61 72  he two blocks ar
04d0: 65 20 63 6f 61 6c 65 73 63 65 64 20 69 6e 74 6f  e coalesced into
04e0: 20 74 68 65 20 73 69 6e 67 6c 65 20 6c 61 72 67   the single larg
04f0: 65 72 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  er block..**.** 
0500: 20 20 33 2e 20 20 4e 65 77 20 6d 65 6d 6f 72 79    3.  New memory
0510: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 72   is allocated fr
0520: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 61 76 61  om the first ava
0530: 69 6c 61 62 6c 65 20 66 72 65 65 20 62 6c 6f 63  ilable free bloc
0540: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  k..**.** This al
0550: 67 6f 72 69 74 68 6d 20 69 73 20 64 65 73 63 72  gorithm is descr
0560: 69 62 65 64 20 69 6e 3a 20 4a 2e 20 4d 2e 20 52  ibed in: J. M. R
0570: 6f 62 73 6f 6e 2e 20 22 42 6f 75 6e 64 73 20 66  obson. "Bounds f
0580: 6f 72 20 53 6f 6d 65 20 46 75 6e 63 74 69 6f 6e  or Some Function
0590: 73 0a 2a 2a 20 43 6f 6e 63 65 72 6e 69 6e 67 20  s.** Concerning 
05a0: 44 79 6e 61 6d 69 63 20 53 74 6f 72 61 67 65 20  Dynamic Storage 
05b0: 41 6c 6c 6f 63 61 74 69 6f 6e 22 2e 20 4a 6f 75  Allocation". Jou
05c0: 72 6e 61 6c 20 6f 66 20 74 68 65 20 41 73 73 6f  rnal of the Asso
05d0: 63 69 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 43  ciation for.** C
05e0: 6f 6d 70 75 74 69 6e 67 20 4d 61 63 68 69 6e 65  omputing Machine
05f0: 72 79 2c 20 56 6f 6c 75 6d 65 20 32 31 2c 20 4e  ry, Volume 21, N
0600: 75 6d 62 65 72 20 38 2c 20 4a 75 6c 79 20 31 39  umber 8, July 19
0610: 37 34 2c 20 70 61 67 65 73 20 34 39 31 2d 34 39  74, pages 491-49
0620: 39 2e 0a 2a 2a 20 0a 2a 2a 20 4c 65 74 20 6e 20  9..** .** Let n 
0630: 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
0640: 68 65 20 6c 61 72 67 65 73 74 20 61 6c 6c 6f 63  he largest alloc
0650: 61 74 69 6f 6e 20 64 69 76 69 64 65 64 20 62 79  ation divided by
0660: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 2a 2a 20   the minimum.** 
0670: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
0680: 28 61 66 74 65 72 20 72 6f 75 6e 64 69 6e 67 20  (after rounding 
0690: 61 6c 6c 20 73 69 7a 65 73 20 75 70 20 74 6f 20  all sizes up to 
06a0: 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 29 20 20  a power of 2.)  
06b0: 4c 65 74 20 4d 0a 2a 2a 20 62 65 20 74 68 65 20  Let M.** be the 
06c0: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
06d0: 66 20 6d 65 6d 6f 72 79 20 65 76 65 72 20 6f 75  f memory ever ou
06e0: 74 73 74 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65  tstanding at one
06f0: 20 74 69 6d 65 2e 20 20 4c 65 74 0a 2a 2a 20 4e   time.  Let.** N
0700: 20 62 65 20 74 68 65 20 74 6f 74 61 6c 20 61 6d   be the total am
0710: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ount of memory a
0720: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
0730: 6f 63 61 74 69 6f 6e 2e 20 20 52 6f 62 73 6f 6e  ocation.  Robson
0740: 0a 2a 2a 20 70 72 6f 76 65 64 20 74 68 61 74 20  .** proved that 
0750: 74 68 69 73 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  this memory allo
0760: 63 61 74 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  cator will never
0770: 20 62 72 65 61 6b 64 6f 77 6e 20 64 75 65 20 74   breakdown due t
0780: 6f 20 0a 2a 2a 20 66 72 61 67 6d 65 6e 74 61 74  o .** fragmentat
0790: 69 6f 6e 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ion as long as t
07a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
07b0: 73 74 72 61 69 6e 74 20 68 6f 6c 64 73 3a 0a 2a  straint holds:.*
07c0: 2a 0a 2a 2a 20 20 20 20 20 20 4e 20 3e 3d 20 20  *.**      N >=  
07d0: 4d 2a 28 31 20 2b 20 6c 6f 67 32 28 6e 29 2f 32  M*(1 + log2(n)/2
07e0: 29 20 2d 20 6e 20 2b 20 31 0a 2a 2a 0a 2a 2a 20  ) - n + 1.**.** 
07f0: 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74 61 74  The sqlite3_stat
0800: 75 73 28 29 20 6c 6f 67 69 63 20 74 72 61 63 6b  us() logic track
0810: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  s the maximum va
0820: 6c 75 65 73 20 6f 66 20 6e 20 61 6e 64 20 4d 20  lues of n and M 
0830: 73 6f 0a 2a 2a 20 74 68 61 74 20 61 6e 20 61 70  so.** that an ap
0840: 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e 2c 20 61  plication can, a
0850: 74 20 61 6e 79 20 74 69 6d 65 2c 20 76 65 72 69  t any time, veri
0860: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
0870: 6e 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  nt..*/.#include 
0880: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0890: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
08a0: 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  n of the memory 
08b0: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 75 73 65  allocator is use
08c0: 64 20 6f 6e 6c 79 20 77 68 65 6e 20 0a 2a 2a 20  d only when .** 
08d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
08e0: 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e 65 64  MSYS5 is defined
08f0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0900: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
0910: 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 69 6e 69 6d  5../*.** A minim
0920: 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  um allocation is
0930: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
0940: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0950: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 4c 61 72 67  ructure..** Larg
0960: 65 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  er allocations a
0970: 72 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74  re an array of t
0980: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
0990: 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 73 69 7a  where the.** siz
09a0: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69  e of the array i
09b0: 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a  s a power of 2..
09c0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
09d0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6d 75  f this object mu
09e0: 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
09f0: 20 74 77 6f 2e 20 20 54 68 61 74 20 66 61 63 74   two.  That fact
0a00: 20 69 73 0a 2a 2a 20 76 65 72 69 66 69 65 64 20   is.** verified 
0a10: 69 6e 20 6d 65 6d 73 79 73 35 49 6e 69 74 28 29  in memsys5Init()
0a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0a30: 75 63 74 20 4d 65 6d 35 4c 69 6e 6b 20 4d 65 6d  uct Mem5Link Mem
0a40: 35 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20 4d 65  5Link;.struct Me
0a50: 6d 35 4c 69 6e 6b 20 7b 0a 20 20 69 6e 74 20 6e  m5Link {.  int n
0a60: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  ext;       /* In
0a70: 64 65 78 20 6f 66 20 6e 65 78 74 20 66 72 65 65  dex of next free
0a80: 20 63 68 75 6e 6b 20 2a 2f 0a 20 20 69 6e 74 20   chunk */.  int 
0a90: 70 72 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 49  prev;       /* I
0aa0: 6e 64 65 78 20 6f 66 20 70 72 65 76 69 6f 75 73  ndex of previous
0ab0: 20 66 72 65 65 20 63 68 75 6e 6b 20 2a 2f 0a 7d   free chunk */.}
0ac0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  ;../*.** Maximum
0ad0: 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 61 6c 6c   size of any all
0ae0: 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 31 3c 3c  ocation is ((1<<
0af0: 4c 4f 47 4d 41 58 29 2a 6d 65 6d 35 2e 73 7a 41  LOGMAX)*mem5.szA
0b00: 74 6f 6d 29 2e 20 53 69 6e 63 65 0a 2a 2a 20 6d  tom). Since.** m
0b10: 65 6d 35 2e 73 7a 41 74 6f 6d 20 69 73 20 61 6c  em5.szAtom is al
0b20: 77 61 79 73 20 61 74 20 6c 65 61 73 74 20 38 20  ways at least 8 
0b30: 61 6e 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  and 32-bit integ
0b40: 65 72 73 20 61 72 65 20 75 73 65 64 2c 0a 2a 2a  ers are used,.**
0b50: 20 69 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61   it is not actua
0b60: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
0b70: 72 65 61 63 68 20 74 68 69 73 20 6c 69 6d 69 74  reach this limit
0b80: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4f 47  ..*/.#define LOG
0b90: 4d 41 58 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 4d 61  MAX 30../*.** Ma
0ba0: 73 6b 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d  sks used for mem
0bb0: 35 2e 61 43 74 72 6c 5b 5d 20 65 6c 65 6d 65 6e  5.aCtrl[] elemen
0bc0: 74 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  ts..*/.#define C
0bd0: 54 52 4c 5f 4c 4f 47 53 49 5a 45 20 20 30 78 31  TRL_LOGSIZE  0x1
0be0: 66 20 20 20 20 2f 2a 20 4c 6f 67 32 20 53 69 7a  f    /* Log2 Siz
0bf0: 65 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 20  e of this block 
0c00: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 54 52 4c 5f  */.#define CTRL_
0c10: 46 52 45 45 20 20 20 20 20 30 78 32 30 20 20 20  FREE     0x20   
0c20: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20   /* True if not 
0c30: 63 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a 0a  checked out */..
0c40: 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  /*.** All of the
0c50: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
0c60: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6d  s used by this m
0c70: 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c 6c 65 63  odule are collec
0c80: 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 69  ted.** into a si
0c90: 6e 67 6c 65 20 73 74 72 75 63 74 75 72 65 20 6e  ngle structure n
0ca0: 61 6d 65 64 20 22 6d 65 6d 35 22 2e 20 20 54 68  amed "mem5".  Th
0cb0: 69 73 20 69 73 20 74 6f 20 6b 65 65 70 20 74 68  is is to keep th
0cc0: 65 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69  e.** static vari
0cd0: 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65 64 20  ables organized 
0ce0: 61 6e 64 20 74 6f 20 72 65 64 75 63 65 20 6e 61  and to reduce na
0cf0: 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75 74 69 6f  mespace pollutio
0d00: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 6d  n.** when this m
0d10: 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62 69 6e 65  odule is combine
0d20: 64 20 77 69 74 68 20 6f 74 68 65 72 20 69 6e 20  d with other in 
0d30: 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
0d40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
0d50: 54 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d 65  TE_WSD struct Me
0d60: 6d 35 47 6c 6f 62 61 6c 20 7b 0a 20 20 2f 2a 0a  m5Global {.  /*.
0d70: 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69    ** Memory avai
0d80: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
0d90: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  tion.  */.  int 
0da0: 73 7a 41 74 6f 6d 3b 20 20 20 20 20 20 2f 2a 20  szAtom;      /* 
0db0: 53 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  Smallest possibl
0dc0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  e allocation in 
0dd0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
0de0: 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 4e  Block;      /* N
0df0: 75 6d 62 65 72 20 6f 66 20 73 7a 41 74 6f 6d 20  umber of szAtom 
0e00: 73 69 7a 65 64 20 62 6c 6f 63 6b 73 20 69 6e 20  sized blocks in 
0e10: 7a 50 6f 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a 7a  zPool */.  u8 *z
0e20: 50 6f 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Pool;       /* M
0e30: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
0e40: 74 6f 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  to be allocated 
0e50: 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  */.  .  /*.  ** 
0e60: 4d 75 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c  Mutex to control
0e70: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d   access to the m
0e80: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
0e90: 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f   subsystem..  */
0ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
0eb0: 20 2a 6d 75 74 65 78 3b 0a 0a 20 20 2f 2a 0a 20   *mutex;..  /*. 
0ec0: 20 2a 2a 20 50 65 72 66 6f 72 6d 61 6e 63 65 20   ** Performance 
0ed0: 73 74 61 74 69 73 74 69 63 73 0a 20 20 2a 2f 0a  statistics.  */.
0ee0: 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20 20    u64 nAlloc;   
0ef0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
0f00: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
0f10: 6f 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 75 36  o malloc */.  u6
0f20: 34 20 74 6f 74 61 6c 41 6c 6c 6f 63 3b 20 20 20  4 totalAlloc;   
0f30: 20 20 2f 2a 20 54 6f 74 61 6c 20 6f 66 20 61 6c    /* Total of al
0f40: 6c 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73 20 2d  l malloc calls -
0f50: 20 69 6e 63 6c 75 64 65 73 20 69 6e 74 65 72 6e   includes intern
0f60: 61 6c 20 66 72 61 67 20 2a 2f 0a 20 20 75 36 34  al frag */.  u64
0f70: 20 74 6f 74 61 6c 45 78 63 65 73 73 3b 20 20 20   totalExcess;   
0f80: 20 2f 2a 20 54 6f 74 61 6c 20 69 6e 74 65 72 6e   /* Total intern
0f90: 61 6c 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  al fragmentation
0fa0: 20 2a 2f 0a 20 20 75 33 32 20 63 75 72 72 65 6e   */.  u32 curren
0fb0: 74 4f 75 74 3b 20 20 20 20 20 2f 2a 20 43 75 72  tOut;     /* Cur
0fc0: 72 65 6e 74 20 63 68 65 63 6b 6f 75 74 2c 20 69  rent checkout, i
0fd0: 6e 63 6c 75 64 69 6e 67 20 69 6e 74 65 72 6e 61  ncluding interna
0fe0: 6c 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  l fragmentation 
0ff0: 2a 2f 0a 20 20 75 33 32 20 63 75 72 72 65 6e 74  */.  u32 current
1000: 43 6f 75 6e 74 3b 20 20 20 2f 2a 20 43 75 72 72  Count;   /* Curr
1010: 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 64 69  ent number of di
1020: 73 74 69 6e 63 74 20 63 68 65 63 6b 6f 75 74 73  stinct checkouts
1030: 20 2a 2f 0a 20 20 75 33 32 20 6d 61 78 4f 75 74   */.  u32 maxOut
1040: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  ;         /* Max
1050: 69 6d 75 6d 20 69 6e 73 74 61 6e 74 61 6e 65 6f  imum instantaneo
1060: 75 73 20 63 75 72 72 65 6e 74 4f 75 74 20 2a 2f  us currentOut */
1070: 0a 20 20 75 33 32 20 6d 61 78 43 6f 75 6e 74 3b  .  u32 maxCount;
1080: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1090: 6d 20 69 6e 73 74 61 6e 74 61 6e 65 6f 75 73 20  m instantaneous 
10a0: 63 75 72 72 65 6e 74 43 6f 75 6e 74 20 2a 2f 0a  currentCount */.
10b0: 20 20 75 33 32 20 6d 61 78 52 65 71 75 65 73 74    u32 maxRequest
10c0: 3b 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74  ;     /* Largest
10d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 65 78 63   allocation (exc
10e0: 6c 75 73 69 76 65 20 6f 66 20 69 6e 74 65 72 6e  lusive of intern
10f0: 61 6c 20 66 72 61 67 29 20 2a 2f 0a 20 20 0a 20  al frag) */.  . 
1100: 20 2f 2a 0a 20 20 2a 2a 20 4c 69 73 74 73 20 6f   /*.  ** Lists o
1110: 66 20 66 72 65 65 20 62 6c 6f 63 6b 73 2e 20 20  f free blocks.  
1120: 61 69 46 72 65 65 6c 69 73 74 5b 30 5d 20 69 73  aiFreelist[0] is
1130: 20 61 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20   a list of free 
1140: 62 6c 6f 63 6b 73 20 6f 66 0a 20 20 2a 2a 20 73  blocks of.  ** s
1150: 69 7a 65 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 2e  ize mem5.szAtom.
1160: 20 20 61 69 46 72 65 65 6c 69 73 74 5b 31 5d 20    aiFreelist[1] 
1170: 68 6f 6c 64 73 20 62 6c 6f 63 6b 73 20 6f 66 20  holds blocks of 
1180: 73 69 7a 65 20 73 7a 41 74 6f 6d 2a 32 2e 0a 20  size szAtom*2.. 
1190: 20 2a 2a 20 61 6e 64 20 73 6f 20 66 6f 72 74 68   ** and so forth
11a0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 61 69 46  ..  */.  int aiF
11b0: 72 65 65 6c 69 73 74 5b 4c 4f 47 4d 41 58 2b 31  reelist[LOGMAX+1
11c0: 5d 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 70  ];..  /*.  ** Sp
11d0: 61 63 65 20 66 6f 72 20 74 72 61 63 6b 69 6e 67  ace for tracking
11e0: 20 77 68 69 63 68 20 62 6c 6f 63 6b 73 20 61 72   which blocks ar
11f0: 65 20 63 68 65 63 6b 65 64 20 6f 75 74 20 61 6e  e checked out an
1200: 64 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20  d the size.  ** 
1210: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 2e 20 20  of each block.  
1220: 4f 6e 65 20 62 79 74 65 20 70 65 72 20 62 6c 6f  One byte per blo
1230: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 2a 61  ck..  */.  u8 *a
1240: 43 74 72 6c 3b 0a 0a 7d 20 6d 65 6d 35 3b 0a 0a  Ctrl;..} mem5;..
1250: 2f 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 68 65  /*.** Access the
1260: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
1270: 20 74 68 72 6f 75 67 68 20 61 20 6d 61 63 72 6f   through a macro
1280: 20 66 6f 72 20 53 51 4c 49 54 45 5f 4f 4d 49 54   for SQLITE_OMIT
1290: 5f 57 53 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  _WSD..*/.#define
12a0: 20 6d 65 6d 35 20 47 4c 4f 42 41 4c 28 73 74 72   mem5 GLOBAL(str
12b0: 75 63 74 20 4d 65 6d 35 47 6c 6f 62 61 6c 2c 20  uct Mem5Global, 
12c0: 6d 65 6d 35 29 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  mem5)../*.** Ass
12d0: 75 6d 69 6e 67 20 6d 65 6d 35 2e 7a 50 6f 6f 6c  uming mem5.zPool
12e0: 20 69 73 20 64 69 76 69 64 65 64 20 75 70 20 69   is divided up i
12f0: 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
1300: 4d 65 6d 35 4c 69 6e 6b 0a 2a 2a 20 73 74 72 75  Mem5Link.** stru
1310: 63 74 75 72 65 73 2c 20 72 65 74 75 72 6e 20 61  ctures, return a
1320: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1330: 69 64 78 2d 74 68 20 73 75 63 68 20 6c 69 6e 6b  idx-th such link
1340: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 45 4d  ..*/.#define MEM
1350: 35 4c 49 4e 4b 28 69 64 78 29 20 28 28 4d 65 6d  5LINK(idx) ((Mem
1360: 35 4c 69 6e 6b 20 2a 29 28 26 6d 65 6d 35 2e 7a  5Link *)(&mem5.z
1370: 50 6f 6f 6c 5b 28 69 64 78 29 2a 6d 65 6d 35 2e  Pool[(idx)*mem5.
1380: 73 7a 41 74 6f 6d 5d 29 29 0a 0a 2f 2a 0a 2a 2a  szAtom]))../*.**
1390: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68 75 6e   Unlink the chun
13a0: 6b 20 61 74 20 6d 65 6d 35 2e 61 50 6f 6f 6c 5b  k at mem5.aPool[
13b0: 69 5d 20 66 72 6f 6d 20 6c 69 73 74 20 69 74 20  i] from list it 
13c0: 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
13d0: 6f 6e 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62  on.  It should b
13e0: 65 20 66 6f 75 6e 64 20 6f 6e 20 6d 65 6d 35 2e  e found on mem5.
13f0: 61 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f 67 73  aiFreelist[iLogs
1400: 69 7a 65 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ize]..*/.static 
1410: 76 6f 69 64 20 6d 65 6d 73 79 73 35 55 6e 6c 69  void memsys5Unli
1420: 6e 6b 28 69 6e 74 20 69 2c 20 69 6e 74 20 69 4c  nk(int i, int iL
1430: 6f 67 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e  ogsize){.  int n
1440: 65 78 74 2c 20 70 72 65 76 3b 0a 20 20 61 73 73  ext, prev;.  ass
1450: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 6d  ert( i>=0 && i<m
1460: 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20  em5.nBlock );.  
1470: 61 73 73 65 72 74 28 20 69 4c 6f 67 73 69 7a 65  assert( iLogsize
1480: 3e 3d 30 20 26 26 20 69 4c 6f 67 73 69 7a 65 3c  >=0 && iLogsize<
1490: 3d 4c 4f 47 4d 41 58 20 29 3b 0a 20 20 61 73 73  =LOGMAX );.  ass
14a0: 65 72 74 28 20 28 6d 65 6d 35 2e 61 43 74 72 6c  ert( (mem5.aCtrl
14b0: 5b 69 5d 20 26 20 43 54 52 4c 5f 4c 4f 47 53 49  [i] & CTRL_LOGSI
14c0: 5a 45 29 3d 3d 69 4c 6f 67 73 69 7a 65 20 29 3b  ZE)==iLogsize );
14d0: 0a 0a 20 20 6e 65 78 74 20 3d 20 4d 45 4d 35 4c  ..  next = MEM5L
14e0: 49 4e 4b 28 69 29 2d 3e 6e 65 78 74 3b 0a 20 20  INK(i)->next;.  
14f0: 70 72 65 76 20 3d 20 4d 45 4d 35 4c 49 4e 4b 28  prev = MEM5LINK(
1500: 69 29 2d 3e 70 72 65 76 3b 0a 20 20 69 66 28 20  i)->prev;.  if( 
1510: 70 72 65 76 3c 30 20 29 7b 0a 20 20 20 20 6d 65  prev<0 ){.    me
1520: 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c  m5.aiFreelist[iL
1530: 6f 67 73 69 7a 65 5d 20 3d 20 6e 65 78 74 3b 0a  ogsize] = next;.
1540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 45 4d    }else{.    MEM
1550: 35 4c 49 4e 4b 28 70 72 65 76 29 2d 3e 6e 65 78  5LINK(prev)->nex
1560: 74 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  t = next;.  }.  
1570: 69 66 28 20 6e 65 78 74 3e 3d 30 20 29 7b 0a 20  if( next>=0 ){. 
1580: 20 20 20 4d 45 4d 35 4c 49 4e 4b 28 6e 65 78 74     MEM5LINK(next
1590: 29 2d 3e 70 72 65 76 20 3d 20 70 72 65 76 3b 0a  )->prev = prev;.
15a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e    }.}../*.** Lin
15b0: 6b 20 74 68 65 20 63 68 75 6e 6b 20 61 74 20 6d  k the chunk at m
15c0: 65 6d 35 2e 61 50 6f 6f 6c 5b 69 5d 20 73 6f 20  em5.aPool[i] so 
15d0: 74 68 61 74 20 69 73 20 6f 6e 20 74 68 65 20 69  that is on the i
15e0: 4c 6f 67 73 69 7a 65 0a 2a 2a 20 66 72 65 65 20  Logsize.** free 
15f0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1600: 76 6f 69 64 20 6d 65 6d 73 79 73 35 4c 69 6e 6b  void memsys5Link
1610: 28 69 6e 74 20 69 2c 20 69 6e 74 20 69 4c 6f 67  (int i, int iLog
1620: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 78 3b 0a  size){.  int x;.
1630: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1640: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d  3_mutex_held(mem
1650: 35 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  5.mutex) );.  as
1660: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
1670: 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0a 20  mem5.nBlock );. 
1680: 20 61 73 73 65 72 74 28 20 69 4c 6f 67 73 69 7a   assert( iLogsiz
1690: 65 3e 3d 30 20 26 26 20 69 4c 6f 67 73 69 7a 65  e>=0 && iLogsize
16a0: 3c 3d 4c 4f 47 4d 41 58 20 29 3b 0a 20 20 61 73  <=LOGMAX );.  as
16b0: 73 65 72 74 28 20 28 6d 65 6d 35 2e 61 43 74 72  sert( (mem5.aCtr
16c0: 6c 5b 69 5d 20 26 20 43 54 52 4c 5f 4c 4f 47 53  l[i] & CTRL_LOGS
16d0: 49 5a 45 29 3d 3d 69 4c 6f 67 73 69 7a 65 20 29  IZE)==iLogsize )
16e0: 3b 0a 0a 20 20 78 20 3d 20 4d 45 4d 35 4c 49 4e  ;..  x = MEM5LIN
16f0: 4b 28 69 29 2d 3e 6e 65 78 74 20 3d 20 6d 65 6d  K(i)->next = mem
1700: 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f  5.aiFreelist[iLo
1710: 67 73 69 7a 65 5d 3b 0a 20 20 4d 45 4d 35 4c 49  gsize];.  MEM5LI
1720: 4e 4b 28 69 29 2d 3e 70 72 65 76 20 3d 20 2d 31  NK(i)->prev = -1
1730: 3b 0a 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a  ;.  if( x>=0 ){.
1740: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 6d 65      assert( x<me
1750: 6d 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 20  m5.nBlock );.   
1760: 20 4d 45 4d 35 4c 49 4e 4b 28 78 29 2d 3e 70 72   MEM5LINK(x)->pr
1770: 65 76 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6d 65  ev = i;.  }.  me
1780: 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c  m5.aiFreelist[iL
1790: 6f 67 73 69 7a 65 5d 20 3d 20 69 3b 0a 7d 0a 0a  ogsize] = i;.}..
17a0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 54 41  /*.** If the STA
17b0: 54 49 43 5f 4d 45 4d 20 6d 75 74 65 78 20 69 73  TIC_MEM mutex is
17c0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
17d0: 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77  d, obtain it now
17e0: 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 77  . The mutex.** w
17f0: 69 6c 6c 20 61 6c 72 65 61 64 79 20 62 65 20 68  ill already be h
1800: 65 6c 64 20 28 6f 62 74 61 69 6e 65 64 20 62 79  eld (obtained by
1810: 20 63 6f 64 65 20 69 6e 20 6d 61 6c 6c 6f 63 2e   code in malloc.
1820: 63 29 20 69 66 0a 2a 2a 20 73 71 6c 69 74 65 33  c) if.** sqlite3
1830: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
1840: 6d 53 74 61 74 20 69 73 20 74 72 75 65 2e 0a 2a  mStat is true..*
1850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
1860: 6d 73 79 73 35 45 6e 74 65 72 28 76 6f 69 64 29  msys5Enter(void)
1870: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
1880: 78 5f 65 6e 74 65 72 28 6d 65 6d 35 2e 6d 75 74  x_enter(mem5.mut
1890: 65 78 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ex);.}.static vo
18a0: 69 64 20 6d 65 6d 73 79 73 35 4c 65 61 76 65 28  id memsys5Leave(
18b0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
18c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d  _mutex_leave(mem
18d0: 35 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  5.mutex);.}../*.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
18f0: 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e  ze of an outstan
1900: 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  ding allocation,
1910: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65 0a   in bytes.  The.
1920: 2a 2a 20 73 69 7a 65 20 72 65 74 75 72 6e 65 64  ** size returned
1930: 20 6f 6d 69 74 73 20 74 68 65 20 38 2d 62 79 74   omits the 8-byt
1940: 65 20 68 65 61 64 65 72 20 6f 76 65 72 68 65 61  e header overhea
1950: 64 2e 20 20 54 68 69 73 20 6f 6e 6c 79 0a 2a 2a  d.  This only.**
1960: 20 77 6f 72 6b 73 20 66 6f 72 20 63 68 75 6e 6b   works for chunk
1970: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
1980: 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f 75 74  ntly checked out
1990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19a0: 6d 65 6d 73 79 73 35 53 69 7a 65 28 76 6f 69 64  memsys5Size(void
19b0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 53 69 7a   *p){.  int iSiz
19c0: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  e = 0;.  if( p )
19d0: 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 28 69  {.    int i = (i
19e0: 6e 74 29 28 28 28 75 38 20 2a 29 70 2d 6d 65 6d  nt)(((u8 *)p-mem
19f0: 35 2e 7a 50 6f 6f 6c 29 2f 6d 65 6d 35 2e 73 7a  5.zPool)/mem5.sz
1a00: 41 74 6f 6d 29 3b 0a 20 20 20 20 61 73 73 65 72  Atom);.    asser
1a10: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 6d 65 6d  t( i>=0 && i<mem
1a20: 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  5.nBlock );.    
1a30: 69 53 69 7a 65 20 3d 20 6d 65 6d 35 2e 73 7a 41  iSize = mem5.szA
1a40: 74 6f 6d 20 2a 20 28 31 20 3c 3c 20 28 6d 65 6d  tom * (1 << (mem
1a50: 35 2e 61 43 74 72 6c 5b 69 5d 26 43 54 52 4c 5f  5.aCtrl[i]&CTRL_
1a60: 4c 4f 47 53 49 5a 45 29 29 3b 0a 20 20 7d 0a 20  LOGSIZE));.  }. 
1a70: 20 72 65 74 75 72 6e 20 69 53 69 7a 65 3b 0a 7d   return iSize;.}
1a80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1a90: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
1aa0: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 42 79   of at least nBy
1ab0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
1ac0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 75  Return NULL if u
1ad0: 6e 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  nable.  Return N
1ae0: 55 4c 4c 20 69 66 20 6e 42 79 74 65 73 3d 3d 30  ULL if nBytes==0
1af0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1b00: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
1b10: 61 74 20 6e 42 79 74 65 20 69 73 20 70 6f 73 69  at nByte is posi
1b20: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tive..**.** The 
1b30: 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69  caller has obtai
1b40: 6e 65 64 20 61 20 6d 75 74 65 78 20 70 72 69 6f  ned a mutex prio
1b50: 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1b60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  is.** routine so
1b70: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
1b80: 61 6e 79 20 63 68 61 6e 63 65 20 74 68 61 74 20  any chance that 
1b90: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  two or more.** t
1ba0: 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 69 6e  hreads can be in
1bb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   this routine at
1bc0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
1bd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
1be0: 6d 65 6d 73 79 73 35 4d 61 6c 6c 6f 63 55 6e 73  memsys5MallocUns
1bf0: 61 66 65 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a  afe(int nByte){.
1c00: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1c10: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 61     /* Index of a
1c20: 20 6d 65 6d 35 2e 61 50 6f 6f 6c 5b 5d 20 73 6c   mem5.aPool[] sl
1c30: 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 69 42 69 6e  ot */.  int iBin
1c40: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  ;        /* Inde
1c50: 78 20 69 6e 74 6f 20 6d 65 6d 35 2e 61 69 46 72  x into mem5.aiFr
1c60: 65 65 6c 69 73 74 5b 5d 20 2a 2f 0a 20 20 69 6e  eelist[] */.  in
1c70: 74 20 69 46 75 6c 6c 53 7a 3b 20 20 20 20 20 2f  t iFullSz;     /
1c80: 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61  * Size of alloca
1c90: 74 69 6f 6e 20 72 6f 75 6e 64 65 64 20 75 70 20  tion rounded up 
1ca0: 74 6f 20 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f  to power of 2 */
1cb0: 0a 20 20 69 6e 74 20 69 4c 6f 67 73 69 7a 65 3b  .  int iLogsize;
1cc0: 20 20 20 20 2f 2a 20 4c 6f 67 32 20 6f 66 20 69      /* Log2 of i
1cd0: 46 75 6c 6c 53 7a 2f 50 4f 57 32 5f 4d 49 4e 20  FullSz/POW2_MIN 
1ce0: 2a 2f 0a 0a 20 20 2f 2a 20 6e 42 79 74 65 20 6d  */..  /* nByte m
1cf0: 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76  ust be a positiv
1d00: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
1d10: 42 79 74 65 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Byte>0 );..  /* 
1d20: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
1d30: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  e maximum alloca
1d40: 74 69 6f 6e 20 72 65 71 75 65 73 74 2e 20 20 45  tion request.  E
1d50: 76 65 6e 20 75 6e 66 75 6c 66 69 6c 6c 65 64 0a  ven unfulfilled.
1d60: 20 20 2a 2a 20 72 65 71 75 65 73 74 73 20 61 72    ** requests ar
1d70: 65 20 63 6f 75 6e 74 65 64 20 2a 2f 0a 20 20 69  e counted */.  i
1d80: 66 28 20 28 75 33 32 29 6e 42 79 74 65 3e 6d 65  f( (u32)nByte>me
1d90: 6d 35 2e 6d 61 78 52 65 71 75 65 73 74 20 29 7b  m5.maxRequest ){
1da0: 0a 20 20 20 20 6d 65 6d 35 2e 6d 61 78 52 65 71  .    mem5.maxReq
1db0: 75 65 73 74 20 3d 20 6e 42 79 74 65 3b 0a 20 20  uest = nByte;.  
1dc0: 7d 0a 0a 20 20 2f 2a 20 41 62 6f 72 74 20 69 66  }..  /* Abort if
1dd0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 61   the requested a
1de0: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 69  llocation size i
1df0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
1e00: 65 20 6c 61 72 67 65 73 74 0a 20 20 2a 2a 20 70  e largest.  ** p
1e10: 6f 77 65 72 20 6f 66 20 74 77 6f 20 74 68 61 74  ower of two that
1e20: 20 77 65 20 63 61 6e 20 72 65 70 72 65 73 65 6e   we can represen
1e30: 74 20 75 73 69 6e 67 20 33 32 2d 62 69 74 20 73  t using 32-bit s
1e40: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e 0a  igned integers..
1e50: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 42 79 74 65    */.  if( nByte
1e60: 20 3e 20 30 78 34 30 30 30 30 30 30 30 20 29 7b   > 0x40000000 ){
1e70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1e80: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 75 6e 64 20 6e   }..  /* Round n
1e90: 42 79 74 65 20 75 70 20 74 6f 20 74 68 65 20 6e  Byte up to the n
1ea0: 65 78 74 20 76 61 6c 69 64 20 70 6f 77 65 72 20  ext valid power 
1eb0: 6f 66 20 74 77 6f 20 2a 2f 0a 20 20 66 6f 72 28  of two */.  for(
1ec0: 69 46 75 6c 6c 53 7a 3d 6d 65 6d 35 2e 73 7a 41  iFullSz=mem5.szA
1ed0: 74 6f 6d 2c 20 69 4c 6f 67 73 69 7a 65 3d 30 3b  tom, iLogsize=0;
1ee0: 20 69 46 75 6c 6c 53 7a 3c 6e 42 79 74 65 3b 20   iFullSz<nByte; 
1ef0: 69 46 75 6c 6c 53 7a 20 2a 3d 20 32 2c 20 69 4c  iFullSz *= 2, iL
1f00: 6f 67 73 69 7a 65 2b 2b 29 7b 7d 0a 0a 20 20 2f  ogsize++){}..  /
1f10: 2a 20 4d 61 6b 65 20 73 75 72 65 20 6d 65 6d 35  * Make sure mem5
1f20: 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f 67  .aiFreelist[iLog
1f30: 73 69 7a 65 5d 20 63 6f 6e 74 61 69 6e 73 20 61  size] contains a
1f40: 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65  t least one free
1f50: 0a 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66  .  ** block.  If
1f60: 20 6e 6f 74 2c 20 74 68 65 6e 20 73 70 6c 69 74   not, then split
1f70: 20 61 20 62 6c 6f 63 6b 20 6f 66 20 74 68 65 20   a block of the 
1f80: 6e 65 78 74 20 6c 61 72 67 65 72 20 70 6f 77 65  next larger powe
1f90: 72 20 6f 66 0a 20 20 2a 2a 20 74 77 6f 20 69 6e  r of.  ** two in
1fa0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
1fb0: 20 61 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63   a new free bloc
1fc0: 6b 20 6f 66 20 73 69 7a 65 20 69 4c 6f 67 73 69  k of size iLogsi
1fd0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ze..  */.  for(i
1fe0: 42 69 6e 3d 69 4c 6f 67 73 69 7a 65 3b 20 69 42  Bin=iLogsize; iB
1ff0: 69 6e 3c 3d 4c 4f 47 4d 41 58 20 26 26 20 6d 65  in<=LOGMAX && me
2000: 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 42  m5.aiFreelist[iB
2010: 69 6e 5d 3c 30 3b 20 69 42 69 6e 2b 2b 29 7b 7d  in]<0; iBin++){}
2020: 0a 20 20 69 66 28 20 69 42 69 6e 3e 4c 4f 47 4d  .  if( iBin>LOGM
2030: 41 58 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  AX ){.    testca
2040: 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
2050: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
2060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  );.    sqlite3_l
2070: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
2080: 20 22 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f   "failed to allo
2090: 63 61 74 65 20 25 75 20 62 79 74 65 73 22 2c 20  cate %u bytes", 
20a0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75  nByte);.    retu
20b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 20 3d 20  rn 0;.  }.  i = 
20c0: 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b  mem5.aiFreelist[
20d0: 69 42 69 6e 5d 3b 0a 20 20 6d 65 6d 73 79 73 35  iBin];.  memsys5
20e0: 55 6e 6c 69 6e 6b 28 69 2c 20 69 42 69 6e 29 3b  Unlink(i, iBin);
20f0: 0a 20 20 77 68 69 6c 65 28 20 69 42 69 6e 3e 69  .  while( iBin>i
2100: 4c 6f 67 73 69 7a 65 20 29 7b 0a 20 20 20 20 69  Logsize ){.    i
2110: 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 0a 20 20 20  nt newSize;..   
2120: 20 69 42 69 6e 2d 2d 3b 0a 20 20 20 20 6e 65 77   iBin--;.    new
2130: 53 69 7a 65 20 3d 20 31 20 3c 3c 20 69 42 69 6e  Size = 1 << iBin
2140: 3b 0a 20 20 20 20 6d 65 6d 35 2e 61 43 74 72 6c  ;.    mem5.aCtrl
2150: 5b 69 2b 6e 65 77 53 69 7a 65 5d 20 3d 20 43 54  [i+newSize] = CT
2160: 52 4c 5f 46 52 45 45 20 7c 20 69 42 69 6e 3b 0a  RL_FREE | iBin;.
2170: 20 20 20 20 6d 65 6d 73 79 73 35 4c 69 6e 6b 28      memsys5Link(
2180: 69 2b 6e 65 77 53 69 7a 65 2c 20 69 42 69 6e 29  i+newSize, iBin)
2190: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 35 2e 61 43 74  ;.  }.  mem5.aCt
21a0: 72 6c 5b 69 5d 20 3d 20 69 4c 6f 67 73 69 7a 65  rl[i] = iLogsize
21b0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 61  ;..  /* Update a
21c0: 6c 6c 6f 63 61 74 6f 72 20 70 65 72 66 6f 72 6d  llocator perform
21d0: 61 6e 63 65 20 73 74 61 74 69 73 74 69 63 73 2e  ance statistics.
21e0: 20 2a 2f 0a 20 20 6d 65 6d 35 2e 6e 41 6c 6c 6f   */.  mem5.nAllo
21f0: 63 2b 2b 3b 0a 20 20 6d 65 6d 35 2e 74 6f 74 61  c++;.  mem5.tota
2200: 6c 41 6c 6c 6f 63 20 2b 3d 20 69 46 75 6c 6c 53  lAlloc += iFullS
2210: 7a 3b 0a 20 20 6d 65 6d 35 2e 74 6f 74 61 6c 45  z;.  mem5.totalE
2220: 78 63 65 73 73 20 2b 3d 20 69 46 75 6c 6c 53 7a  xcess += iFullSz
2230: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 6d 65 6d 35   - nByte;.  mem5
2240: 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 2b 2b 3b  .currentCount++;
2250: 0a 20 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f  .  mem5.currentO
2260: 75 74 20 2b 3d 20 69 46 75 6c 6c 53 7a 3b 0a 20  ut += iFullSz;. 
2270: 20 69 66 28 20 6d 65 6d 35 2e 6d 61 78 43 6f 75   if( mem5.maxCou
2280: 6e 74 3c 6d 65 6d 35 2e 63 75 72 72 65 6e 74 43  nt<mem5.currentC
2290: 6f 75 6e 74 20 29 20 6d 65 6d 35 2e 6d 61 78 43  ount ) mem5.maxC
22a0: 6f 75 6e 74 20 3d 20 6d 65 6d 35 2e 63 75 72 72  ount = mem5.curr
22b0: 65 6e 74 43 6f 75 6e 74 3b 0a 20 20 69 66 28 20  entCount;.  if( 
22c0: 6d 65 6d 35 2e 6d 61 78 4f 75 74 3c 6d 65 6d 35  mem5.maxOut<mem5
22d0: 2e 63 75 72 72 65 6e 74 4f 75 74 20 29 20 6d 65  .currentOut ) me
22e0: 6d 35 2e 6d 61 78 4f 75 74 20 3d 20 6d 65 6d 35  m5.maxOut = mem5
22f0: 2e 63 75 72 72 65 6e 74 4f 75 74 3b 0a 0a 23 69  .currentOut;..#i
2300: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2310: 47 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  G.  /* Make sure
2320: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
2330: 65 6d 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 61  emory does not a
2340: 73 73 75 6d 65 20 74 68 61 74 20 69 74 20 69 73  ssume that it is
2350: 20 73 65 74 20 74 6f 20 7a 65 72 6f 0a 20 20 2a   set to zero.  *
2360: 2a 20 6f 72 20 72 65 74 61 69 6e 73 20 61 20 76  * or retains a v
2370: 61 6c 75 65 20 66 72 6f 6d 20 61 20 70 72 65 76  alue from a prev
2380: 69 6f 75 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  ious allocation 
2390: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d  */.  memset(&mem
23a0: 35 2e 7a 50 6f 6f 6c 5b 69 2a 6d 65 6d 35 2e 73  5.zPool[i*mem5.s
23b0: 7a 41 74 6f 6d 5d 2c 20 30 78 41 41 2c 20 69 46  zAtom], 0xAA, iF
23c0: 75 6c 6c 53 7a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ullSz);.#endif..
23d0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
23e0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
23f0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 2a  ocated memory. *
2400: 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  /.  return (void
2410: 2a 29 26 6d 65 6d 35 2e 7a 50 6f 6f 6c 5b 69 2a  *)&mem5.zPool[i*
2420: 6d 65 6d 35 2e 73 7a 41 74 6f 6d 5d 3b 0a 7d 0a  mem5.szAtom];.}.
2430: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 6f  ./*.** Free an o
2440: 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72  utstanding memor
2450: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  y allocation..*/
2460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
2470: 73 79 73 35 46 72 65 65 55 6e 73 61 66 65 28 76  sys5FreeUnsafe(v
2480: 6f 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 75 33  oid *pOld){.  u3
2490: 32 20 73 69 7a 65 2c 20 69 4c 6f 67 73 69 7a 65  2 size, iLogsize
24a0: 3b 0a 20 20 69 6e 74 20 69 42 6c 6f 63 6b 3b 0a  ;.  int iBlock;.
24b0: 0a 20 20 2f 2a 20 53 65 74 20 69 42 6c 6f 63 6b  .  /* Set iBlock
24c0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
24d0: 20 74 68 65 20 62 6c 6f 63 6b 20 70 6f 69 6e 74   the block point
24e0: 65 64 20 74 6f 20 62 79 20 70 4f 6c 64 20 69 6e  ed to by pOld in
24f0: 20 0a 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79   .  ** the array
2500: 20 6f 66 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20   of mem5.szAtom 
2510: 62 79 74 65 20 62 6c 6f 63 6b 73 20 70 6f 69 6e  byte blocks poin
2520: 74 65 64 20 74 6f 20 62 79 20 6d 65 6d 35 2e 7a  ted to by mem5.z
2530: 50 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 42 6c  Pool..  */.  iBl
2540: 6f 63 6b 20 3d 20 28 69 6e 74 29 28 28 28 75 38  ock = (int)(((u8
2550: 20 2a 29 70 4f 6c 64 2d 6d 65 6d 35 2e 7a 50 6f   *)pOld-mem5.zPo
2560: 6f 6c 29 2f 6d 65 6d 35 2e 73 7a 41 74 6f 6d 29  ol)/mem5.szAtom)
2570: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2580: 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  at the pointer p
2590: 4f 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  Old points to a 
25a0: 76 61 6c 69 64 2c 20 6e 6f 6e 2d 66 72 65 65 20  valid, non-free 
25b0: 62 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 61 73 73 65  block. */.  asse
25c0: 72 74 28 20 69 42 6c 6f 63 6b 3e 3d 30 20 26 26  rt( iBlock>=0 &&
25d0: 20 69 42 6c 6f 63 6b 3c 6d 65 6d 35 2e 6e 42 6c   iBlock<mem5.nBl
25e0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
25f0: 20 28 28 75 38 20 2a 29 70 4f 6c 64 2d 6d 65 6d   ((u8 *)pOld-mem
2600: 35 2e 7a 50 6f 6f 6c 29 25 6d 65 6d 35 2e 73 7a  5.zPool)%mem5.sz
2610: 41 74 6f 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Atom==0 );.  ass
2620: 65 72 74 28 20 28 6d 65 6d 35 2e 61 43 74 72 6c  ert( (mem5.aCtrl
2630: 5b 69 42 6c 6f 63 6b 5d 20 26 20 43 54 52 4c 5f  [iBlock] & CTRL_
2640: 46 52 45 45 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  FREE)==0 );..  i
2650: 4c 6f 67 73 69 7a 65 20 3d 20 6d 65 6d 35 2e 61  Logsize = mem5.a
2660: 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 26 20 43  Ctrl[iBlock] & C
2670: 54 52 4c 5f 4c 4f 47 53 49 5a 45 3b 0a 20 20 73  TRL_LOGSIZE;.  s
2680: 69 7a 65 20 3d 20 31 3c 3c 69 4c 6f 67 73 69 7a  ize = 1<<iLogsiz
2690: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 42 6c  e;.  assert( iBl
26a0: 6f 63 6b 2b 73 69 7a 65 2d 31 3c 28 75 33 32 29  ock+size-1<(u32)
26b0: 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0a 0a  mem5.nBlock );..
26c0: 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42 6c    mem5.aCtrl[iBl
26d0: 6f 63 6b 5d 20 7c 3d 20 43 54 52 4c 5f 46 52 45  ock] |= CTRL_FRE
26e0: 45 3b 0a 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b  E;.  mem5.aCtrl[
26f0: 69 42 6c 6f 63 6b 2b 73 69 7a 65 2d 31 5d 20 7c  iBlock+size-1] |
2700: 3d 20 43 54 52 4c 5f 46 52 45 45 3b 0a 20 20 61  = CTRL_FREE;.  a
2710: 73 73 65 72 74 28 20 6d 65 6d 35 2e 63 75 72 72  ssert( mem5.curr
2720: 65 6e 74 43 6f 75 6e 74 3e 30 20 29 3b 0a 20 20  entCount>0 );.  
2730: 61 73 73 65 72 74 28 20 6d 65 6d 35 2e 63 75 72  assert( mem5.cur
2740: 72 65 6e 74 4f 75 74 3e 3d 28 73 69 7a 65 2a 6d  rentOut>=(size*m
2750: 65 6d 35 2e 73 7a 41 74 6f 6d 29 20 29 3b 0a 20  em5.szAtom) );. 
2760: 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74 43 6f 75   mem5.currentCou
2770: 6e 74 2d 2d 3b 0a 20 20 6d 65 6d 35 2e 63 75 72  nt--;.  mem5.cur
2780: 72 65 6e 74 4f 75 74 20 2d 3d 20 73 69 7a 65 2a  rentOut -= size*
2790: 6d 65 6d 35 2e 73 7a 41 74 6f 6d 3b 0a 20 20 61  mem5.szAtom;.  a
27a0: 73 73 65 72 74 28 20 6d 65 6d 35 2e 63 75 72 72  ssert( mem5.curr
27b0: 65 6e 74 4f 75 74 3e 30 20 7c 7c 20 6d 65 6d 35  entOut>0 || mem5
27c0: 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 3d 3d 30  .currentCount==0
27d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65   );.  assert( me
27e0: 6d 35 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 3e  m5.currentCount>
27f0: 30 20 7c 7c 20 6d 65 6d 35 2e 63 75 72 72 65 6e  0 || mem5.curren
2800: 74 4f 75 74 3d 3d 30 20 29 3b 0a 0a 20 20 6d 65  tOut==0 );..  me
2810: 6d 35 2e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d  m5.aCtrl[iBlock]
2820: 20 3d 20 43 54 52 4c 5f 46 52 45 45 20 7c 20 69   = CTRL_FREE | i
2830: 4c 6f 67 73 69 7a 65 3b 0a 20 20 77 68 69 6c 65  Logsize;.  while
2840: 28 20 41 4c 57 41 59 53 28 69 4c 6f 67 73 69 7a  ( ALWAYS(iLogsiz
2850: 65 3c 4c 4f 47 4d 41 58 29 20 29 7b 0a 20 20 20  e<LOGMAX) ){.   
2860: 20 69 6e 74 20 69 42 75 64 64 79 3b 0a 20 20 20   int iBuddy;.   
2870: 20 69 66 28 20 28 69 42 6c 6f 63 6b 3e 3e 69 4c   if( (iBlock>>iL
2880: 6f 67 73 69 7a 65 29 20 26 20 31 20 29 7b 0a 20  ogsize) & 1 ){. 
2890: 20 20 20 20 20 69 42 75 64 64 79 20 3d 20 69 42       iBuddy = iB
28a0: 6c 6f 63 6b 20 2d 20 73 69 7a 65 3b 0a 20 20 20  lock - size;.   
28b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 42   }else{.      iB
28c0: 75 64 64 79 20 3d 20 69 42 6c 6f 63 6b 20 2b 20  uddy = iBlock + 
28d0: 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  size;.    }.    
28e0: 61 73 73 65 72 74 28 20 69 42 75 64 64 79 3e 3d  assert( iBuddy>=
28f0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 69 42  0 );.    if( (iB
2900: 75 64 64 79 2b 28 31 3c 3c 69 4c 6f 67 73 69 7a  uddy+(1<<iLogsiz
2910: 65 29 29 3e 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20  e))>mem5.nBlock 
2920: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
2930: 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42 75 64   mem5.aCtrl[iBud
2940: 64 79 5d 21 3d 28 43 54 52 4c 5f 46 52 45 45 20  dy]!=(CTRL_FREE 
2950: 7c 20 69 4c 6f 67 73 69 7a 65 29 20 29 20 62 72  | iLogsize) ) br
2960: 65 61 6b 3b 0a 20 20 20 20 6d 65 6d 73 79 73 35  eak;.    memsys5
2970: 55 6e 6c 69 6e 6b 28 69 42 75 64 64 79 2c 20 69  Unlink(iBuddy, i
2980: 4c 6f 67 73 69 7a 65 29 3b 0a 20 20 20 20 69 4c  Logsize);.    iL
2990: 6f 67 73 69 7a 65 2b 2b 3b 0a 20 20 20 20 69 66  ogsize++;.    if
29a0: 28 20 69 42 75 64 64 79 3c 69 42 6c 6f 63 6b 20  ( iBuddy<iBlock 
29b0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 35 2e 61 43  ){.      mem5.aC
29c0: 74 72 6c 5b 69 42 75 64 64 79 5d 20 3d 20 43 54  trl[iBuddy] = CT
29d0: 52 4c 5f 46 52 45 45 20 7c 20 69 4c 6f 67 73 69  RL_FREE | iLogsi
29e0: 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 35 2e 61  ze;.      mem5.a
29f0: 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 3d 20 30  Ctrl[iBlock] = 0
2a00: 3b 0a 20 20 20 20 20 20 69 42 6c 6f 63 6b 20 3d  ;.      iBlock =
2a10: 20 69 42 75 64 64 79 3b 0a 20 20 20 20 7d 65 6c   iBuddy;.    }el
2a20: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 35 2e 61  se{.      mem5.a
2a30: 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 3d 20 43  Ctrl[iBlock] = C
2a40: 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c 6f 67 73  TRL_FREE | iLogs
2a50: 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 35 2e  ize;.      mem5.
2a60: 61 43 74 72 6c 5b 69 42 75 64 64 79 5d 20 3d 20  aCtrl[iBuddy] = 
2a70: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69 7a  0;.    }.    siz
2a80: 65 20 2a 3d 20 32 3b 0a 20 20 7d 0a 0a 23 69 66  e *= 2;.  }..#if
2a90: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2aa0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
2ab0: 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 77 69 74  freed memory wit
2ac0: 68 20 74 68 65 20 30 78 35 35 20 62 69 74 20 70  h the 0x55 bit p
2ad0: 61 74 74 65 72 6e 20 74 6f 20 76 65 72 69 66 79  attern to verify
2ae0: 20 74 68 61 74 20 69 74 20 69 73 0a 20 20 2a 2a   that it is.  **
2af0: 20 6e 6f 74 20 75 73 65 64 20 61 66 74 65 72 20   not used after 
2b00: 62 65 69 6e 67 20 66 72 65 65 64 20 2a 2f 0a 20  being freed */. 
2b10: 20 6d 65 6d 73 65 74 28 26 6d 65 6d 35 2e 7a 50   memset(&mem5.zP
2b20: 6f 6f 6c 5b 69 42 6c 6f 63 6b 2a 6d 65 6d 35 2e  ool[iBlock*mem5.
2b30: 73 7a 41 74 6f 6d 5d 2c 20 30 78 35 35 2c 20 73  szAtom], 0x55, s
2b40: 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
2b50: 6d 65 6d 73 79 73 35 4c 69 6e 6b 28 69 42 6c 6f  memsys5Link(iBlo
2b60: 63 6b 2c 20 69 4c 6f 67 73 69 7a 65 29 3b 0a 7d  ck, iLogsize);.}
2b70: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b80: 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72   nBytes of memor
2b90: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2ba0: 64 20 2a 6d 65 6d 73 79 73 35 4d 61 6c 6c 6f 63  d *memsys5Malloc
2bb0: 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20  (int nBytes){.  
2bc0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2bd0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 42 79 74   = 0;.  if( nByt
2be0: 65 73 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  es>0 ){.    mems
2bf0: 79 73 35 45 6e 74 65 72 28 29 3b 0a 20 20 20 20  ys5Enter();.    
2c00: 70 20 3d 20 6d 65 6d 73 79 73 35 4d 61 6c 6c 6f  p = memsys5Mallo
2c10: 63 55 6e 73 61 66 65 28 6e 42 79 74 65 73 29 3b  cUnsafe(nBytes);
2c20: 0a 20 20 20 20 6d 65 6d 73 79 73 35 4c 65 61 76  .    memsys5Leav
2c30: 65 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e();.  }.  retur
2c40: 6e 20 28 76 6f 69 64 2a 29 70 3b 20 0a 7d 0a 0a  n (void*)p; .}..
2c50: 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72  /*.** Free memor
2c60: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74  y..**.** The out
2c70: 65 72 20 6c 61 79 65 72 20 6d 65 6d 6f 72 79 20  er layer memory 
2c80: 61 6c 6c 6f 63 61 74 6f 72 20 70 72 65 76 65 6e  allocator preven
2c90: 74 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ts this routine 
2ca0: 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 63 61  from.** being ca
2cb0: 6c 6c 65 64 20 77 69 74 68 20 70 50 72 69 6f 72  lled with pPrior
2cc0: 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ==0..*/.static v
2cd0: 6f 69 64 20 6d 65 6d 73 79 73 35 46 72 65 65 28  oid memsys5Free(
2ce0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
2cf0: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 21   assert( pPrior!
2d00: 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 79 73 35 45  =0 );.  memsys5E
2d10: 6e 74 65 72 28 29 3b 0a 20 20 6d 65 6d 73 79 73  nter();.  memsys
2d20: 35 46 72 65 65 55 6e 73 61 66 65 28 70 50 72 69  5FreeUnsafe(pPri
2d30: 6f 72 29 3b 0a 20 20 6d 65 6d 73 79 73 35 4c 65  or);.  memsys5Le
2d40: 61 76 65 28 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ave();  .}../*.*
2d50: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
2d60: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
2d70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2d80: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75  on..**.** The ou
2d90: 74 65 72 20 6c 61 79 65 72 20 6d 65 6d 6f 72 79  ter layer memory
2da0: 20 61 6c 6c 6f 63 61 74 6f 72 20 70 72 65 76 65   allocator preve
2db0: 6e 74 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nts this routine
2dc0: 20 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 63   from.** being c
2dd0: 61 6c 6c 65 64 20 77 69 74 68 20 70 50 72 69 6f  alled with pPrio
2de0: 72 3d 3d 30 2e 20 20 0a 2a 2a 0a 2a 2a 20 6e 42  r==0.  .**.** nB
2df0: 79 74 65 73 20 69 73 20 61 6c 77 61 79 73 20 61  ytes is always a
2e00: 20 76 61 6c 75 65 20 6f 62 74 61 69 6e 65 64 20   value obtained 
2e10: 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c  from a prior cal
2e20: 6c 20 74 6f 0a 2a 2a 20 6d 65 6d 73 79 73 35 52  l to.** memsys5R
2e30: 6f 75 6e 64 28 29 2e 20 20 48 65 6e 63 65 20 6e  ound().  Hence n
2e40: 42 79 74 65 73 20 69 73 20 61 6c 77 61 79 73 20  Bytes is always 
2e50: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 70  a non-negative p
2e60: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 20  ower.** of two. 
2e70: 20 49 66 20 6e 42 79 74 65 73 3d 3d 30 20 74 68   If nBytes==0 th
2e80: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
2e90: 20 6f 76 65 72 73 69 7a 65 20 61 6c 6c 6f 63 61   oversize alloca
2ea0: 74 69 6f 6e 0a 2a 2a 20 28 61 6e 20 61 6c 6c 6f  tion.** (an allo
2eb0: 63 61 74 69 6f 6e 20 6c 61 72 67 65 72 20 74 68  cation larger th
2ec0: 61 6e 20 30 78 34 30 30 30 30 30 30 30 29 20 77  an 0x40000000) w
2ed0: 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 64  as requested and
2ee0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2ef0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 30   should return 0
2f00: 20 77 69 74 68 6f 75 74 20 66 72 65 65 69 6e 67   without freeing
2f10: 20 70 50 72 69 6f 72 2e 0a 2a 2f 0a 73 74 61 74   pPrior..*/.stat
2f20: 69 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 35  ic void *memsys5
2f30: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
2f40: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
2f50: 29 7b 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 0a 20  ){.  int nOld;. 
2f60: 20 76 6f 69 64 20 2a 70 3b 0a 20 20 61 73 73 65   void *p;.  asse
2f70: 72 74 28 20 70 50 72 69 6f 72 21 3d 30 20 29 3b  rt( pPrior!=0 );
2f80: 0a 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74  .  assert( (nByt
2f90: 65 73 26 28 6e 42 79 74 65 73 2d 31 29 29 3d 3d  es&(nBytes-1))==
2fa0: 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 34  0 );  /* EV: R-4
2fb0: 36 31 39 39 2d 33 30 32 34 39 20 2a 2f 0a 20 20  6199-30249 */.  
2fc0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
2fd0: 30 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  0 );.  if( nByte
2fe0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  s==0 ){.    retu
2ff0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64  rn 0;.  }.  nOld
3000: 20 3d 20 6d 65 6d 73 79 73 35 53 69 7a 65 28 70   = memsys5Size(p
3010: 50 72 69 6f 72 29 3b 0a 20 20 69 66 28 20 6e 42  Prior);.  if( nB
3020: 79 74 65 73 3c 3d 6e 4f 6c 64 20 29 7b 0a 20 20  ytes<=nOld ){.  
3030: 20 20 72 65 74 75 72 6e 20 70 50 72 69 6f 72 3b    return pPrior;
3040: 0a 20 20 7d 0a 20 20 6d 65 6d 73 79 73 35 45 6e  .  }.  memsys5En
3050: 74 65 72 28 29 3b 0a 20 20 70 20 3d 20 6d 65 6d  ter();.  p = mem
3060: 73 79 73 35 4d 61 6c 6c 6f 63 55 6e 73 61 66 65  sys5MallocUnsafe
3070: 28 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  (nBytes);.  if( 
3080: 70 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  p ){.    memcpy(
3090: 70 2c 20 70 50 72 69 6f 72 2c 20 6e 4f 6c 64 29  p, pPrior, nOld)
30a0: 3b 0a 20 20 20 20 6d 65 6d 73 79 73 35 46 72 65  ;.    memsys5Fre
30b0: 65 55 6e 73 61 66 65 28 70 50 72 69 6f 72 29 3b  eUnsafe(pPrior);
30c0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 79 73 35 4c 65  .  }.  memsys5Le
30d0: 61 76 65 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  ave();.  return 
30e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e  p;.}../*.** Roun
30f0: 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73  d up a request s
3100: 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ize to the next 
3110: 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  valid allocation
3120: 20 73 69 7a 65 2e 20 20 49 66 0a 2a 2a 20 74 68   size.  If.** th
3130: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
3140: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
3150: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 20  handled by this 
3160: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 79 73 74 65  allocation syste
3170: 6d 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a  m,.** return 0..
3180: 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 6c 6c 6f 63 61  **.** All alloca
3190: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 61 20  tions must be a 
31a0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 61 6e 64  power of two and
31b0: 20 6d 75 73 74 20 62 65 20 65 78 70 72 65 73 73   must be express
31c0: 65 64 20 62 79 20 61 0a 2a 2a 20 33 32 2d 62 69  ed by a.** 32-bi
31d0: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
31e0: 2e 20 20 48 65 6e 63 65 20 74 68 65 20 6c 61 72  .  Hence the lar
31f0: 67 65 73 74 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  gest allocation 
3200: 69 73 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a  is 0x40000000.**
3210: 20 6f 72 20 31 30 37 33 37 34 31 38 32 34 20 62   or 1073741824 b
3220: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
3230: 69 6e 74 20 6d 65 6d 73 79 73 35 52 6f 75 6e 64  int memsys5Round
3240: 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  up(int n){.  int
3250: 20 69 46 75 6c 6c 53 7a 3b 0a 20 20 69 66 28 20   iFullSz;.  if( 
3260: 6e 20 3e 20 30 78 34 30 30 30 30 30 30 30 20 29  n > 0x40000000 )
3270: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
3280: 28 69 46 75 6c 6c 53 7a 3d 6d 65 6d 35 2e 73 7a  (iFullSz=mem5.sz
3290: 41 74 6f 6d 3b 20 69 46 75 6c 6c 53 7a 3c 6e 3b  Atom; iFullSz<n;
32a0: 20 69 46 75 6c 6c 53 7a 20 2a 3d 20 32 29 3b 0a   iFullSz *= 2);.
32b0: 20 20 72 65 74 75 72 6e 20 69 46 75 6c 6c 53 7a    return iFullSz
32c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
32d0: 6e 20 74 68 65 20 63 65 69 6c 69 6e 67 20 6f 66  n the ceiling of
32e0: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 62   the logarithm b
32f0: 61 73 65 20 32 20 6f 66 20 69 56 61 6c 75 65 2e  ase 2 of iValue.
3300: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a  .**.** Examples:
3310: 20 20 20 6d 65 6d 73 79 73 35 4c 6f 67 28 31 29     memsys5Log(1)
3320: 20 2d 3e 20 30 0a 2a 2a 20 20 20 20 20 20 20 20   -> 0.**        
3330: 20 20 20 20 20 6d 65 6d 73 79 73 35 4c 6f 67 28       memsys5Log(
3340: 32 29 20 2d 3e 20 31 0a 2a 2a 20 20 20 20 20 20  2) -> 1.**      
3350: 20 20 20 20 20 20 20 6d 65 6d 73 79 73 35 4c 6f         memsys5Lo
3360: 67 28 34 29 20 2d 3e 20 32 0a 2a 2a 20 20 20 20  g(4) -> 2.**    
3370: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 79 73 35           memsys5
3380: 4c 6f 67 28 35 29 20 2d 3e 20 33 0a 2a 2a 20 20  Log(5) -> 3.**  
3390: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 79             memsy
33a0: 73 35 4c 6f 67 28 38 29 20 2d 3e 20 33 0a 2a 2a  s5Log(8) -> 3.**
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
33c0: 73 79 73 35 4c 6f 67 28 39 29 20 2d 3e 20 34 0a  sys5Log(9) -> 4.
33d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
33e0: 6d 73 79 73 35 4c 6f 67 28 69 6e 74 20 69 56 61  msys5Log(int iVa
33f0: 6c 75 65 29 7b 0a 20 20 69 6e 74 20 69 4c 6f 67  lue){.  int iLog
3400: 3b 0a 20 20 66 6f 72 28 69 4c 6f 67 3d 30 3b 20  ;.  for(iLog=0; 
3410: 28 69 4c 6f 67 3c 28 69 6e 74 29 28 28 73 69 7a  (iLog<(int)((siz
3420: 65 6f 66 28 69 6e 74 29 2a 38 29 2d 31 29 29 20  eof(int)*8)-1)) 
3430: 26 26 20 28 31 3c 3c 69 4c 6f 67 29 3c 69 56 61  && (1<<iLog)<iVa
3440: 6c 75 65 3b 20 69 4c 6f 67 2b 2b 29 3b 0a 20 20  lue; iLog++);.  
3450: 72 65 74 75 72 6e 20 69 4c 6f 67 3b 0a 7d 0a 0a  return iLog;.}..
3460: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
3470: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
3480: 63 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cator..**.** Thi
3490: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
34a0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 54 68   threadsafe.  Th
34b0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 62 65  e caller must be
34c0: 20 68 6f 6c 64 69 6e 67 20 61 20 6d 75 74 65 78   holding a mutex
34d0: 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6d  .** to prevent m
34e0: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
34f0: 66 72 6f 6d 20 65 6e 74 65 72 69 6e 67 20 61 74  from entering at
3500: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
3510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
3520: 6d 73 79 73 35 49 6e 69 74 28 76 6f 69 64 20 2a  msys5Init(void *
3530: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
3540: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
3550: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
3560: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
3570: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3580: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
3590: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ory available to
35a0: 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20   this allocator 
35b0: 2a 2f 0a 20 20 75 38 20 2a 7a 42 79 74 65 3b 20  */.  u8 *zByte; 
35c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
35d0: 79 20 75 73 61 62 6c 65 20 62 79 20 74 68 69 73  y usable by this
35e0: 20 61 6c 6c 6f 63 61 74 6f 72 20 2a 2f 0a 20 20   allocator */.  
35f0: 69 6e 74 20 6e 4d 69 6e 4c 6f 67 3b 20 20 20 20  int nMinLog;    
3600: 20 20 20 2f 2a 20 4c 6f 67 20 62 61 73 65 20 32     /* Log base 2
3610: 20 6f 66 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f   of minimum allo
3620: 63 61 74 69 6f 6e 20 73 69 7a 65 20 69 6e 20 62  cation size in b
3630: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ytes */.  int iO
3640: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
3650: 41 6e 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 6d  An offset into m
3660: 65 6d 35 2e 61 43 74 72 6c 5b 5d 20 2a 2f 0a 0a  em5.aCtrl[] */..
3670: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3680: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a 20 20  ER(NotUsed);..  
3690: 2f 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  /* For the purpo
36a0: 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
36b0: 69 6e 65 2c 20 64 69 73 61 62 6c 65 20 74 68 65  ine, disable the
36c0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 6d 65 6d 35   mutex */.  mem5
36d0: 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 0a 20 20 2f  .mutex = 0;..  /
36e0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  * The size of a 
36f0: 4d 65 6d 35 4c 69 6e 6b 20 6f 62 6a 65 63 74 20  Mem5Link object 
3700: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
3710: 6f 66 20 74 77 6f 2e 20 20 56 65 72 69 66 79 20  of two.  Verify 
3720: 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73 20 69  that.  ** this i
3730: 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  s case..  */.  a
3740: 73 73 65 72 74 28 20 28 73 69 7a 65 6f 66 28 4d  ssert( (sizeof(M
3750: 65 6d 35 4c 69 6e 6b 29 26 28 73 69 7a 65 6f 66  em5Link)&(sizeof
3760: 28 4d 65 6d 35 4c 69 6e 6b 29 2d 31 29 29 3d 3d  (Mem5Link)-1))==
3770: 30 20 29 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  0 );..  nByte = 
3780: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3790: 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 7a 42 79  fig.nHeap;.  zBy
37a0: 74 65 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65  te = (u8*)sqlite
37b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
37c0: 65 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  eap;.  assert( z
37d0: 42 79 74 65 21 3d 30 20 29 3b 20 20 2f 2a 20 73  Byte!=0 );  /* s
37e0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20  qlite3_config() 
37f0: 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 6f  does not allow o
3800: 74 68 65 72 77 69 73 65 20 2a 2f 0a 0a 20 20 2f  therwise */..  /
3810: 2a 20 62 6f 75 6e 64 61 72 69 65 73 20 6f 6e 20  * boundaries on 
3820: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3830: 66 69 67 2e 6d 6e 52 65 71 20 61 72 65 20 65 6e  fig.mnReq are en
3840: 66 6f 72 63 65 64 20 69 6e 20 73 71 6c 69 74 65  forced in sqlite
3850: 33 5f 63 6f 6e 66 69 67 28 29 20 2a 2f 0a 20 20  3_config() */.  
3860: 6e 4d 69 6e 4c 6f 67 20 3d 20 6d 65 6d 73 79 73  nMinLog = memsys
3870: 35 4c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  5Log(sqlite3Glob
3880: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 29 3b  alConfig.mnReq);
3890: 0a 20 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3d  .  mem5.szAtom =
38a0: 20 28 31 3c 3c 6e 4d 69 6e 4c 6f 67 29 3b 0a 20   (1<<nMinLog);. 
38b0: 20 77 68 69 6c 65 28 20 28 69 6e 74 29 73 69 7a   while( (int)siz
38c0: 65 6f 66 28 4d 65 6d 35 4c 69 6e 6b 29 3e 6d 65  eof(Mem5Link)>me
38d0: 6d 35 2e 73 7a 41 74 6f 6d 20 29 7b 0a 20 20 20  m5.szAtom ){.   
38e0: 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3d 20 6d   mem5.szAtom = m
38f0: 65 6d 35 2e 73 7a 41 74 6f 6d 20 3c 3c 20 31 3b  em5.szAtom << 1;
3900: 0a 20 20 7d 0a 0a 20 20 6d 65 6d 35 2e 6e 42 6c  .  }..  mem5.nBl
3910: 6f 63 6b 20 3d 20 28 6e 42 79 74 65 20 2f 20 28  ock = (nByte / (
3920: 6d 65 6d 35 2e 73 7a 41 74 6f 6d 2b 73 69 7a 65  mem5.szAtom+size
3930: 6f 66 28 75 38 29 29 29 3b 0a 20 20 6d 65 6d 35  of(u8)));.  mem5
3940: 2e 7a 50 6f 6f 6c 20 3d 20 7a 42 79 74 65 3b 0a  .zPool = zByte;.
3950: 20 20 6d 65 6d 35 2e 61 43 74 72 6c 20 3d 20 28    mem5.aCtrl = (
3960: 75 38 20 2a 29 26 6d 65 6d 35 2e 7a 50 6f 6f 6c  u8 *)&mem5.zPool
3970: 5b 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 2a 6d 65 6d  [mem5.nBlock*mem
3980: 35 2e 73 7a 41 74 6f 6d 5d 3b 0a 0a 20 20 66 6f  5.szAtom];..  fo
3990: 72 28 69 69 3d 30 3b 20 69 69 3c 3d 4c 4f 47 4d  r(ii=0; ii<=LOGM
39a0: 41 58 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 6d  AX; ii++){.    m
39b0: 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69  em5.aiFreelist[i
39c0: 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  i] = -1;.  }..  
39d0: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 66  iOffset = 0;.  f
39e0: 6f 72 28 69 69 3d 4c 4f 47 4d 41 58 3b 20 69 69  or(ii=LOGMAX; ii
39f0: 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20  >=0; ii--){.    
3a00: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 28 31 3c  int nAlloc = (1<
3a10: 3c 69 69 29 3b 0a 20 20 20 20 69 66 28 20 28 69  <ii);.    if( (i
3a20: 4f 66 66 73 65 74 2b 6e 41 6c 6c 6f 63 29 3c 3d  Offset+nAlloc)<=
3a30: 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 7b 0a 20  mem5.nBlock ){. 
3a40: 20 20 20 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b       mem5.aCtrl[
3a50: 69 4f 66 66 73 65 74 5d 20 3d 20 69 69 20 7c 20  iOffset] = ii | 
3a60: 43 54 52 4c 5f 46 52 45 45 3b 0a 20 20 20 20 20  CTRL_FREE;.     
3a70: 20 6d 65 6d 73 79 73 35 4c 69 6e 6b 28 69 4f 66   memsys5Link(iOf
3a80: 66 73 65 74 2c 20 69 69 29 3b 0a 20 20 20 20 20  fset, ii);.     
3a90: 20 69 4f 66 66 73 65 74 20 2b 3d 20 6e 41 6c 6c   iOffset += nAll
3aa0: 6f 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  oc;.    }.    as
3ab0: 73 65 72 74 28 28 69 4f 66 66 73 65 74 2b 6e 41  sert((iOffset+nA
3ac0: 6c 6c 6f 63 29 3e 6d 65 6d 35 2e 6e 42 6c 6f 63  lloc)>mem5.nBloc
3ad0: 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  k);.  }..  /* If
3ae0: 20 61 20 6d 75 74 65 78 20 69 73 20 72 65 71 75   a mutex is requ
3af0: 69 72 65 64 20 66 6f 72 20 6e 6f 72 6d 61 6c 20  ired for normal 
3b00: 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63  operation, alloc
3b10: 61 74 65 20 6f 6e 65 20 2a 2f 0a 20 20 69 66 28  ate one */.  if(
3b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3b30: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 3d 3d 30  nfig.bMemstat==0
3b40: 20 29 7b 0a 20 20 20 20 6d 65 6d 35 2e 6d 75 74   ){.    mem5.mut
3b50: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
3b60: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
3b70: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
3b80: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
3b90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3ba0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
3bb0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
3bc0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73  static void mems
3bd0: 79 73 35 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  ys5Shutdown(void
3be0: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
3bf0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
3c00: 6f 74 55 73 65 64 29 3b 0a 20 20 6d 65 6d 35 2e  otUsed);.  mem5.
3c10: 6d 75 74 65 78 20 3d 20 30 3b 0a 20 20 72 65 74  mutex = 0;.  ret
3c20: 75 72 6e 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  urn;.}..#ifdef S
3c30: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
3c40: 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 69   Open the file i
3c50: 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77 72 69  ndicated and wri
3c60: 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c 6c 20  te a log of all 
3c70: 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20 0a  unfreed memory .
3c80: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69  ** allocations i
3c90: 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a 2a 2f  nto that log..*/
3ca0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
3cb0: 73 79 73 35 44 75 6d 70 28 63 6f 6e 73 74 20 63  sys5Dump(const c
3cc0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
3cd0: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
3ce0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69  int i, j, n;.  i
3cf0: 6e 74 20 6e 4d 69 6e 4c 6f 67 3b 0a 0a 20 20 69  nt nMinLog;..  i
3d00: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
3d10: 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
3d20: 3d 30 20 29 7b 0a 20 20 20 20 6f 75 74 20 3d 20  =0 ){.    out = 
3d30: 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b  stdout;.  }else{
3d40: 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e  .    out = fopen
3d50: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22 29  (zFilename, "w")
3d60: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30  ;.    if( out==0
3d70: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3d80: 66 28 73 74 64 65 72 72 2c 20 22 2a 2a 20 55 6e  f(stderr, "** Un
3d90: 61 62 6c 65 20 74 6f 20 6f 75 74 70 75 74 20 6d  able to output m
3da0: 65 6d 6f 72 79 20 64 65 62 75 67 20 6f 75 74 70  emory debug outp
3db0: 75 74 20 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e 22  ut log: %s **\n"
3dc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3dd0: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
3de0: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
3df0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
3e00: 6d 73 79 73 35 45 6e 74 65 72 28 29 3b 0a 20 20  msys5Enter();.  
3e10: 6e 4d 69 6e 4c 6f 67 20 3d 20 6d 65 6d 73 79 73  nMinLog = memsys
3e20: 35 4c 6f 67 28 6d 65 6d 35 2e 73 7a 41 74 6f 6d  5Log(mem5.szAtom
3e30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
3e40: 3d 4c 4f 47 4d 41 58 20 26 26 20 69 2b 6e 4d 69  =LOGMAX && i+nMi
3e50: 6e 4c 6f 67 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  nLog<32; i++){. 
3e60: 20 20 20 66 6f 72 28 6e 3d 30 2c 20 6a 3d 6d 65     for(n=0, j=me
3e70: 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69 5d  m5.aiFreelist[i]
3e80: 3b 20 6a 3e 3d 30 3b 20 6a 20 3d 20 4d 45 4d 35  ; j>=0; j = MEM5
3e90: 4c 49 4e 4b 28 6a 29 2d 3e 6e 65 78 74 2c 20 6e  LINK(j)->next, n
3ea0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69 6e 74  ++){}.    fprint
3eb0: 66 28 6f 75 74 2c 20 22 66 72 65 65 6c 69 73 74  f(out, "freelist
3ec0: 20 69 74 65 6d 73 20 6f 66 20 73 69 7a 65 20 25   items of size %
3ed0: 64 3a 20 25 64 5c 6e 22 2c 20 6d 65 6d 35 2e 73  d: %d\n", mem5.s
3ee0: 7a 41 74 6f 6d 20 3c 3c 20 69 2c 20 6e 29 3b 0a  zAtom << i, n);.
3ef0: 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
3f00: 74 2c 20 22 6d 65 6d 35 2e 6e 41 6c 6c 6f 63 20  t, "mem5.nAlloc 
3f10: 20 20 20 20 20 20 3d 20 25 6c 6c 75 5c 6e 22 2c        = %llu\n",
3f20: 20 6d 65 6d 35 2e 6e 41 6c 6c 6f 63 29 3b 0a 20   mem5.nAlloc);. 
3f30: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d   fprintf(out, "m
3f40: 65 6d 35 2e 74 6f 74 61 6c 41 6c 6c 6f 63 20 20  em5.totalAlloc  
3f50: 20 3d 20 25 6c 6c 75 5c 6e 22 2c 20 6d 65 6d 35   = %llu\n", mem5
3f60: 2e 74 6f 74 61 6c 41 6c 6c 6f 63 29 3b 0a 20 20  .totalAlloc);.  
3f70: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65  fprintf(out, "me
3f80: 6d 35 2e 74 6f 74 61 6c 45 78 63 65 73 73 20 20  m5.totalExcess  
3f90: 3d 20 25 6c 6c 75 5c 6e 22 2c 20 6d 65 6d 35 2e  = %llu\n", mem5.
3fa0: 74 6f 74 61 6c 45 78 63 65 73 73 29 3b 0a 20 20  totalExcess);.  
3fb0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65  fprintf(out, "me
3fc0: 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 20 20 20  m5.currentOut   
3fd0: 3d 20 25 75 5c 6e 22 2c 20 6d 65 6d 35 2e 63 75  = %u\n", mem5.cu
3fe0: 72 72 65 6e 74 4f 75 74 29 3b 0a 20 20 66 70 72  rrentOut);.  fpr
3ff0: 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65 6d 35 2e  intf(out, "mem5.
4000: 63 75 72 72 65 6e 74 43 6f 75 6e 74 20 3d 20 25  currentCount = %
4010: 75 5c 6e 22 2c 20 6d 65 6d 35 2e 63 75 72 72 65  u\n", mem5.curre
4020: 6e 74 43 6f 75 6e 74 29 3b 0a 20 20 66 70 72 69  ntCount);.  fpri
4030: 6e 74 66 28 6f 75 74 2c 20 22 6d 65 6d 35 2e 6d  ntf(out, "mem5.m
4040: 61 78 4f 75 74 20 20 20 20 20 20 20 3d 20 25 75  axOut       = %u
4050: 5c 6e 22 2c 20 6d 65 6d 35 2e 6d 61 78 4f 75 74  \n", mem5.maxOut
4060: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
4070: 2c 20 22 6d 65 6d 35 2e 6d 61 78 43 6f 75 6e 74  , "mem5.maxCount
4080: 20 20 20 20 20 3d 20 25 75 5c 6e 22 2c 20 6d 65       = %u\n", me
4090: 6d 35 2e 6d 61 78 43 6f 75 6e 74 29 3b 0a 20 20  m5.maxCount);.  
40a0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65  fprintf(out, "me
40b0: 6d 35 2e 6d 61 78 52 65 71 75 65 73 74 20 20 20  m5.maxRequest   
40c0: 3d 20 25 75 5c 6e 22 2c 20 6d 65 6d 35 2e 6d 61  = %u\n", mem5.ma
40d0: 78 52 65 71 75 65 73 74 29 3b 0a 20 20 6d 65 6d  xRequest);.  mem
40e0: 73 79 73 35 4c 65 61 76 65 28 29 3b 0a 20 20 69  sys5Leave();.  i
40f0: 66 28 20 6f 75 74 3d 3d 73 74 64 6f 75 74 20 29  f( out==stdout )
4100: 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64  {.    fflush(std
4110: 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  out);.  }else{. 
4120: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
4130: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
4140: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4150: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75   is the only rou
4160: 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c  tine in this fil
4170: 65 20 77 69 74 68 20 65 78 74 65 72 6e 61 6c 20  e with external 
4180: 0a 2a 2a 20 6c 69 6e 6b 61 67 65 2e 20 49 74 20  .** linkage. It 
4190: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
41a0: 72 20 74 6f 20 61 20 73 74 61 74 69 63 20 73 71  r to a static sq
41b0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
41c0: 73 0a 2a 2a 20 73 74 72 75 63 74 20 70 6f 70 75  s.** struct popu
41d0: 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6d  lated with the m
41e0: 65 6d 73 79 73 35 20 6d 65 74 68 6f 64 73 2e 0a  emsys5 methods..
41f0: 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
4200: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
4210: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
4220: 73 35 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  s5(void){.  stat
4230: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
4240: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 6d 65 6d  _mem_methods mem
4250: 73 79 73 35 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  sys5Methods = {.
4260: 20 20 20 20 20 6d 65 6d 73 79 73 35 4d 61 6c 6c       memsys5Mall
4270: 6f 63 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 35  oc,.     memsys5
4280: 46 72 65 65 2c 0a 20 20 20 20 20 6d 65 6d 73 79  Free,.     memsy
4290: 73 35 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 20  s5Realloc,.     
42a0: 6d 65 6d 73 79 73 35 53 69 7a 65 2c 0a 20 20 20  memsys5Size,.   
42b0: 20 20 6d 65 6d 73 79 73 35 52 6f 75 6e 64 75 70    memsys5Roundup
42c0: 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 35 49 6e  ,.     memsys5In
42d0: 69 74 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 35  it,.     memsys5
42e0: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 20 30  Shutdown,.     0
42f0: 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26  .  };.  return &
4300: 6d 65 6d 73 79 73 35 4d 65 74 68 6f 64 73 3b 0a  memsys5Methods;.
4310: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
4320: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4330: 53 35 20 2a 2f 0a                                S5 */.