/ Hex Artifact Content
Login

Artifact 6fe00f46997bebb690397cb029719f711e7640e3:


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 65 64 20 69 6e 74 6f 20  e coalesed into 
04e0: 74 68 65 20 73 69 6e 67 6c 65 20 6c 61 72 67 65  the single large
04f0: 72 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  r block..**.**  
0500: 20 33 2e 20 20 4e 65 77 20 6d 65 6d 6f 72 79 20   3.  New memory 
0510: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f  is allocated fro
0520: 6d 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69  m the first avai
0530: 6c 61 62 6c 65 20 66 72 65 65 20 62 6c 6f 63 6b  lable free block
0540: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 67  ..**.** This alg
0550: 6f 72 69 74 68 6d 20 69 73 20 64 65 73 63 72 69  orithm is descri
0560: 62 65 64 20 69 6e 3a 20 4a 2e 20 4d 2e 20 52 6f  bed in: J. M. Ro
0570: 62 73 6f 6e 2e 20 22 42 6f 75 6e 64 73 20 66 6f  bson. "Bounds fo
0580: 72 20 53 6f 6d 65 20 46 75 6e 63 74 69 6f 6e 73  r Some Functions
0590: 0a 2a 2a 20 43 6f 6e 63 65 72 6e 69 6e 67 20 44  .** Concerning D
05a0: 79 6e 61 6d 69 63 20 53 74 6f 72 61 67 65 20 41  ynamic Storage A
05b0: 6c 6c 6f 63 61 74 69 6f 6e 22 2e 20 4a 6f 75 72  llocation". Jour
05c0: 6e 61 6c 20 6f 66 20 74 68 65 20 41 73 73 6f 63  nal of the Assoc
05d0: 69 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 43 6f  iation for.** Co
05e0: 6d 70 75 74 69 6e 67 20 4d 61 63 68 69 6e 65 72  mputing Machiner
05f0: 79 2c 20 56 6f 6c 75 6d 65 20 32 31 2c 20 4e 75  y, Volume 21, Nu
0600: 6d 62 65 72 20 38 2c 20 4a 75 6c 79 20 31 39 37  mber 8, July 197
0610: 34 2c 20 70 61 67 65 73 20 34 39 31 2d 34 39 39  4, pages 491-499
0620: 2e 0a 2a 2a 20 0a 2a 2a 20 4c 65 74 20 6e 20 62  ..** .** Let n b
0630: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
0640: 65 20 6c 61 72 67 65 73 74 20 61 6c 6c 6f 63 61  e largest alloca
0650: 74 69 6f 6e 20 64 69 76 69 64 65 64 20 62 79 20  tion divided by 
0660: 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 2a 2a 20 61  the minimum.** a
0670: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 28  llocation size (
0680: 61 66 74 65 72 20 72 6f 75 6e 64 69 6e 67 20 61  after rounding a
0690: 6c 6c 20 73 69 7a 65 73 20 75 70 20 74 6f 20 61  ll sizes up to a
06a0: 20 70 6f 77 65 72 20 6f 66 20 32 2e 29 20 20 4c   power of 2.)  L
06b0: 65 74 20 4d 0a 2a 2a 20 62 65 20 74 68 65 20 6d  et M.** be the m
06c0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
06d0: 20 6d 65 6d 6f 72 79 20 65 76 65 72 20 6f 75 74   memory ever out
06e0: 73 74 61 6e 64 69 6e 67 20 61 74 20 6f 6e 65 20  standing at one 
06f0: 74 69 6d 65 2e 20 20 4c 65 74 0a 2a 2a 20 4e 20  time.  Let.** N 
0700: 62 65 20 74 68 65 20 74 6f 74 61 6c 20 61 6d 6f  be the total amo
0710: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 76  unt of memory av
0720: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
0730: 63 61 74 69 6f 6e 2e 20 20 52 6f 62 73 6f 6e 0a  cation.  Robson.
0740: 2a 2a 20 70 72 6f 76 65 64 20 74 68 61 74 20 74  ** proved that t
0750: 68 69 73 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  his memory alloc
0760: 61 74 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  ator will never 
0770: 62 72 65 61 6b 64 6f 77 6e 20 64 75 65 20 74 6f  breakdown due to
0780: 20 0a 2a 2a 20 66 72 61 67 6d 65 6e 74 61 74 69   .** fragmentati
0790: 6f 6e 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  on as long as th
07a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
07b0: 74 72 61 69 6e 74 20 68 6f 6c 64 73 3a 0a 2a 2a  traint holds:.**
07c0: 0a 2a 2a 20 20 20 20 20 20 4e 20 3e 3d 20 20 4d  .**      N >=  M
07d0: 2a 28 31 20 2b 20 6c 6f 67 32 28 6e 29 2f 32 29  *(1 + log2(n)/2)
07e0: 20 2d 20 6e 20 2b 20 31 0a 2a 2a 0a 2a 2a 20 54   - n + 1.**.** T
07f0: 68 65 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75  he sqlite3_statu
0800: 73 28 29 20 6c 6f 67 69 63 20 74 72 61 63 6b 73  s() logic tracks
0810: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
0820: 75 65 73 20 6f 66 20 6e 20 61 6e 64 20 4d 20 73  ues of n and M s
0830: 6f 0a 2a 2a 20 74 68 61 74 20 61 6e 20 61 70 70  o.** that an app
0840: 6c 69 63 61 74 69 6f 6e 20 63 61 6e 2c 20 61 74  lication can, at
0850: 20 61 6e 79 20 74 69 6d 65 2c 20 76 65 72 69 66   any time, verif
0860: 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  y this constrain
0870: 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  t..*/.#include "
0880: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0890: 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
08a0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   of the memory a
08b0: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 75 73 65 64  llocator is used
08c0: 20 6f 6e 6c 79 20 77 68 65 6e 20 0a 2a 2a 20 53   only when .** S
08d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
08e0: 53 59 53 35 20 69 73 20 64 65 66 69 6e 65 64 2e  SYS5 is defined.
08f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0900: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
0910: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 69 6e 69 6d 75  ../*.** A minimu
0920: 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  m allocation is 
0930: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
0940: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0950: 75 63 74 75 72 65 2e 0a 2a 2a 20 4c 61 72 67 65  ucture..** Large
0960: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72  r allocations ar
0970: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 68  e an array of th
0980: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 77  ese structures w
0990: 68 65 72 65 20 74 68 65 0a 2a 2a 20 73 69 7a 65  here the.** size
09a0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73   of the array is
09b0: 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a 2a   a power of 2..*
09c0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
09d0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6d 75 73   this object mus
09e0: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
09f0: 74 77 6f 2e 20 20 54 68 61 74 20 66 61 63 74 20  two.  That fact 
0a00: 69 73 0a 2a 2a 20 76 65 72 69 66 69 65 64 20 69  is.** verified i
0a10: 6e 20 6d 65 6d 73 79 73 35 49 6e 69 74 28 29 2e  n memsys5Init().
0a20: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0a30: 63 74 20 4d 65 6d 35 4c 69 6e 6b 20 4d 65 6d 35  ct Mem5Link Mem5
0a40: 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20 4d 65 6d  Link;.struct Mem
0a50: 35 4c 69 6e 6b 20 7b 0a 20 20 69 6e 74 20 6e 65  5Link {.  int ne
0a60: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  xt;       /* Ind
0a70: 65 78 20 6f 66 20 6e 65 78 74 20 66 72 65 65 20  ex of next free 
0a80: 63 68 75 6e 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  chunk */.  int p
0a90: 72 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  rev;       /* In
0aa0: 64 65 78 20 6f 66 20 70 72 65 76 69 6f 75 73 20  dex of previous 
0ab0: 66 72 65 65 20 63 68 75 6e 6b 20 2a 2f 0a 7d 3b  free chunk */.};
0ac0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0ad0: 73 69 7a 65 20 6f 66 20 61 6e 79 20 61 6c 6c 6f  size of any allo
0ae0: 63 61 74 69 6f 6e 20 69 73 20 28 28 31 3c 3c 4c  cation is ((1<<L
0af0: 4f 47 4d 41 58 29 2a 6d 65 6d 35 2e 73 7a 41 74  OGMAX)*mem5.szAt
0b00: 6f 6d 29 2e 20 53 69 6e 63 65 0a 2a 2a 20 6d 65  om). Since.** me
0b10: 6d 35 2e 73 7a 41 74 6f 6d 20 69 73 20 61 6c 77  m5.szAtom is alw
0b20: 61 79 73 20 61 74 20 6c 65 61 73 74 20 38 20 61  ays at least 8 a
0b30: 6e 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  nd 32-bit intege
0b40: 72 73 20 61 72 65 20 75 73 65 64 2c 0a 2a 2a 20  rs are used,.** 
0b50: 69 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  it is not actual
0b60: 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ly possible to r
0b70: 65 61 63 68 20 74 68 69 73 20 6c 69 6d 69 74 2e  each this limit.
0b80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4f 47 4d  .*/.#define LOGM
0b90: 41 58 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 4d 61 73  AX 30../*.** Mas
0ba0: 6b 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 35  ks used for mem5
0bb0: 2e 61 43 74 72 6c 5b 5d 20 65 6c 65 6d 65 6e 74  .aCtrl[] element
0bc0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 54  s..*/.#define CT
0bd0: 52 4c 5f 4c 4f 47 53 49 5a 45 20 20 30 78 31 66  RL_LOGSIZE  0x1f
0be0: 20 20 20 20 2f 2a 20 4c 6f 67 32 20 53 69 7a 65      /* Log2 Size
0bf0: 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 20 2a   of this block *
0c00: 2f 0a 23 64 65 66 69 6e 65 20 43 54 52 4c 5f 46  /.#define CTRL_F
0c10: 52 45 45 20 20 20 20 20 30 78 32 30 20 20 20 20  REE     0x20    
0c20: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 74 20 63  /* True if not c
0c30: 68 65 63 6b 65 64 20 6f 75 74 20 2a 2f 0a 0a 2f  hecked out */../
0c40: 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
0c50: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73  static variables
0c60: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6d 6f   used by this mo
0c70: 64 75 6c 65 20 61 72 65 20 63 6f 6c 6c 65 63 74  dule are collect
0c80: 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 69 6e  ed.** into a sin
0c90: 67 6c 65 20 73 74 72 75 63 74 75 72 65 20 6e 61  gle structure na
0ca0: 6d 65 64 20 22 6d 65 6d 35 22 2e 20 20 54 68 69  med "mem5".  Thi
0cb0: 73 20 69 73 20 74 6f 20 6b 65 65 70 20 74 68 65  s is to keep the
0cc0: 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61  .** static varia
0cd0: 62 6c 65 73 20 6f 72 67 61 6e 69 7a 65 64 20 61  bles organized a
0ce0: 6e 64 20 74 6f 20 72 65 64 75 63 65 20 6e 61 6d  nd to reduce nam
0cf0: 65 73 70 61 63 65 20 70 6f 6c 6c 75 74 69 6f 6e  espace pollution
0d00: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 6d 6f  .** when this mo
0d10: 64 75 6c 65 20 69 73 20 63 6f 6d 62 69 6e 65 64  dule is combined
0d20: 20 77 69 74 68 20 6f 74 68 65 72 20 69 6e 20 74   with other in t
0d30: 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2e  he amalgamation.
0d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
0d50: 45 5f 57 53 44 20 73 74 72 75 63 74 20 4d 65 6d  E_WSD struct Mem
0d60: 35 47 6c 6f 62 61 6c 20 7b 0a 20 20 2f 2a 0a 20  5Global {.  /*. 
0d70: 20 2a 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c   ** Memory avail
0d80: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
0d90: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73  ion.  */.  int s
0da0: 7a 41 74 6f 6d 3b 20 20 20 20 20 20 2f 2a 20 53  zAtom;      /* S
0db0: 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
0dc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 62   allocation in b
0dd0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ytes */.  int nB
0de0: 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 4e 75  lock;      /* Nu
0df0: 6d 62 65 72 20 6f 66 20 73 7a 41 74 6f 6d 20 73  mber of szAtom s
0e00: 69 7a 65 64 20 62 6c 6f 63 6b 73 20 69 6e 20 7a  ized blocks in z
0e10: 50 6f 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a 7a 50  Pool */.  u8 *zP
0e20: 6f 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  ool;       /* Me
0e30: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 74  mory available t
0e40: 6f 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  o be allocated *
0e50: 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  /.  .  /*.  ** M
0e60: 75 74 65 78 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  utex to control 
0e70: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 6d 65  access to the me
0e80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0e90: 73 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a  subsystem..  */.
0ea0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
0eb0: 2a 6d 75 74 65 78 3b 0a 0a 20 20 2f 2a 0a 20 20  *mutex;..  /*.  
0ec0: 2a 2a 20 50 65 72 66 6f 72 6d 61 6e 63 65 20 73  ** Performance s
0ed0: 74 61 74 69 73 74 69 63 73 0a 20 20 2a 2f 0a 20  tatistics.  */. 
0ee0: 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   u64 nAlloc;    
0ef0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
0f00: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
0f10: 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 75 36 34   malloc */.  u64
0f20: 20 74 6f 74 61 6c 41 6c 6c 6f 63 3b 20 20 20 20   totalAlloc;    
0f30: 20 2f 2a 20 54 6f 74 61 6c 20 6f 66 20 61 6c 6c   /* Total of all
0f40: 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73 20 2d 20   malloc calls - 
0f50: 69 6e 63 6c 75 64 65 73 20 69 6e 74 65 72 6e 61  includes interna
0f60: 6c 20 66 72 61 67 20 2a 2f 0a 20 20 75 36 34 20  l frag */.  u64 
0f70: 74 6f 74 61 6c 45 78 63 65 73 73 3b 20 20 20 20  totalExcess;    
0f80: 2f 2a 20 54 6f 74 61 6c 20 69 6e 74 65 72 6e 61  /* Total interna
0f90: 6c 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  l fragmentation 
0fa0: 2a 2f 0a 20 20 75 33 32 20 63 75 72 72 65 6e 74  */.  u32 current
0fb0: 4f 75 74 3b 20 20 20 20 20 2f 2a 20 43 75 72 72  Out;     /* Curr
0fc0: 65 6e 74 20 63 68 65 63 6b 6f 75 74 2c 20 69 6e  ent checkout, in
0fd0: 63 6c 75 64 69 6e 67 20 69 6e 74 65 72 6e 61 6c  cluding internal
0fe0: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
0ff0: 2f 0a 20 20 75 33 32 20 63 75 72 72 65 6e 74 43  /.  u32 currentC
1000: 6f 75 6e 74 3b 20 20 20 2f 2a 20 43 75 72 72 65  ount;   /* Curre
1010: 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 73  nt number of dis
1020: 74 69 6e 63 74 20 63 68 65 63 6b 6f 75 74 73 20  tinct checkouts 
1030: 2a 2f 0a 20 20 75 33 32 20 6d 61 78 4f 75 74 3b  */.  u32 maxOut;
1040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1050: 6d 75 6d 20 69 6e 73 74 61 6e 74 61 6e 65 6f 75  mum instantaneou
1060: 73 20 63 75 72 72 65 6e 74 4f 75 74 20 2a 2f 0a  s currentOut */.
1070: 20 20 75 33 32 20 6d 61 78 43 6f 75 6e 74 3b 20    u32 maxCount; 
1080: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1090: 20 69 6e 73 74 61 6e 74 61 6e 65 6f 75 73 20 63   instantaneous c
10a0: 75 72 72 65 6e 74 43 6f 75 6e 74 20 2a 2f 0a 20  urrentCount */. 
10b0: 20 75 33 32 20 6d 61 78 52 65 71 75 65 73 74 3b   u32 maxRequest;
10c0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
10d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 65 78 63 6c  allocation (excl
10e0: 75 73 69 76 65 20 6f 66 20 69 6e 74 65 72 6e 61  usive of interna
10f0: 6c 20 66 72 61 67 29 20 2a 2f 0a 20 20 0a 20 20  l frag) */.  .  
1100: 2f 2a 0a 20 20 2a 2a 20 4c 69 73 74 73 20 6f 66  /*.  ** Lists of
1110: 20 66 72 65 65 20 62 6c 6f 63 6b 73 2e 20 20 61   free blocks.  a
1120: 69 46 72 65 65 6c 69 73 74 5b 30 5d 20 69 73 20  iFreelist[0] is 
1130: 61 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 62  a list of free b
1140: 6c 6f 63 6b 73 20 6f 66 0a 20 20 2a 2a 20 73 69  locks of.  ** si
1150: 7a 65 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 2e 20  ze mem5.szAtom. 
1160: 20 61 69 46 72 65 65 6c 69 73 74 5b 31 5d 20 68   aiFreelist[1] h
1170: 6f 6c 64 73 20 62 6c 6f 63 6b 73 20 6f 66 20 73  olds blocks of s
1180: 69 7a 65 20 73 7a 41 74 6f 6d 2a 32 2e 0a 20 20  ize szAtom*2..  
1190: 2a 2a 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** and so forth.
11a0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 61 69 46 72  .  */.  int aiFr
11b0: 65 65 6c 69 73 74 5b 4c 4f 47 4d 41 58 2b 31 5d  eelist[LOGMAX+1]
11c0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 70 61  ;..  /*.  ** Spa
11d0: 63 65 20 66 6f 72 20 74 72 61 63 6b 69 6e 67 20  ce for tracking 
11e0: 77 68 69 63 68 20 62 6c 6f 63 6b 73 20 61 72 65  which blocks are
11f0: 20 63 68 65 63 6b 65 64 20 6f 75 74 20 61 6e 64   checked out and
1200: 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f   the size.  ** o
1210: 66 20 65 61 63 68 20 62 6c 6f 63 6b 2e 20 20 4f  f each block.  O
1220: 6e 65 20 62 79 74 65 20 70 65 72 20 62 6c 6f 63  ne byte per bloc
1230: 6b 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 2a 61 43  k..  */.  u8 *aC
1240: 74 72 6c 3b 0a 0a 7d 20 6d 65 6d 35 20 3d 20 7b  trl;..} mem5 = {
1250: 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 63 63   0 };../*.** Acc
1260: 65 73 73 20 74 68 65 20 73 74 61 74 69 63 20 76  ess the static v
1270: 61 72 69 61 62 6c 65 20 74 68 72 6f 75 67 68 20  ariable through 
1280: 61 20 6d 61 63 72 6f 20 66 6f 72 20 53 51 4c 49  a macro for SQLI
1290: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 2a 2f 0a 23  TE_OMIT_WSD.*/.#
12a0: 64 65 66 69 6e 65 20 6d 65 6d 35 20 47 4c 4f 42  define mem5 GLOB
12b0: 41 4c 28 73 74 72 75 63 74 20 4d 65 6d 35 47 6c  AL(struct Mem5Gl
12c0: 6f 62 61 6c 2c 20 6d 65 6d 35 29 0a 0a 2f 2a 0a  obal, mem5)../*.
12d0: 2a 2a 20 41 73 73 75 6d 69 6e 67 20 6d 65 6d 35  ** Assuming mem5
12e0: 2e 7a 50 6f 6f 6c 20 69 73 20 64 69 76 69 64 65  .zPool is divide
12f0: 64 20 75 70 20 69 6e 74 6f 20 61 6e 20 61 72 72  d up into an arr
1300: 61 79 20 6f 66 20 4d 65 6d 35 4c 69 6e 6b 0a 2a  ay of Mem5Link.*
1310: 2a 20 73 74 72 75 63 74 75 72 65 73 2c 20 72 65  * structures, re
1320: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1330: 6f 20 74 68 65 20 69 64 78 2d 74 68 20 73 75 63  o the idx-th suc
1340: 68 20 6c 69 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e  h lik..*/.#defin
1350: 65 20 4d 45 4d 35 4c 49 4e 4b 28 69 64 78 29 20  e MEM5LINK(idx) 
1360: 28 28 4d 65 6d 35 4c 69 6e 6b 20 2a 29 28 26 6d  ((Mem5Link *)(&m
1370: 65 6d 35 2e 7a 50 6f 6f 6c 5b 28 69 64 78 29 2a  em5.zPool[(idx)*
1380: 6d 65 6d 35 2e 73 7a 41 74 6f 6d 5d 29 29 0a 0a  mem5.szAtom]))..
1390: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
13a0: 20 63 68 75 6e 6b 20 61 74 20 6d 65 6d 35 2e 61   chunk at mem5.a
13b0: 50 6f 6f 6c 5b 69 5d 20 66 72 6f 6d 20 6c 69 73  Pool[i] from lis
13c0: 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
13d0: 79 0a 2a 2a 20 6f 6e 2e 20 20 49 74 20 73 68 6f  y.** on.  It sho
13e0: 75 6c 64 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  uld be found on 
13f0: 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b  mem5.aiFreelist[
1400: 69 4c 6f 67 73 69 7a 65 5d 2e 0a 2a 2f 0a 73 74  iLogsize]..*/.st
1410: 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73  atic void memsys
1420: 35 55 6e 6c 69 6e 6b 28 69 6e 74 20 69 2c 20 69  5Unlink(int i, i
1430: 6e 74 20 69 4c 6f 67 73 69 7a 65 29 7b 0a 20 20  nt iLogsize){.  
1440: 69 6e 74 20 6e 65 78 74 2c 20 70 72 65 76 3b 0a  int next, prev;.
1450: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
1460: 26 20 69 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20  & i<mem5.nBlock 
1470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 6f  );.  assert( iLo
1480: 67 73 69 7a 65 3e 3d 30 20 26 26 20 69 4c 6f 67  gsize>=0 && iLog
1490: 73 69 7a 65 3c 3d 4c 4f 47 4d 41 58 20 29 3b 0a  size<=LOGMAX );.
14a0: 20 20 61 73 73 65 72 74 28 20 28 6d 65 6d 35 2e    assert( (mem5.
14b0: 61 43 74 72 6c 5b 69 5d 20 26 20 43 54 52 4c 5f  aCtrl[i] & CTRL_
14c0: 4c 4f 47 53 49 5a 45 29 3d 3d 69 4c 6f 67 73 69  LOGSIZE)==iLogsi
14d0: 7a 65 20 29 3b 0a 0a 20 20 6e 65 78 74 20 3d 20  ze );..  next = 
14e0: 4d 45 4d 35 4c 49 4e 4b 28 69 29 2d 3e 6e 65 78  MEM5LINK(i)->nex
14f0: 74 3b 0a 20 20 70 72 65 76 20 3d 20 4d 45 4d 35  t;.  prev = MEM5
1500: 4c 49 4e 4b 28 69 29 2d 3e 70 72 65 76 3b 0a 20  LINK(i)->prev;. 
1510: 20 69 66 28 20 70 72 65 76 3c 30 20 29 7b 0a 20   if( prev<0 ){. 
1520: 20 20 20 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69     mem5.aiFreeli
1530: 73 74 5b 69 4c 6f 67 73 69 7a 65 5d 20 3d 20 6e  st[iLogsize] = n
1540: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
1550: 20 20 4d 45 4d 35 4c 49 4e 4b 28 70 72 65 76 29    MEM5LINK(prev)
1560: 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  ->next = next;. 
1570: 20 7d 0a 20 20 69 66 28 20 6e 65 78 74 3e 3d 30   }.  if( next>=0
1580: 20 29 7b 0a 20 20 20 20 4d 45 4d 35 4c 49 4e 4b   ){.    MEM5LINK
1590: 28 6e 65 78 74 29 2d 3e 70 72 65 76 20 3d 20 70  (next)->prev = p
15a0: 72 65 76 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rev;.  }.}../*.*
15b0: 2a 20 4c 69 6e 6b 20 74 68 65 20 63 68 75 6e 6b  * Link the chunk
15c0: 20 61 74 20 6d 65 6d 35 2e 61 50 6f 6f 6c 5b 69   at mem5.aPool[i
15d0: 5d 20 73 6f 20 74 68 61 74 20 69 73 20 6f 6e 20  ] so that is on 
15e0: 74 68 65 20 69 4c 6f 67 73 69 7a 65 0a 2a 2a 20  the iLogsize.** 
15f0: 66 72 65 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  free list..*/.st
1600: 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73  atic void memsys
1610: 35 4c 69 6e 6b 28 69 6e 74 20 69 2c 20 69 6e 74  5Link(int i, int
1620: 20 69 4c 6f 67 73 69 7a 65 29 7b 0a 20 20 69 6e   iLogsize){.  in
1630: 74 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t x;.  assert( s
1640: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1650: 64 28 6d 65 6d 35 2e 6d 75 74 65 78 29 20 29 3b  d(mem5.mutex) );
1660: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
1670: 26 26 20 69 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 6b  && i<mem5.nBlock
1680: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1690: 6f 67 73 69 7a 65 3e 3d 30 20 26 26 20 69 4c 6f  ogsize>=0 && iLo
16a0: 67 73 69 7a 65 3c 3d 4c 4f 47 4d 41 58 20 29 3b  gsize<=LOGMAX );
16b0: 0a 20 20 61 73 73 65 72 74 28 20 28 6d 65 6d 35  .  assert( (mem5
16c0: 2e 61 43 74 72 6c 5b 69 5d 20 26 20 43 54 52 4c  .aCtrl[i] & CTRL
16d0: 5f 4c 4f 47 53 49 5a 45 29 3d 3d 69 4c 6f 67 73  _LOGSIZE)==iLogs
16e0: 69 7a 65 20 29 3b 0a 0a 20 20 78 20 3d 20 4d 45  ize );..  x = ME
16f0: 4d 35 4c 49 4e 4b 28 69 29 2d 3e 6e 65 78 74 20  M5LINK(i)->next 
1700: 3d 20 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69 73  = mem5.aiFreelis
1710: 74 5b 69 4c 6f 67 73 69 7a 65 5d 3b 0a 20 20 4d  t[iLogsize];.  M
1720: 45 4d 35 4c 49 4e 4b 28 69 29 2d 3e 70 72 65 76  EM5LINK(i)->prev
1730: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 78 3e 3d   = -1;.  if( x>=
1740: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1750: 20 78 3c 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29   x<mem5.nBlock )
1760: 3b 0a 20 20 20 20 4d 45 4d 35 4c 49 4e 4b 28 78  ;.    MEM5LINK(x
1770: 29 2d 3e 70 72 65 76 20 3d 20 69 3b 0a 20 20 7d  )->prev = i;.  }
1780: 0a 20 20 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69  .  mem5.aiFreeli
1790: 73 74 5b 69 4c 6f 67 73 69 7a 65 5d 20 3d 20 69  st[iLogsize] = i
17a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
17b0: 65 20 53 54 41 54 49 43 5f 4d 45 4d 20 6d 75 74  e STATIC_MEM mut
17c0: 65 78 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ex is not alread
17d0: 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
17e0: 74 20 6e 6f 77 2e 20 54 68 65 20 6d 75 74 65 78  t now. The mutex
17f0: 0a 2a 2a 20 77 69 6c 6c 20 61 6c 72 65 61 64 79  .** will already
1800: 20 62 65 20 68 65 6c 64 20 28 6f 62 74 61 69 6e   be held (obtain
1810: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 6d 61  ed by code in ma
1820: 6c 6c 6f 63 2e 63 29 20 69 66 0a 2a 2a 20 73 71  lloc.c) if.** sq
1830: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1840: 67 2e 62 4d 65 6d 53 74 61 74 20 69 73 20 74 72  g.bMemStat is tr
1850: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
1860: 69 64 20 6d 65 6d 73 79 73 35 45 6e 74 65 72 28  id memsys5Enter(
1870: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
1880: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d  _mutex_enter(mem
1890: 35 2e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74 61 74  5.mutex);.}.stat
18a0: 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 35 4c  ic void memsys5L
18b0: 65 61 76 65 28 76 6f 69 64 29 7b 0a 20 20 73 71  eave(void){.  sq
18c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18d0: 65 28 6d 65 6d 35 2e 6d 75 74 65 78 29 3b 0a 7d  e(mem5.mutex);.}
18e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18f0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75  he size of an ou
1900: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
1910: 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 20  tion, in bytes. 
1920: 20 54 68 65 0a 2a 2a 20 73 69 7a 65 20 72 65 74   The.** size ret
1930: 75 72 6e 65 64 20 6f 6d 69 74 73 20 74 68 65 20  urned omits the 
1940: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 6f 76  8-byte header ov
1950: 65 72 68 65 61 64 2e 20 20 54 68 69 73 20 6f 6e  erhead.  This on
1960: 6c 79 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  ly.** works for 
1970: 63 68 75 6e 6b 73 20 74 68 61 74 20 61 72 65 20  chunks that are 
1980: 63 75 72 72 65 6e 74 6c 79 20 63 68 65 63 6b 65  currently checke
1990: 64 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  d out..*/.static
19a0: 20 69 6e 74 20 6d 65 6d 73 79 73 35 53 69 7a 65   int memsys5Size
19b0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69 6e 74  (void *p){.  int
19c0: 20 69 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66   iSize = 0;.  if
19d0: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
19e0: 20 3d 20 28 28 75 38 20 2a 29 70 2d 6d 65 6d 35   = ((u8 *)p-mem5
19f0: 2e 7a 50 6f 6f 6c 29 2f 6d 65 6d 35 2e 73 7a 41  .zPool)/mem5.szA
1a00: 74 6f 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  tom;.    assert(
1a10: 20 69 3e 3d 30 20 26 26 20 69 3c 6d 65 6d 35 2e   i>=0 && i<mem5.
1a20: 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 53  nBlock );.    iS
1a30: 69 7a 65 20 3d 20 6d 65 6d 35 2e 73 7a 41 74 6f  ize = mem5.szAto
1a40: 6d 20 2a 20 28 31 20 3c 3c 20 28 6d 65 6d 35 2e  m * (1 << (mem5.
1a50: 61 43 74 72 6c 5b 69 5d 26 43 54 52 4c 5f 4c 4f  aCtrl[i]&CTRL_LO
1a60: 47 53 49 5a 45 29 29 3b 0a 20 20 7d 0a 20 20 72  GSIZE));.  }.  r
1a70: 65 74 75 72 6e 20 69 53 69 7a 65 3b 0a 7d 0a 0a  eturn iSize;.}..
1a80: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 66  /*.** Find the f
1a90: 69 72 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  irst entry on th
1aa0: 65 20 66 72 65 65 6c 69 73 74 20 69 4c 6f 67 73  e freelist iLogs
1ab0: 69 7a 65 2e 20 20 55 6e 6c 69 6e 6b 20 74 68 61  ize.  Unlink tha
1ac0: 74 0a 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 72  t.** entry and r
1ad0: 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e  eturn its index.
1ae0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1af0: 6d 65 6d 73 79 73 35 55 6e 6c 69 6e 6b 46 69 72  memsys5UnlinkFir
1b00: 73 74 28 69 6e 74 20 69 4c 6f 67 73 69 7a 65 29  st(int iLogsize)
1b10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1b20: 20 69 46 69 72 73 74 3b 0a 0a 20 20 61 73 73 65   iFirst;..  asse
1b30: 72 74 28 20 69 4c 6f 67 73 69 7a 65 3e 3d 30 20  rt( iLogsize>=0 
1b40: 26 26 20 69 4c 6f 67 73 69 7a 65 3c 3d 4c 4f 47  && iLogsize<=LOG
1b50: 4d 41 58 20 29 3b 0a 20 20 69 20 3d 20 69 46 69  MAX );.  i = iFi
1b60: 72 73 74 20 3d 20 6d 65 6d 35 2e 61 69 46 72 65  rst = mem5.aiFre
1b70: 65 6c 69 73 74 5b 69 4c 6f 67 73 69 7a 65 5d 3b  elist[iLogsize];
1b80: 0a 20 20 61 73 73 65 72 74 28 20 69 46 69 72 73  .  assert( iFirs
1b90: 74 3e 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  t>=0 );.  while(
1ba0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20   i>0 ){.    if( 
1bb0: 69 3c 69 46 69 72 73 74 20 29 20 69 46 69 72 73  i<iFirst ) iFirs
1bc0: 74 20 3d 20 69 3b 0a 20 20 20 20 69 20 3d 20 4d  t = i;.    i = M
1bd0: 45 4d 35 4c 49 4e 4b 28 69 29 2d 3e 6e 65 78 74  EM5LINK(i)->next
1be0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 79 73 35 55  ;.  }.  memsys5U
1bf0: 6e 6c 69 6e 6b 28 69 46 69 72 73 74 2c 20 69 4c  nlink(iFirst, iL
1c00: 6f 67 73 69 7a 65 29 3b 0a 20 20 72 65 74 75 72  ogsize);.  retur
1c10: 6e 20 69 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a  n iFirst;.}../*.
1c20: 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6c 6f 63  ** Return a bloc
1c30: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 66 20 61  k of memory of a
1c40: 74 20 6c 65 61 73 74 20 6e 42 79 74 65 73 20 69  t least nBytes i
1c50: 6e 20 73 69 7a 65 2e 0a 2a 2a 20 52 65 74 75 72  n size..** Retur
1c60: 6e 20 4e 55 4c 4c 20 69 66 20 75 6e 61 62 6c 65  n NULL if unable
1c70: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1c80: 66 20 6e 42 79 74 65 73 3d 3d 30 2e 0a 2a 2a 0a  f nBytes==0..**.
1c90: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
1ca0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 42  arantees that nB
1cb0: 79 74 65 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a  yte positive..**
1cc0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 68  .** The caller h
1cd0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 20 6d 75  as obtained a mu
1ce0: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  tex prior to inv
1cf0: 6f 6b 69 6e 67 20 74 68 69 73 0a 2a 2a 20 72 6f  oking this.** ro
1d00: 75 74 69 6e 65 20 73 6f 20 74 68 65 72 65 20 69  utine so there i
1d10: 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
1d20: 63 65 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d  ce that two or m
1d30: 6f 72 65 0a 2a 2a 20 74 68 72 65 61 64 73 20 63  ore.** threads c
1d40: 61 6e 20 62 65 20 69 6e 20 74 68 69 73 20 72 6f  an be in this ro
1d50: 75 74 69 6e 65 20 61 74 20 74 68 65 20 73 61 6d  utine at the sam
1d60: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e time..*/.stati
1d70: 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 35 4d  c void *memsys5M
1d80: 61 6c 6c 6f 63 55 6e 73 61 66 65 28 69 6e 74 20  allocUnsafe(int 
1d90: 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 69 3b  nByte){.  int i;
1da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1db0: 64 65 78 20 6f 66 20 61 20 6d 65 6d 35 2e 61 50  dex of a mem5.aP
1dc0: 6f 6f 6c 5b 5d 20 73 6c 6f 74 20 2a 2f 0a 20 20  ool[] slot */.  
1dd0: 69 6e 74 20 69 42 69 6e 3b 20 20 20 20 20 20 20  int iBin;       
1de0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 6d   /* Index into m
1df0: 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 5d  em5.aiFreelist[]
1e00: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 75 6c 6c 53   */.  int iFullS
1e10: 7a 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  z;     /* Size o
1e20: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  f allocation rou
1e30: 6e 64 65 64 20 75 70 20 74 6f 20 70 6f 77 65 72  nded up to power
1e40: 20 6f 66 20 32 20 2a 2f 0a 20 20 69 6e 74 20 69   of 2 */.  int i
1e50: 4c 6f 67 73 69 7a 65 3b 20 20 20 20 2f 2a 20 4c  Logsize;    /* L
1e60: 6f 67 32 20 6f 66 20 69 46 75 6c 6c 53 7a 2f 50  og2 of iFullSz/P
1e70: 4f 57 32 5f 4d 49 4e 20 2a 2f 0a 0a 20 20 2f 2a  OW2_MIN */..  /*
1e80: 20 6e 42 79 74 65 20 6d 75 73 74 20 62 65 20 61   nByte must be a
1e90: 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 61   positive */.  a
1ea0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29  ssert( nByte>0 )
1eb0: 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 72 61  ;..  /* Keep tra
1ec0: 63 6b 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75  ck of the maximu
1ed0: 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 65 71  m allocation req
1ee0: 75 65 73 74 2e 20 20 45 76 65 6e 20 75 6e 66 75  uest.  Even unfu
1ef0: 6c 66 69 6c 6c 65 64 0a 20 20 2a 2a 20 72 65 71  lfilled.  ** req
1f00: 75 65 73 74 73 20 61 72 65 20 63 6f 75 6e 74 65  uests are counte
1f10: 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1f20: 6e 42 79 74 65 3e 6d 65 6d 35 2e 6d 61 78 52 65  nByte>mem5.maxRe
1f30: 71 75 65 73 74 20 29 7b 0a 20 20 20 20 6d 65 6d  quest ){.    mem
1f40: 35 2e 6d 61 78 52 65 71 75 65 73 74 20 3d 20 6e  5.maxRequest = n
1f50: 42 79 74 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Byte;.  }..  /* 
1f60: 41 62 6f 72 74 20 69 66 20 74 68 65 20 72 65 71  Abort if the req
1f70: 75 65 73 74 65 64 20 61 6c 6c 6f 63 61 74 69 6f  uested allocatio
1f80: 6e 20 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  n size is larger
1f90: 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
1fa0: 74 0a 20 20 2a 2a 20 70 6f 77 65 72 20 6f 66 20  t.  ** power of 
1fb0: 74 77 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20  two that we can 
1fc0: 72 65 70 72 65 73 65 6e 74 20 75 73 69 6e 67 20  represent using 
1fd0: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
1fe0: 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  tegers..  */.  i
1ff0: 66 28 20 6e 42 79 74 65 20 3e 20 30 78 34 30 30  f( nByte > 0x400
2000: 30 30 30 30 30 20 29 7b 0a 20 20 20 20 72 65 74  00000 ){.    ret
2010: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
2020: 20 52 6f 75 6e 64 20 6e 42 79 74 65 20 75 70 20   Round nByte up 
2030: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
2040: 64 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 2a  d power of two *
2050: 2f 0a 20 20 66 6f 72 28 69 46 75 6c 6c 53 7a 3d  /.  for(iFullSz=
2060: 6d 65 6d 35 2e 73 7a 41 74 6f 6d 2c 20 69 4c 6f  mem5.szAtom, iLo
2070: 67 73 69 7a 65 3d 30 3b 20 69 46 75 6c 6c 53 7a  gsize=0; iFullSz
2080: 3c 6e 42 79 74 65 3b 20 69 46 75 6c 6c 53 7a 20  <nByte; iFullSz 
2090: 2a 3d 20 32 2c 20 69 4c 6f 67 73 69 7a 65 2b 2b  *= 2, iLogsize++
20a0: 29 7b 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ){}..  /* Make s
20b0: 75 72 65 20 6d 65 6d 35 2e 61 69 46 72 65 65 6c  ure mem5.aiFreel
20c0: 69 73 74 5b 69 4c 6f 67 73 69 7a 65 5d 20 63 6f  ist[iLogsize] co
20d0: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
20e0: 6f 6e 65 20 66 72 65 65 0a 20 20 2a 2a 20 62 6c  one free.  ** bl
20f0: 6f 63 6b 2e 20 20 49 66 20 6e 6f 74 2c 20 74 68  ock.  If not, th
2100: 65 6e 20 73 70 6c 69 74 20 61 20 62 6c 6f 63 6b  en split a block
2110: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6c 61 72   of the next lar
2120: 67 65 72 20 70 6f 77 65 72 20 6f 66 0a 20 20 2a  ger power of.  *
2130: 2a 20 74 77 6f 20 69 6e 20 6f 72 64 65 72 20 74  * two in order t
2140: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
2150: 72 65 65 20 62 6c 6f 63 6b 20 6f 66 20 73 69 7a  ree block of siz
2160: 65 20 69 4c 6f 67 73 69 7a 65 2e 0a 20 20 2a 2f  e iLogsize..  */
2170: 0a 20 20 66 6f 72 28 69 42 69 6e 3d 69 4c 6f 67  .  for(iBin=iLog
2180: 73 69 7a 65 3b 20 6d 65 6d 35 2e 61 69 46 72 65  size; mem5.aiFre
2190: 65 6c 69 73 74 5b 69 42 69 6e 5d 3c 30 20 26 26  elist[iBin]<0 &&
21a0: 20 69 42 69 6e 3c 3d 4c 4f 47 4d 41 58 3b 20 69   iBin<=LOGMAX; i
21b0: 42 69 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 69  Bin++){}.  if( i
21c0: 42 69 6e 3e 4c 4f 47 4d 41 58 20 29 7b 0a 20 20  Bin>LOGMAX ){.  
21d0: 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
21e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
21f0: 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20 73  xLog!=0 );.    s
2200: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
2210: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
2220: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 25 75 20   to allocate %u 
2230: 62 79 74 65 73 22 2c 20 6e 42 79 74 65 29 3b 0a  bytes", nByte);.
2240: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2250: 7d 0a 20 20 69 20 3d 20 6d 65 6d 73 79 73 35 55  }.  i = memsys5U
2260: 6e 6c 69 6e 6b 46 69 72 73 74 28 69 42 69 6e 29  nlinkFirst(iBin)
2270: 3b 0a 20 20 77 68 69 6c 65 28 20 69 42 69 6e 3e  ;.  while( iBin>
2280: 69 4c 6f 67 73 69 7a 65 20 29 7b 0a 20 20 20 20  iLogsize ){.    
2290: 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 0a 20 20  int newSize;..  
22a0: 20 20 69 42 69 6e 2d 2d 3b 0a 20 20 20 20 6e 65    iBin--;.    ne
22b0: 77 53 69 7a 65 20 3d 20 31 20 3c 3c 20 69 42 69  wSize = 1 << iBi
22c0: 6e 3b 0a 20 20 20 20 6d 65 6d 35 2e 61 43 74 72  n;.    mem5.aCtr
22d0: 6c 5b 69 2b 6e 65 77 53 69 7a 65 5d 20 3d 20 43  l[i+newSize] = C
22e0: 54 52 4c 5f 46 52 45 45 20 7c 20 69 42 69 6e 3b  TRL_FREE | iBin;
22f0: 0a 20 20 20 20 6d 65 6d 73 79 73 35 4c 69 6e 6b  .    memsys5Link
2300: 28 69 2b 6e 65 77 53 69 7a 65 2c 20 69 42 69 6e  (i+newSize, iBin
2310: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 35 2e 61 43  );.  }.  mem5.aC
2320: 74 72 6c 5b 69 5d 20 3d 20 69 4c 6f 67 73 69 7a  trl[i] = iLogsiz
2330: 65 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  e;..  /* Update 
2340: 61 6c 6c 6f 63 61 74 6f 72 20 70 65 72 66 6f 72  allocator perfor
2350: 6d 61 6e 63 65 20 73 74 61 74 69 73 74 69 63 73  mance statistics
2360: 2e 20 2a 2f 0a 20 20 6d 65 6d 35 2e 6e 41 6c 6c  . */.  mem5.nAll
2370: 6f 63 2b 2b 3b 0a 20 20 6d 65 6d 35 2e 74 6f 74  oc++;.  mem5.tot
2380: 61 6c 41 6c 6c 6f 63 20 2b 3d 20 69 46 75 6c 6c  alAlloc += iFull
2390: 53 7a 3b 0a 20 20 6d 65 6d 35 2e 74 6f 74 61 6c  Sz;.  mem5.total
23a0: 45 78 63 65 73 73 20 2b 3d 20 69 46 75 6c 6c 53  Excess += iFullS
23b0: 7a 20 2d 20 6e 42 79 74 65 3b 0a 20 20 6d 65 6d  z - nByte;.  mem
23c0: 35 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 2b 2b  5.currentCount++
23d0: 3b 0a 20 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74  ;.  mem5.current
23e0: 4f 75 74 20 2b 3d 20 69 46 75 6c 6c 53 7a 3b 0a  Out += iFullSz;.
23f0: 20 20 69 66 28 20 6d 65 6d 35 2e 6d 61 78 43 6f    if( mem5.maxCo
2400: 75 6e 74 3c 6d 65 6d 35 2e 63 75 72 72 65 6e 74  unt<mem5.current
2410: 43 6f 75 6e 74 20 29 20 6d 65 6d 35 2e 6d 61 78  Count ) mem5.max
2420: 43 6f 75 6e 74 20 3d 20 6d 65 6d 35 2e 63 75 72  Count = mem5.cur
2430: 72 65 6e 74 43 6f 75 6e 74 3b 0a 20 20 69 66 28  rentCount;.  if(
2440: 20 6d 65 6d 35 2e 6d 61 78 4f 75 74 3c 6d 65 6d   mem5.maxOut<mem
2450: 35 2e 63 75 72 72 65 6e 74 4f 75 74 20 29 20 6d  5.currentOut ) m
2460: 65 6d 35 2e 6d 61 78 4f 75 74 20 3d 20 6d 65 6d  em5.maxOut = mem
2470: 35 2e 63 75 72 72 65 6e 74 4f 75 74 3b 0a 0a 20  5.currentOut;.. 
2480: 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
2490: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
24a0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20 2a 2f  cated memory. */
24b0: 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
24c0: 29 26 6d 65 6d 35 2e 7a 50 6f 6f 6c 5b 69 2a 6d  )&mem5.zPool[i*m
24d0: 65 6d 35 2e 73 7a 41 74 6f 6d 5d 3b 0a 7d 0a 0a  em5.szAtom];.}..
24e0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 6f 75  /*.** Free an ou
24f0: 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79  tstanding memory
2500: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   allocation..*/.
2510: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73  static void mems
2520: 79 73 35 46 72 65 65 55 6e 73 61 66 65 28 76 6f  ys5FreeUnsafe(vo
2530: 69 64 20 2a 70 4f 6c 64 29 7b 0a 20 20 75 33 32  id *pOld){.  u32
2540: 20 73 69 7a 65 2c 20 69 4c 6f 67 73 69 7a 65 3b   size, iLogsize;
2550: 0a 20 20 69 6e 74 20 69 42 6c 6f 63 6b 3b 0a 0a  .  int iBlock;..
2560: 20 20 2f 2a 20 53 65 74 20 69 42 6c 6f 63 6b 20    /* Set iBlock 
2570: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2580: 74 68 65 20 62 6c 6f 63 6b 20 70 6f 69 6e 74 65  the block pointe
2590: 64 20 74 6f 20 62 79 20 70 4f 6c 64 20 69 6e 20  d to by pOld in 
25a0: 0a 20 20 2a 2a 20 74 68 65 20 61 72 72 61 79 20  .  ** the array 
25b0: 6f 66 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 62  of mem5.szAtom b
25c0: 79 74 65 20 62 6c 6f 63 6b 73 20 70 6f 69 6e 74  yte blocks point
25d0: 65 64 20 74 6f 20 62 79 20 6d 65 6d 35 2e 7a 50  ed to by mem5.zP
25e0: 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 42 6c 6f  ool..  */.  iBlo
25f0: 63 6b 20 3d 20 28 28 75 38 20 2a 29 70 4f 6c 64  ck = ((u8 *)pOld
2600: 2d 6d 65 6d 35 2e 7a 50 6f 6f 6c 29 2f 6d 65 6d  -mem5.zPool)/mem
2610: 35 2e 73 7a 41 74 6f 6d 3b 0a 0a 20 20 2f 2a 20  5.szAtom;..  /* 
2620: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2630: 6f 69 6e 74 65 72 20 70 4f 6c 64 20 70 6f 69 6e  ointer pOld poin
2640: 74 73 20 74 6f 20 61 20 76 61 6c 69 64 2c 20 6e  ts to a valid, n
2650: 6f 6e 2d 66 72 65 65 20 62 6c 6f 63 6b 2e 20 2a  on-free block. *
2660: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 42 6c 6f  /.  assert( iBlo
2670: 63 6b 3e 3d 30 20 26 26 20 69 42 6c 6f 63 6b 3c  ck>=0 && iBlock<
2680: 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 3b 0a 20  mem5.nBlock );. 
2690: 20 61 73 73 65 72 74 28 20 28 28 75 38 20 2a 29   assert( ((u8 *)
26a0: 70 4f 6c 64 2d 6d 65 6d 35 2e 7a 50 6f 6f 6c 29  pOld-mem5.zPool)
26b0: 25 6d 65 6d 35 2e 73 7a 41 74 6f 6d 3d 3d 30 20  %mem5.szAtom==0 
26c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6d 65  );.  assert( (me
26d0: 6d 35 2e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d  m5.aCtrl[iBlock]
26e0: 20 26 20 43 54 52 4c 5f 46 52 45 45 29 3d 3d 30   & CTRL_FREE)==0
26f0: 20 29 3b 0a 0a 20 20 69 4c 6f 67 73 69 7a 65 20   );..  iLogsize 
2700: 3d 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42 6c  = mem5.aCtrl[iBl
2710: 6f 63 6b 5d 20 26 20 43 54 52 4c 5f 4c 4f 47 53  ock] & CTRL_LOGS
2720: 49 5a 45 3b 0a 20 20 73 69 7a 65 20 3d 20 31 3c  IZE;.  size = 1<
2730: 3c 69 4c 6f 67 73 69 7a 65 3b 0a 20 20 61 73 73  <iLogsize;.  ass
2740: 65 72 74 28 20 69 42 6c 6f 63 6b 2b 73 69 7a 65  ert( iBlock+size
2750: 2d 31 3c 28 75 33 32 29 6d 65 6d 35 2e 6e 42 6c  -1<(u32)mem5.nBl
2760: 6f 63 6b 20 29 3b 0a 0a 20 20 6d 65 6d 35 2e 61  ock );..  mem5.a
2770: 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 7c 3d 20  Ctrl[iBlock] |= 
2780: 43 54 52 4c 5f 46 52 45 45 3b 0a 20 20 6d 65 6d  CTRL_FREE;.  mem
2790: 35 2e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 2b 73  5.aCtrl[iBlock+s
27a0: 69 7a 65 2d 31 5d 20 7c 3d 20 43 54 52 4c 5f 46  ize-1] |= CTRL_F
27b0: 52 45 45 3b 0a 20 20 61 73 73 65 72 74 28 20 6d  REE;.  assert( m
27c0: 65 6d 35 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74  em5.currentCount
27d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
27e0: 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 3e  mem5.currentOut>
27f0: 3d 28 73 69 7a 65 2a 6d 65 6d 35 2e 73 7a 41 74  =(size*mem5.szAt
2800: 6f 6d 29 20 29 3b 0a 20 20 6d 65 6d 35 2e 63 75  om) );.  mem5.cu
2810: 72 72 65 6e 74 43 6f 75 6e 74 2d 2d 3b 0a 20 20  rrentCount--;.  
2820: 6d 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 20  mem5.currentOut 
2830: 2d 3d 20 73 69 7a 65 2a 6d 65 6d 35 2e 73 7a 41  -= size*mem5.szA
2840: 74 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 6d  tom;.  assert( m
2850: 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 3e 30  em5.currentOut>0
2860: 20 7c 7c 20 6d 65 6d 35 2e 63 75 72 72 65 6e 74   || mem5.current
2870: 43 6f 75 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  Count==0 );.  as
2880: 73 65 72 74 28 20 6d 65 6d 35 2e 63 75 72 72 65  sert( mem5.curre
2890: 6e 74 43 6f 75 6e 74 3e 30 20 7c 7c 20 6d 65 6d  ntCount>0 || mem
28a0: 35 2e 63 75 72 72 65 6e 74 4f 75 74 3d 3d 30 20  5.currentOut==0 
28b0: 29 3b 0a 0a 20 20 6d 65 6d 35 2e 61 43 74 72 6c  );..  mem5.aCtrl
28c0: 5b 69 42 6c 6f 63 6b 5d 20 3d 20 43 54 52 4c 5f  [iBlock] = CTRL_
28d0: 46 52 45 45 20 7c 20 69 4c 6f 67 73 69 7a 65 3b  FREE | iLogsize;
28e0: 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53  .  while( ALWAYS
28f0: 28 69 4c 6f 67 73 69 7a 65 3c 4c 4f 47 4d 41 58  (iLogsize<LOGMAX
2900: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 42 75  ) ){.    int iBu
2910: 64 64 79 3b 0a 20 20 20 20 69 66 28 20 28 69 42  ddy;.    if( (iB
2920: 6c 6f 63 6b 3e 3e 69 4c 6f 67 73 69 7a 65 29 20  lock>>iLogsize) 
2930: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 69 42 75  & 1 ){.      iBu
2940: 64 64 79 20 3d 20 69 42 6c 6f 63 6b 20 2d 20 73  ddy = iBlock - s
2950: 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
2960: 20 20 20 20 20 20 69 42 75 64 64 79 20 3d 20 69        iBuddy = i
2970: 42 6c 6f 63 6b 20 2b 20 73 69 7a 65 3b 0a 20 20  Block + size;.  
2980: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2990: 69 42 75 64 64 79 3e 3d 30 20 29 3b 0a 20 20 20  iBuddy>=0 );.   
29a0: 20 69 66 28 20 28 69 42 75 64 64 79 2b 28 31 3c   if( (iBuddy+(1<
29b0: 3c 69 4c 6f 67 73 69 7a 65 29 29 3e 6d 65 6d 35  <iLogsize))>mem5
29c0: 2e 6e 42 6c 6f 63 6b 20 29 20 62 72 65 61 6b 3b  .nBlock ) break;
29d0: 0a 20 20 20 20 69 66 28 20 6d 65 6d 35 2e 61 43  .    if( mem5.aC
29e0: 74 72 6c 5b 69 42 75 64 64 79 5d 21 3d 28 43 54  trl[iBuddy]!=(CT
29f0: 52 4c 5f 46 52 45 45 20 7c 20 69 4c 6f 67 73 69  RL_FREE | iLogsi
2a00: 7a 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ze) ) break;.   
2a10: 20 6d 65 6d 73 79 73 35 55 6e 6c 69 6e 6b 28 69   memsys5Unlink(i
2a20: 42 75 64 64 79 2c 20 69 4c 6f 67 73 69 7a 65 29  Buddy, iLogsize)
2a30: 3b 0a 20 20 20 20 69 4c 6f 67 73 69 7a 65 2b 2b  ;.    iLogsize++
2a40: 3b 0a 20 20 20 20 69 66 28 20 69 42 75 64 64 79  ;.    if( iBuddy
2a50: 3c 69 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  <iBlock ){.     
2a60: 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42 75 64   mem5.aCtrl[iBud
2a70: 64 79 5d 20 3d 20 43 54 52 4c 5f 46 52 45 45 20  dy] = CTRL_FREE 
2a80: 7c 20 69 4c 6f 67 73 69 7a 65 3b 0a 20 20 20 20  | iLogsize;.    
2a90: 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42 6c    mem5.aCtrl[iBl
2aa0: 6f 63 6b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ock] = 0;.      
2ab0: 69 42 6c 6f 63 6b 20 3d 20 69 42 75 64 64 79 3b  iBlock = iBuddy;
2ac0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ad0: 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42 6c    mem5.aCtrl[iBl
2ae0: 6f 63 6b 5d 20 3d 20 43 54 52 4c 5f 46 52 45 45  ock] = CTRL_FREE
2af0: 20 7c 20 69 4c 6f 67 73 69 7a 65 3b 0a 20 20 20   | iLogsize;.   
2b00: 20 20 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 69 42     mem5.aCtrl[iB
2b10: 75 64 64 79 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  uddy] = 0;.    }
2b20: 0a 20 20 20 20 73 69 7a 65 20 2a 3d 20 32 3b 0a  .    size *= 2;.
2b30: 20 20 7d 0a 20 20 6d 65 6d 73 79 73 35 4c 69 6e    }.  memsys5Lin
2b40: 6b 28 69 42 6c 6f 63 6b 2c 20 69 4c 6f 67 73 69  k(iBlock, iLogsi
2b50: 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ze);.}../*.** Al
2b60: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
2b70: 20 6d 65 6d 6f 72 79 0a 2a 2f 0a 73 74 61 74 69   memory.*/.stati
2b80: 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73 35 4d  c void *memsys5M
2b90: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
2ba0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
2bb0: 36 34 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28  64 *p = 0;.  if(
2bc0: 20 6e 42 79 74 65 73 3e 30 20 29 7b 0a 20 20 20   nBytes>0 ){.   
2bd0: 20 6d 65 6d 73 79 73 35 45 6e 74 65 72 28 29 3b   memsys5Enter();
2be0: 0a 20 20 20 20 70 20 3d 20 6d 65 6d 73 79 73 35  .    p = memsys5
2bf0: 4d 61 6c 6c 6f 63 55 6e 73 61 66 65 28 6e 42 79  MallocUnsafe(nBy
2c00: 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 73 79 73  tes);.    memsys
2c10: 35 4c 65 61 76 65 28 29 3b 0a 20 20 7d 0a 20 20  5Leave();.  }.  
2c20: 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b  return (void*)p;
2c30: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20   .}../*.** Free 
2c40: 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
2c50: 65 20 6f 75 74 65 72 20 6c 61 79 65 72 20 6d 65  e outer layer me
2c60: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 70  mory allocator p
2c70: 72 65 76 65 6e 74 73 20 74 68 69 73 20 72 6f 75  revents this rou
2c80: 74 69 6e 65 20 66 72 6f 6d 0a 2a 2a 20 62 65 69  tine from.** bei
2c90: 6e 67 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  ng called with p
2ca0: 50 72 69 6f 72 3d 3d 30 2e 0a 2a 2f 0a 73 74 61  Prior==0..*/.sta
2cb0: 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 35  tic void memsys5
2cc0: 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f  Free(void *pPrio
2cd0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r){.  assert( pP
2ce0: 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  rior!=0 );.  mem
2cf0: 73 79 73 35 45 6e 74 65 72 28 29 3b 0a 20 20 6d  sys5Enter();.  m
2d00: 65 6d 73 79 73 35 46 72 65 65 55 6e 73 61 66 65  emsys5FreeUnsafe
2d10: 28 70 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d 73  (pPrior);.  mems
2d20: 79 73 35 4c 65 61 76 65 28 29 3b 20 20 0a 7d 0a  ys5Leave();  .}.
2d30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2d40: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
2d50: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
2d60: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
2d70: 68 65 20 6f 75 74 65 72 20 6c 61 79 65 72 20 6d  he outer layer m
2d80: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20  emory allocator 
2d90: 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 72 6f  prevents this ro
2da0: 75 74 69 6e 65 20 66 72 6f 6d 0a 2a 2a 20 62 65  utine from.** be
2db0: 69 6e 67 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ing called with 
2dc0: 70 50 72 69 6f 72 3d 3d 30 2e 20 20 0a 2a 2a 0a  pPrior==0.  .**.
2dd0: 2a 2a 20 6e 42 79 74 65 73 20 69 73 20 61 6c 77  ** nBytes is alw
2de0: 61 79 73 20 61 20 76 61 6c 75 65 20 6f 62 74 61  ays a value obta
2df0: 69 6e 65 64 20 66 72 6f 6d 20 61 20 70 72 69 6f  ined from a prio
2e00: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 6d 65 6d  r call to.** mem
2e10: 73 79 73 35 52 6f 75 6e 64 28 29 2e 20 20 48 65  sys5Round().  He
2e20: 6e 63 65 20 6e 42 79 74 65 73 20 69 73 20 61 6c  nce nBytes is al
2e30: 77 61 79 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  ways a non-negat
2e40: 69 76 65 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20  ive power.** of 
2e50: 74 77 6f 2e 20 20 49 66 20 6e 42 79 74 65 73 3d  two.  If nBytes=
2e60: 3d 30 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  =0 that means th
2e70: 61 74 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 61  at an oversize a
2e80: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 28 61 6e  llocation.** (an
2e90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6c 61 72 67   allocation larg
2ea0: 65 72 20 74 68 61 6e 20 30 78 34 30 30 30 30 30  er than 0x400000
2eb0: 30 30 29 20 77 61 73 20 72 65 71 75 65 73 74 65  00) was requeste
2ec0: 64 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 72 6f  d and this.** ro
2ed0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 72 65 74  utine should ret
2ee0: 75 72 6e 20 30 20 77 69 74 68 6f 75 74 20 66 72  urn 0 without fr
2ef0: 65 65 69 6e 67 20 70 50 72 69 6f 72 2e 0a 2a 2f  eeing pPrior..*/
2f00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65  .static void *me
2f10: 6d 73 79 73 35 52 65 61 6c 6c 6f 63 28 76 6f 69  msys5Realloc(voi
2f20: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
2f30: 42 79 74 65 73 29 7b 0a 20 20 69 6e 74 20 6e 4f  Bytes){.  int nO
2f40: 6c 64 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  ld;.  void *p;. 
2f50: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 21   assert( pPrior!
2f60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2f70: 28 6e 42 79 74 65 73 26 28 6e 42 79 74 65 73 2d  (nBytes&(nBytes-
2f80: 31 29 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 56  1))==0 );  /* EV
2f90: 3a 20 52 2d 34 36 31 39 39 2d 33 30 32 34 39 20  : R-46199-30249 
2fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  */.  assert( nBy
2fb0: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  tes>=0 );.  if( 
2fc0: 6e 42 79 74 65 73 3d 3d 30 20 29 7b 0a 20 20 20  nBytes==0 ){.   
2fd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2fe0: 20 6e 4f 6c 64 20 3d 20 6d 65 6d 73 79 73 35 53   nOld = memsys5S
2ff0: 69 7a 65 28 70 50 72 69 6f 72 29 3b 0a 20 20 69  ize(pPrior);.  i
3000: 66 28 20 6e 42 79 74 65 73 3c 3d 6e 4f 6c 64 20  f( nBytes<=nOld 
3010: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
3020: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  rior;.  }.  mems
3030: 79 73 35 45 6e 74 65 72 28 29 3b 0a 20 20 70 20  ys5Enter();.  p 
3040: 3d 20 6d 65 6d 73 79 73 35 4d 61 6c 6c 6f 63 55  = memsys5MallocU
3050: 6e 73 61 66 65 28 6e 42 79 74 65 73 29 3b 0a 20  nsafe(nBytes);. 
3060: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6d 65   if( p ){.    me
3070: 6d 63 70 79 28 70 2c 20 70 50 72 69 6f 72 2c 20  mcpy(p, pPrior, 
3080: 6e 4f 6c 64 29 3b 0a 20 20 20 20 6d 65 6d 73 79  nOld);.    memsy
3090: 73 35 46 72 65 65 55 6e 73 61 66 65 28 70 50 72  s5FreeUnsafe(pPr
30a0: 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  ior);.  }.  mems
30b0: 79 73 35 4c 65 61 76 65 28 29 3b 0a 20 20 72 65  ys5Leave();.  re
30c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
30d0: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
30e0: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
30f0: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
3100: 61 74 69 6f 6e 20 73 69 7a 65 2e 20 20 49 66 0a  ation size.  If.
3110: 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ** the allocatio
3120: 6e 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  n is too large t
3130: 6f 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  o be handled by 
3140: 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
3150: 73 79 73 74 65 6d 2c 0a 2a 2a 20 72 65 74 75 72  system,.** retur
3160: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 61  n 0..**.** All a
3170: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 75 73 74 20  llocations must 
3180: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
3190: 6f 20 61 6e 64 20 6d 75 73 74 20 62 65 20 65 78  o and must be ex
31a0: 70 72 65 73 73 65 64 20 62 79 20 61 0a 2a 2a 20  pressed by a.** 
31b0: 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  32-bit signed in
31c0: 74 65 67 65 72 2e 20 20 48 65 6e 63 65 20 74 68  teger.  Hence th
31d0: 65 20 6c 61 72 67 65 73 74 20 61 6c 6c 6f 63 61  e largest alloca
31e0: 74 69 6f 6e 20 69 73 20 30 78 34 30 30 30 30 30  tion is 0x400000
31f0: 30 30 0a 2a 2a 20 6f 72 20 31 30 37 33 37 34 31  00.** or 1073741
3200: 38 32 34 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  824 bytes..*/.st
3210: 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 35  atic int memsys5
3220: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
3230: 20 20 69 6e 74 20 69 46 75 6c 6c 53 7a 3b 0a 20    int iFullSz;. 
3240: 20 69 66 28 20 6e 20 3e 20 30 78 34 30 30 30 30   if( n > 0x40000
3250: 30 30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  000 ) return 0;.
3260: 20 20 66 6f 72 28 69 46 75 6c 6c 53 7a 3d 6d 65    for(iFullSz=me
3270: 6d 35 2e 73 7a 41 74 6f 6d 3b 20 69 46 75 6c 6c  m5.szAtom; iFull
3280: 53 7a 3c 6e 3b 20 69 46 75 6c 6c 53 7a 20 2a 3d  Sz<n; iFullSz *=
3290: 20 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 46   2);.  return iF
32a0: 75 6c 6c 53 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ullSz;.}../*.** 
32b0: 52 65 74 75 72 6e 20 74 68 65 20 63 65 69 6c 69  Return the ceili
32c0: 6e 67 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69  ng of the logari
32d0: 74 68 6d 20 62 61 73 65 20 32 20 6f 66 20 69 56  thm base 2 of iV
32e0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  alue..**.** Exam
32f0: 70 6c 65 73 3a 20 20 20 6d 65 6d 73 79 73 35 4c  ples:   memsys5L
3300: 6f 67 28 31 29 20 2d 3e 20 30 0a 2a 2a 20 20 20  og(1) -> 0.**   
3310: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 79 73            memsys
3320: 35 4c 6f 67 28 32 29 20 2d 3e 20 31 0a 2a 2a 20  5Log(2) -> 1.** 
3330: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73              mems
3340: 79 73 35 4c 6f 67 28 34 29 20 2d 3e 20 32 0a 2a  ys5Log(4) -> 2.*
3350: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  *             me
3360: 6d 73 79 73 35 4c 6f 67 28 35 29 20 2d 3e 20 33  msys5Log(5) -> 3
3370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
3380: 6d 65 6d 73 79 73 35 4c 6f 67 28 38 29 20 2d 3e  memsys5Log(8) ->
3390: 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   3.**           
33a0: 20 20 6d 65 6d 73 79 73 35 4c 6f 67 28 39 29 20    memsys5Log(9) 
33b0: 2d 3e 20 34 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -> 4.*/.static i
33c0: 6e 74 20 6d 65 6d 73 79 73 35 4c 6f 67 28 69 6e  nt memsys5Log(in
33d0: 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74  t iValue){.  int
33e0: 20 69 4c 6f 67 3b 0a 20 20 66 6f 72 28 69 4c 6f   iLog;.  for(iLo
33f0: 67 3d 30 3b 20 28 31 3c 3c 69 4c 6f 67 29 3c 69  g=0; (1<<iLog)<i
3400: 56 61 6c 75 65 3b 20 69 4c 6f 67 2b 2b 29 3b 0a  Value; iLog++);.
3410: 20 20 72 65 74 75 72 6e 20 69 4c 6f 67 3b 0a 7d    return iLog;.}
3420: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
3430: 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ze the memory al
3440: 6c 6f 63 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  locator..**.** T
3450: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
3460: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
3470: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
3480: 62 65 20 68 6f 6c 64 69 6e 67 20 61 20 6d 75 74  be holding a mut
3490: 65 78 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ex.** to prevent
34a0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
34b0: 73 20 66 72 6f 6d 20 65 6e 74 65 72 69 6e 67 20  s from entering 
34c0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
34d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34e0: 6d 65 6d 73 79 73 35 49 6e 69 74 28 76 6f 69 64  memsys5Init(void
34f0: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e   *NotUsed){.  in
3500: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
3510: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
3520: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3540: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
3550: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
3560: 74 6f 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 6f  to this allocato
3570: 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 42 79 74 65  r */.  u8 *zByte
3580: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ;         /* Mem
3590: 6f 72 79 20 75 73 61 62 6c 65 20 62 79 20 74 68  ory usable by th
35a0: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 2a 2f 0a  is allocator */.
35b0: 20 20 69 6e 74 20 6e 4d 69 6e 4c 6f 67 3b 20 20    int nMinLog;  
35c0: 20 20 20 20 20 2f 2a 20 4c 6f 67 20 62 61 73 65       /* Log base
35d0: 20 32 20 6f 66 20 6d 69 6e 69 6d 75 6d 20 61 6c   2 of minimum al
35e0: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 69 6e  location size in
35f0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
3600: 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f  iOffset;       /
3610: 2a 20 41 6e 20 6f 66 66 73 65 74 20 69 6e 74 6f  * An offset into
3620: 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 5d 20 2a 2f   mem5.aCtrl[] */
3630: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
3640: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a  ETER(NotUsed);..
3650: 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 70 75 72    /* For the pur
3660: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
3670: 75 74 69 6e 65 2c 20 64 69 73 61 62 6c 65 20 74  utine, disable t
3680: 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 6d 65  he mutex */.  me
3690: 6d 35 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 0a 20  m5.mutex = 0;.. 
36a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
36b0: 61 20 4d 65 6d 35 4c 69 6e 6b 20 6f 62 6a 65 63  a Mem5Link objec
36c0: 74 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  t must be a powe
36d0: 72 20 6f 66 20 74 77 6f 2e 20 20 56 65 72 69 66  r of two.  Verif
36e0: 79 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 69 73  y that.  ** this
36f0: 20 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20   is case..  */. 
3700: 20 61 73 73 65 72 74 28 20 28 73 69 7a 65 6f 66   assert( (sizeof
3710: 28 4d 65 6d 35 4c 69 6e 6b 29 26 28 73 69 7a 65  (Mem5Link)&(size
3720: 6f 66 28 4d 65 6d 35 4c 69 6e 6b 29 2d 31 29 29  of(Mem5Link)-1))
3730: 3d 3d 30 20 29 3b 0a 0a 20 20 6e 42 79 74 65 20  ==0 );..  nByte 
3740: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3750: 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 7a  onfig.nHeap;.  z
3760: 42 79 74 65 20 3d 20 28 75 38 2a 29 73 71 6c 69  Byte = (u8*)sqli
3770: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3780: 70 48 65 61 70 3b 0a 20 20 61 73 73 65 72 74 28  pHeap;.  assert(
3790: 20 7a 42 79 74 65 21 3d 30 20 29 3b 20 20 2f 2a   zByte!=0 );  /*
37a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
37b0: 29 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  ) does not allow
37c0: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 0a 20   otherwise */.. 
37d0: 20 6e 4d 69 6e 4c 6f 67 20 3d 20 6d 65 6d 73 79   nMinLog = memsy
37e0: 73 35 4c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f  s5Log(sqlite3Glo
37f0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 29  balConfig.mnReq)
3800: 3b 0a 20 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20  ;.  mem5.szAtom 
3810: 3d 20 28 31 3c 3c 6e 4d 69 6e 4c 6f 67 29 3b 0a  = (1<<nMinLog);.
3820: 20 20 77 68 69 6c 65 28 20 28 69 6e 74 29 73 69    while( (int)si
3830: 7a 65 6f 66 28 4d 65 6d 35 4c 69 6e 6b 29 3e 6d  zeof(Mem5Link)>m
3840: 65 6d 35 2e 73 7a 41 74 6f 6d 20 29 7b 0a 20 20  em5.szAtom ){.  
3850: 20 20 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3d 20    mem5.szAtom = 
3860: 6d 65 6d 35 2e 73 7a 41 74 6f 6d 20 3c 3c 20 31  mem5.szAtom << 1
3870: 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 35 2e 6e 42  ;.  }..  mem5.nB
3880: 6c 6f 63 6b 20 3d 20 28 6e 42 79 74 65 20 2f 20  lock = (nByte / 
3890: 28 6d 65 6d 35 2e 73 7a 41 74 6f 6d 2b 73 69 7a  (mem5.szAtom+siz
38a0: 65 6f 66 28 75 38 29 29 29 3b 0a 20 20 6d 65 6d  eof(u8)));.  mem
38b0: 35 2e 7a 50 6f 6f 6c 20 3d 20 7a 42 79 74 65 3b  5.zPool = zByte;
38c0: 0a 20 20 6d 65 6d 35 2e 61 43 74 72 6c 20 3d 20  .  mem5.aCtrl = 
38d0: 28 75 38 20 2a 29 26 6d 65 6d 35 2e 7a 50 6f 6f  (u8 *)&mem5.zPoo
38e0: 6c 5b 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 2a 6d 65  l[mem5.nBlock*me
38f0: 6d 35 2e 73 7a 41 74 6f 6d 5d 3b 0a 0a 20 20 66  m5.szAtom];..  f
3900: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 3d 4c 4f 47  or(ii=0; ii<=LOG
3910: 4d 41 58 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  MAX; ii++){.    
3920: 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b  mem5.aiFreelist[
3930: 69 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  ii] = -1;.  }.. 
3940: 20 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20   iOffset = 0;.  
3950: 66 6f 72 28 69 69 3d 4c 4f 47 4d 41 58 3b 20 69  for(ii=LOGMAX; i
3960: 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  i>=0; ii--){.   
3970: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 28 31   int nAlloc = (1
3980: 3c 3c 69 69 29 3b 0a 20 20 20 20 69 66 28 20 28  <<ii);.    if( (
3990: 69 4f 66 66 73 65 74 2b 6e 41 6c 6c 6f 63 29 3c  iOffset+nAlloc)<
39a0: 3d 6d 65 6d 35 2e 6e 42 6c 6f 63 6b 20 29 7b 0a  =mem5.nBlock ){.
39b0: 20 20 20 20 20 20 6d 65 6d 35 2e 61 43 74 72 6c        mem5.aCtrl
39c0: 5b 69 4f 66 66 73 65 74 5d 20 3d 20 69 69 20 7c  [iOffset] = ii |
39d0: 20 43 54 52 4c 5f 46 52 45 45 3b 0a 20 20 20 20   CTRL_FREE;.    
39e0: 20 20 6d 65 6d 73 79 73 35 4c 69 6e 6b 28 69 4f    memsys5Link(iO
39f0: 66 66 73 65 74 2c 20 69 69 29 3b 0a 20 20 20 20  ffset, ii);.    
3a00: 20 20 69 4f 66 66 73 65 74 20 2b 3d 20 6e 41 6c    iOffset += nAl
3a10: 6c 6f 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  loc;.    }.    a
3a20: 73 73 65 72 74 28 28 69 4f 66 66 73 65 74 2b 6e  ssert((iOffset+n
3a30: 41 6c 6c 6f 63 29 3e 6d 65 6d 35 2e 6e 42 6c 6f  Alloc)>mem5.nBlo
3a40: 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ck);.  }..  /* I
3a50: 66 20 61 20 6d 75 74 65 78 20 69 73 20 72 65 71  f a mutex is req
3a60: 75 69 72 65 64 20 66 6f 72 20 6e 6f 72 6d 61 6c  uired for normal
3a70: 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6c 6c 6f   operation, allo
3a80: 63 61 74 65 20 6f 6e 65 20 2a 2f 0a 20 20 69 66  cate one */.  if
3a90: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3aa0: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 3d 3d  onfig.bMemstat==
3ab0: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 35 2e 6d 75  0 ){.    mem5.mu
3ac0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
3ad0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
3ae0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29  UTEX_STATIC_MEM)
3af0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
3b00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
3b10: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
3b20: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
3b30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
3b40: 73 79 73 35 53 68 75 74 64 6f 77 6e 28 76 6f 69  sys5Shutdown(voi
3b50: 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  d *NotUsed){.  U
3b60: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3b70: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 6d 65 6d 35  NotUsed);.  mem5
3b80: 2e 6d 75 74 65 78 20 3d 20 30 3b 0a 20 20 72 65  .mutex = 0;.  re
3b90: 74 75 72 6e 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  turn;.}..#ifdef 
3ba0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
3bb0: 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
3bc0: 69 6e 64 69 63 61 74 65 64 20 61 6e 64 20 77 72  indicated and wr
3bd0: 69 74 65 20 61 20 6c 6f 67 20 6f 66 20 61 6c 6c  ite a log of all
3be0: 20 75 6e 66 72 65 65 64 20 6d 65 6d 6f 72 79 20   unfreed memory 
3bf0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  .** allocations 
3c00: 69 6e 74 6f 20 74 68 61 74 20 6c 6f 67 2e 0a 2a  into that log..*
3c10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  /.void sqlite3Me
3c20: 6d 73 79 73 35 44 75 6d 70 28 63 6f 6e 73 74 20  msys5Dump(const 
3c30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
3c40: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20  {.  FILE *out;. 
3c50: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
3c60: 69 6e 74 20 6e 4d 69 6e 4c 6f 67 3b 0a 0a 20 20  int nMinLog;..  
3c70: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
3c80: 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
3c90: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75 74 20 3d  ==0 ){.    out =
3ca0: 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65   stdout;.  }else
3cb0: 7b 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65  {.    out = fope
3cc0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 77 22  n(zFilename, "w"
3cd0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d 3d  );.    if( out==
3ce0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
3cf0: 74 66 28 73 74 64 65 72 72 2c 20 22 2a 2a 20 55  tf(stderr, "** U
3d00: 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70 75 74 20  nable to output 
3d10: 6d 65 6d 6f 72 79 20 64 65 62 75 67 20 6f 75 74  memory debug out
3d20: 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a 2a 5c 6e  put log: %s **\n
3d30: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3d40: 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
3d50: 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
3d60: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d  n;.    }.  }.  m
3d70: 65 6d 73 79 73 35 45 6e 74 65 72 28 29 3b 0a 20  emsys5Enter();. 
3d80: 20 6e 4d 69 6e 4c 6f 67 20 3d 20 6d 65 6d 73 79   nMinLog = memsy
3d90: 73 35 4c 6f 67 28 6d 65 6d 35 2e 73 7a 41 74 6f  s5Log(mem5.szAto
3da0: 6d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m);.  for(i=0; i
3db0: 3c 3d 4c 4f 47 4d 41 58 20 26 26 20 69 2b 6e 4d  <=LOGMAX && i+nM
3dc0: 69 6e 4c 6f 67 3c 33 32 3b 20 69 2b 2b 29 7b 0a  inLog<32; i++){.
3dd0: 20 20 20 20 66 6f 72 28 6e 3d 30 2c 20 6a 3d 6d      for(n=0, j=m
3de0: 65 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 69  em5.aiFreelist[i
3df0: 5d 3b 20 6a 3e 3d 30 3b 20 6a 20 3d 20 4d 45 4d  ]; j>=0; j = MEM
3e00: 35 4c 49 4e 4b 28 6a 29 2d 3e 6e 65 78 74 2c 20  5LINK(j)->next, 
3e10: 6e 2b 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69 6e  n++){}.    fprin
3e20: 74 66 28 6f 75 74 2c 20 22 66 72 65 65 6c 69 73  tf(out, "freelis
3e30: 74 20 69 74 65 6d 73 20 6f 66 20 73 69 7a 65 20  t items of size 
3e40: 25 64 3a 20 25 64 5c 6e 22 2c 20 6d 65 6d 35 2e  %d: %d\n", mem5.
3e50: 73 7a 41 74 6f 6d 20 3c 3c 20 69 2c 20 6e 29 3b  szAtom << i, n);
3e60: 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
3e70: 75 74 2c 20 22 6d 65 6d 35 2e 6e 41 6c 6c 6f 63  ut, "mem5.nAlloc
3e80: 20 20 20 20 20 20 20 3d 20 25 6c 6c 75 5c 6e 22         = %llu\n"
3e90: 2c 20 6d 65 6d 35 2e 6e 41 6c 6c 6f 63 29 3b 0a  , mem5.nAlloc);.
3ea0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3eb0: 6d 65 6d 35 2e 74 6f 74 61 6c 41 6c 6c 6f 63 20  mem5.totalAlloc 
3ec0: 20 20 3d 20 25 6c 6c 75 5c 6e 22 2c 20 6d 65 6d    = %llu\n", mem
3ed0: 35 2e 74 6f 74 61 6c 41 6c 6c 6f 63 29 3b 0a 20  5.totalAlloc);. 
3ee0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d   fprintf(out, "m
3ef0: 65 6d 35 2e 74 6f 74 61 6c 45 78 63 65 73 73 20  em5.totalExcess 
3f00: 20 3d 20 25 6c 6c 75 5c 6e 22 2c 20 6d 65 6d 35   = %llu\n", mem5
3f10: 2e 74 6f 74 61 6c 45 78 63 65 73 73 29 3b 0a 20  .totalExcess);. 
3f20: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d   fprintf(out, "m
3f30: 65 6d 35 2e 63 75 72 72 65 6e 74 4f 75 74 20 20  em5.currentOut  
3f40: 20 3d 20 25 75 5c 6e 22 2c 20 6d 65 6d 35 2e 63   = %u\n", mem5.c
3f50: 75 72 72 65 6e 74 4f 75 74 29 3b 0a 20 20 66 70  urrentOut);.  fp
3f60: 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65 6d 35  rintf(out, "mem5
3f70: 2e 63 75 72 72 65 6e 74 43 6f 75 6e 74 20 3d 20  .currentCount = 
3f80: 25 75 5c 6e 22 2c 20 6d 65 6d 35 2e 63 75 72 72  %u\n", mem5.curr
3f90: 65 6e 74 43 6f 75 6e 74 29 3b 0a 20 20 66 70 72  entCount);.  fpr
3fa0: 69 6e 74 66 28 6f 75 74 2c 20 22 6d 65 6d 35 2e  intf(out, "mem5.
3fb0: 6d 61 78 4f 75 74 20 20 20 20 20 20 20 3d 20 25  maxOut       = %
3fc0: 75 5c 6e 22 2c 20 6d 65 6d 35 2e 6d 61 78 4f 75  u\n", mem5.maxOu
3fd0: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  t);.  fprintf(ou
3fe0: 74 2c 20 22 6d 65 6d 35 2e 6d 61 78 43 6f 75 6e  t, "mem5.maxCoun
3ff0: 74 20 20 20 20 20 3d 20 25 75 5c 6e 22 2c 20 6d  t     = %u\n", m
4000: 65 6d 35 2e 6d 61 78 43 6f 75 6e 74 29 3b 0a 20  em5.maxCount);. 
4010: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d   fprintf(out, "m
4020: 65 6d 35 2e 6d 61 78 52 65 71 75 65 73 74 20 20  em5.maxRequest  
4030: 20 3d 20 25 75 5c 6e 22 2c 20 6d 65 6d 35 2e 6d   = %u\n", mem5.m
4040: 61 78 52 65 71 75 65 73 74 29 3b 0a 20 20 6d 65  axRequest);.  me
4050: 6d 73 79 73 35 4c 65 61 76 65 28 29 3b 0a 20 20  msys5Leave();.  
4060: 69 66 28 20 6f 75 74 3d 3d 73 74 64 6f 75 74 20  if( out==stdout 
4070: 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74  ){.    fflush(st
4080: 64 6f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dout);.  }else{.
4090: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
40a0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
40b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
40c0: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 72 6f  e is the only ro
40d0: 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69  utine in this fi
40e0: 6c 65 20 77 69 74 68 20 65 78 74 65 72 6e 61 6c  le with external
40f0: 20 0a 2a 2a 20 6c 69 6e 6b 61 67 65 2e 20 49 74   .** linkage. It
4100: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
4110: 65 72 20 74 6f 20 61 20 73 74 61 74 69 63 20 73  er to a static s
4120: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
4130: 64 73 0a 2a 2a 20 73 74 72 75 63 74 20 70 6f 70  ds.** struct pop
4140: 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
4150: 6d 65 6d 73 79 73 35 20 6d 65 74 68 6f 64 73 2e  memsys5 methods.
4160: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
4170: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
4180: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
4190: 79 73 35 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  ys5(void){.  sta
41a0: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
41b0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 6d 65  3_mem_methods me
41c0: 6d 73 79 73 35 4d 65 74 68 6f 64 73 20 3d 20 7b  msys5Methods = {
41d0: 0a 20 20 20 20 20 6d 65 6d 73 79 73 35 4d 61 6c  .     memsys5Mal
41e0: 6c 6f 63 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73  loc,.     memsys
41f0: 35 46 72 65 65 2c 0a 20 20 20 20 20 6d 65 6d 73  5Free,.     mems
4200: 79 73 35 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20  ys5Realloc,.    
4210: 20 6d 65 6d 73 79 73 35 53 69 7a 65 2c 0a 20 20   memsys5Size,.  
4220: 20 20 20 6d 65 6d 73 79 73 35 52 6f 75 6e 64 75     memsys5Roundu
4230: 70 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 35 49  p,.     memsys5I
4240: 6e 69 74 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73  nit,.     memsys
4250: 35 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 20  5Shutdown,.     
4260: 30 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20  0.  };.  return 
4270: 26 6d 65 6d 73 79 73 35 4d 65 74 68 6f 64 73 3b  &memsys5Methods;
4280: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
4290: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
42a0: 59 53 35 20 2a 2f 0a                             YS5 */.