/ Hex Artifact Content
Login

Artifact 67153ec933e08b70714055e872efb58a6b287939:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4f 63 74 6f 62  /*.** 2007 Octob
0010: 65 72 20 31 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 14.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  implement a memo
01b0: 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ry.** allocation
01c0: 20 73 75 62 73 79 73 74 65 6d 20 66 6f 72 20 75   subsystem for u
01d0: 73 65 20 62 79 20 53 51 4c 69 74 65 2e 20 0a 2a  se by SQLite. .*
01e0: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
01f0: 6e 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  n of the memory 
0200: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 62 73 79  allocation subsy
0210: 73 74 65 6d 20 6f 6d 69 74 73 20 61 6c 6c 0a 2a  stem omits all.*
0220: 2a 20 75 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28  * use of malloc(
0230: 29 2e 20 54 68 65 20 53 51 4c 69 74 65 20 75 73  ). The SQLite us
0240: 65 72 20 73 75 70 70 6c 69 65 73 20 61 20 62 6c  er supplies a bl
0250: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ock of memory.**
0260: 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
0270: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
0280: 7a 65 28 29 20 66 72 6f 6d 20 77 68 69 63 68 20  ze() from which 
0290: 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 2a 2a 20 61  allocations.** a
02a0: 72 65 20 6d 61 64 65 20 61 6e 64 20 72 65 74 75  re made and retu
02b0: 72 6e 65 64 20 62 79 20 74 68 65 20 78 4d 61 6c  rned by the xMal
02c0: 6c 6f 63 28 29 20 61 6e 64 20 78 52 65 61 6c 6c  loc() and xReall
02d0: 6f 63 28 29 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65  oc() .** impleme
02e0: 6e 74 61 74 69 6f 6e 73 2e 20 4f 6e 63 65 20 73  ntations. Once s
02f0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
0300: 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  e() has been cal
0310: 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 61 6d 6f 75  led,.** the amou
0320: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 76 61  nt of memory ava
0330: 69 6c 61 62 6c 65 20 74 6f 20 53 51 4c 69 74 65  ilable to SQLite
0340: 20 69 73 20 66 69 78 65 64 20 61 6e 64 20 63 61   is fixed and ca
0350: 6e 6e 6f 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  nnot.** be chang
0360: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ed..**.** This v
0370: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6d 65  ersion of the me
0380: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
0390: 73 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 63  subsystem is inc
03a0: 6c 75 64 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  luded.** in the 
03b0: 62 75 69 6c 64 20 6f 6e 6c 79 20 69 66 20 53 51  build only if SQ
03c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
03d0: 59 53 33 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  YS3 is defined..
03e0: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 6d 65 6d 33 2e  **.** $Id: mem3.
03f0: 63 2c 76 20 31 2e 32 35 20 32 30 30 38 2f 31 31  c,v 1.25 2008/11
0400: 2f 31 39 20 31 36 3a 35 32 3a 34 34 20 64 61 6e  /19 16:52:44 dan
0410: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
0420: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0430: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0440: 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
0450: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
0460: 61 74 6f 72 20 69 73 20 6f 6e 6c 79 20 62 75 69  ator is only bui
0470: 6c 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  lt into the libr
0480: 61 72 79 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e  ary.** SQLITE_EN
0490: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 69 73 20  ABLE_MEMSYS3 is 
04a0: 64 65 66 69 6e 65 64 2e 20 44 65 66 69 6e 69 6e  defined. Definin
04b0: 67 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 64 6f  g this symbol do
04c0: 65 73 20 6e 6f 74 0a 2a 2a 20 6d 65 61 6e 20 74  es not.** mean t
04d0: 68 61 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  hat the library 
04e0: 77 69 6c 6c 20 75 73 65 20 61 20 6d 65 6d 6f 72  will use a memor
04f0: 79 2d 70 6f 6f 6c 20 62 79 20 64 65 66 61 75 6c  y-pool by defaul
0500: 74 2c 20 6a 75 73 74 20 74 68 61 74 0a 2a 2a 20  t, just that.** 
0510: 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
0520: 20 54 68 65 20 6d 65 6d 70 6f 6f 6c 20 61 6c 6c   The mempool all
0530: 6f 63 61 74 6f 72 20 69 73 20 61 63 74 69 76 61  ocator is activa
0540: 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a  ted by calling.*
0550: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
0560: 28 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ()..*/.#ifdef SQ
0570: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
0580: 59 53 33 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  YS3../*.** Maxim
0590: 75 6d 20 73 69 7a 65 20 28 69 6e 20 4d 65 6d 33  um size (in Mem3
05a0: 42 6c 6f 63 6b 73 29 20 6f 66 20 61 20 22 73 6d  Blocks) of a "sm
05b0: 61 6c 6c 22 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 23  all" chunk..*/.#
05c0: 64 65 66 69 6e 65 20 4d 58 5f 53 4d 41 4c 4c 20  define MX_SMALL 
05d0: 31 30 0a 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65  10.../*.** Numbe
05e0: 72 20 6f 66 20 66 72 65 65 6c 69 73 74 20 68 61  r of freelist ha
05f0: 73 68 20 73 6c 6f 74 73 0a 2a 2f 0a 23 64 65 66  sh slots.*/.#def
0600: 69 6e 65 20 4e 5f 48 41 53 48 20 20 36 31 0a 0a  ine N_HASH  61..
0610: 2f 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79 20 61  /*.** A memory a
0620: 6c 6c 6f 63 61 74 69 6f 6e 20 28 61 6c 73 6f 20  llocation (also 
0630: 63 61 6c 6c 65 64 20 61 20 22 63 68 75 6e 6b 22  called a "chunk"
0640: 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  ) consists of tw
0650: 6f 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 62 6c  o or .** more bl
0660: 6f 63 6b 73 20 77 68 65 72 65 20 65 61 63 68 20  ocks where each 
0670: 62 6c 6f 63 6b 20 69 73 20 38 20 62 79 74 65 73  block is 8 bytes
0680: 2e 20 20 54 68 65 20 66 69 72 73 74 20 38 20 62  .  The first 8 b
0690: 79 74 65 73 20 61 72 65 20 0a 2a 2a 20 61 20 68  ytes are .** a h
06a0: 65 61 64 65 72 20 74 68 61 74 20 69 73 20 6e 6f  eader that is no
06b0: 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
06c0: 65 20 75 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  e user..**.** A 
06d0: 63 68 75 6e 6b 20 69 73 20 74 77 6f 20 6f 72 20  chunk is two or 
06e0: 6d 6f 72 65 20 62 6c 6f 63 6b 73 20 74 68 61 74  more blocks that
06f0: 20 69 73 20 65 69 74 68 65 72 20 63 68 65 63 6b   is either check
0700: 65 64 20 6f 75 74 20 6f 72 0a 2a 2a 20 66 72 65  ed out or.** fre
0710: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 62 6c  e.  The first bl
0720: 6f 63 6b 20 68 61 73 20 66 6f 72 6d 61 74 20 75  ock has format u
0730: 2e 68 64 72 2e 20 20 75 2e 68 64 72 2e 73 69 7a  .hdr.  u.hdr.siz
0740: 65 34 78 20 69 73 20 34 20 74 69 6d 65 73 20 74  e4x is 4 times t
0750: 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
0760: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  e allocation in 
0770: 62 6c 6f 63 6b 73 20 69 66 20 74 68 65 20 61 6c  blocks if the al
0780: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 72 65 65  location is free
0790: 2e 0a 2a 2a 20 54 68 65 20 75 2e 68 64 72 2e 73  ..** The u.hdr.s
07a0: 69 7a 65 34 78 26 31 20 62 69 74 20 69 73 20 74  ize4x&1 bit is t
07b0: 72 75 65 20 69 66 20 74 68 65 20 63 68 75 6e 6b  rue if the chunk
07c0: 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75 74 20   is checked out 
07d0: 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  and.** false if 
07e0: 74 68 65 20 63 68 75 6e 6b 20 69 73 20 6f 6e 20  the chunk is on 
07f0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 54  the freelist.  T
0800: 68 65 20 75 2e 68 64 72 2e 73 69 7a 65 34 78 26  he u.hdr.size4x&
0810: 32 20 62 69 74 0a 2a 2a 20 69 73 20 74 72 75 65  2 bit.** is true
0820: 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   if the previous
0830: 20 63 68 75 6e 6b 20 69 73 20 63 68 65 63 6b 65   chunk is checke
0840: 64 20 6f 75 74 20 61 6e 64 20 66 61 6c 73 65 20  d out and false 
0850: 69 66 20 74 68 65 0a 2a 2a 20 70 72 65 76 69 6f  if the.** previo
0860: 75 73 20 63 68 75 6e 6b 20 69 73 20 66 72 65 65  us chunk is free
0870: 2e 20 20 54 68 65 20 75 2e 68 64 72 2e 70 72 65  .  The u.hdr.pre
0880: 76 53 69 7a 65 20 66 69 65 6c 64 20 69 73 20 74  vSize field is t
0890: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  he size of.** th
08a0: 65 20 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b  e previous chunk
08b0: 20 69 6e 20 62 6c 6f 63 6b 73 20 69 66 20 74 68   in blocks if th
08c0: 65 20 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b  e previous chunk
08d0: 20 69 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 72   is on the.** fr
08e0: 65 65 6c 69 73 74 2e 20 49 66 20 74 68 65 20 70  eelist. If the p
08f0: 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 73  revious chunk is
0900: 20 63 68 65 63 6b 65 64 20 6f 75 74 2c 20 74 68   checked out, th
0910: 65 6e 0a 2a 2a 20 75 2e 68 64 72 2e 70 72 65 76  en.** u.hdr.prev
0920: 53 69 7a 65 20 63 61 6e 20 62 65 20 70 61 72 74  Size can be part
0930: 20 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f 72   of the data for
0940: 20 74 68 61 74 20 63 68 75 6e 6b 20 61 6e 64 20   that chunk and 
0950: 73 68 6f 75 6c 64 0a 2a 2a 20 6e 6f 74 20 62 65  should.** not be
0960: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
0970: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 6f 66 74 65 6e  ..**.** We often
0980: 20 69 64 65 6e 74 69 66 79 20 61 20 63 68 75 6e   identify a chun
0990: 6b 20 62 79 20 69 74 73 20 69 6e 64 65 78 20 69  k by its index i
09a0: 6e 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 5d 2e 20  n mem3.aPool[]. 
09b0: 20 57 68 65 6e 0a 2a 2a 20 74 68 69 73 20 69 73   When.** this is
09c0: 20 64 6f 6e 65 2c 20 74 68 65 20 63 68 75 6e 6b   done, the chunk
09d0: 20 69 6e 64 65 78 20 72 65 66 65 72 73 20 74 6f   index refers to
09e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 6c 6f 63   the second bloc
09f0: 6b 20 6f 66 0a 2a 2a 20 74 68 65 20 63 68 75 6e  k of.** the chun
0a00: 6b 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  k.  In this way,
0a10: 20 74 68 65 20 66 69 72 73 74 20 63 68 75 6e 6b   the first chunk
0a20: 20 68 61 73 20 61 6e 20 69 6e 64 65 78 20 6f 66   has an index of
0a30: 20 31 2e 0a 2a 2a 20 41 20 63 68 75 6e 6b 20 69   1..** A chunk i
0a40: 6e 64 65 78 20 6f 66 20 30 20 6d 65 61 6e 73 20  ndex of 0 means 
0a50: 22 6e 6f 20 73 75 63 68 20 63 68 75 6e 6b 22 20  "no such chunk" 
0a60: 61 6e 64 20 69 73 20 74 68 65 20 65 71 75 69 76  and is the equiv
0a70: 61 6c 65 6e 74 0a 2a 2a 20 6f 66 20 61 20 4e 55  alent.** of a NU
0a80: 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  LL pointer..**.*
0a90: 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 62 6c 6f  * The second blo
0aa0: 63 6b 20 6f 66 20 66 72 65 65 20 63 68 75 6e 6b  ck of free chunk
0ab0: 73 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  s is of the form
0ac0: 20 75 2e 6c 69 73 74 2e 20 20 54 68 65 0a 2a 2a   u.list.  The.**
0ad0: 20 74 77 6f 20 66 69 65 6c 64 73 20 66 6f 72 6d   two fields form
0ae0: 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64   a double-linked
0af0: 20 6c 69 73 74 20 6f 66 20 63 68 75 6e 6b 73 20   list of chunks 
0b00: 6f 66 20 72 65 6c 61 74 65 64 20 73 69 7a 65 73  of related sizes
0b10: 2e 0a 2a 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f  ..** Pointers to
0b20: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
0b30: 20 6c 69 73 74 20 61 72 65 20 73 74 6f 72 65 64   list are stored
0b40: 20 69 6e 20 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c   in mem3.aiSmall
0b50: 5b 5d 20 0a 2a 2a 20 66 6f 72 20 73 6d 61 6c 6c  [] .** for small
0b60: 65 72 20 63 68 75 6e 6b 73 20 61 6e 64 20 6d 65  er chunks and me
0b70: 6d 33 2e 61 69 48 61 73 68 5b 5d 20 66 6f 72 20  m3.aiHash[] for 
0b80: 6c 61 72 67 65 72 20 63 68 75 6e 6b 73 2e 0a 2a  larger chunks..*
0b90: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
0ba0: 62 6c 6f 63 6b 20 6f 66 20 61 20 63 68 75 6e 6b  block of a chunk
0bb0: 20 69 73 20 75 73 65 72 20 64 61 74 61 20 69 66   is user data if
0bc0: 20 74 68 65 20 63 68 75 6e 6b 20 69 73 20 63 68   the chunk is ch
0bd0: 65 63 6b 65 64 20 0a 2a 2a 20 6f 75 74 2e 20 20  ecked .** out.  
0be0: 49 66 20 61 20 63 68 75 6e 6b 20 69 73 20 63 68  If a chunk is ch
0bf0: 65 63 6b 65 64 20 6f 75 74 2c 20 74 68 65 20 75  ecked out, the u
0c00: 73 65 72 20 64 61 74 61 20 6d 61 79 20 65 78 74  ser data may ext
0c10: 65 6e 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  end into.** the 
0c20: 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20 76  u.hdr.prevSize v
0c30: 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  alue of the foll
0c40: 6f 77 69 6e 67 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  owing chunk..*/.
0c50: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d  typedef struct M
0c60: 65 6d 33 42 6c 6f 63 6b 20 4d 65 6d 33 42 6c 6f  em3Block Mem3Blo
0c70: 63 6b 3b 0a 73 74 72 75 63 74 20 4d 65 6d 33 42  ck;.struct Mem3B
0c80: 6c 6f 63 6b 20 7b 0a 20 20 75 6e 69 6f 6e 20 7b  lock {.  union {
0c90: 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20  .    struct {.  
0ca0: 20 20 20 20 75 33 32 20 70 72 65 76 53 69 7a 65      u32 prevSize
0cb0: 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70  ;   /* Size of p
0cc0: 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69 6e  revious chunk in
0cd0: 20 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d 65   Mem3Block eleme
0ce0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  nts */.      u32
0cf0: 20 73 69 7a 65 34 78 3b 20 20 20 20 20 2f 2a 20   size4x;     /* 
0d00: 34 78 20 74 68 65 20 73 69 7a 65 20 6f 66 20 63  4x the size of c
0d10: 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 69 6e 20  urrent chunk in 
0d20: 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d 65 6e  Mem3Block elemen
0d30: 74 73 20 2a 2f 0a 20 20 20 20 7d 20 68 64 72 3b  ts */.    } hdr;
0d40: 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20 20  .    struct {.  
0d50: 20 20 20 20 75 33 32 20 6e 65 78 74 3b 20 20 20      u32 next;   
0d60: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
0d70: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 5d 20 6f 66 20  mem3.aPool[] of 
0d80: 6e 65 78 74 20 66 72 65 65 20 63 68 75 6e 6b 20  next free chunk 
0d90: 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 70 72 65  */.      u32 pre
0da0: 76 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  v;       /* Inde
0db0: 78 20 69 6e 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  x in mem3.aPool[
0dc0: 5d 20 6f 66 20 70 72 65 76 69 6f 75 73 20 66 72  ] of previous fr
0dd0: 65 65 20 63 68 75 6e 6b 20 2a 2f 0a 20 20 20 20  ee chunk */.    
0de0: 7d 20 6c 69 73 74 3b 0a 20 20 7d 20 75 3b 0a 7d  } list;.  } u;.}
0df0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  ;../*.** All of 
0e00: 74 68 65 20 73 74 61 74 69 63 20 76 61 72 69 61  the static varia
0e10: 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 69  bles used by thi
0e20: 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f 6c  s module are col
0e30: 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61  lected.** into a
0e40: 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75 72   single structur
0e50: 65 20 6e 61 6d 65 64 20 22 6d 65 6d 33 22 2e 20  e named "mem3". 
0e60: 20 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65 70   This is to keep
0e70: 20 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20 76   the.** static v
0e80: 61 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69 7a  ariables organiz
0e90: 65 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63 65  ed and to reduce
0ea0: 20 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c 75   namespace pollu
0eb0: 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  tion.** when thi
0ec0: 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 62  s module is comb
0ed0: 69 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72 20  ined with other 
0ee0: 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
0ef0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ion..*/.static S
0f00: 51 4c 49 54 45 5f 57 53 44 20 73 74 72 75 63 74  QLITE_WSD struct
0f10: 20 4d 65 6d 33 47 6c 6f 62 61 6c 20 7b 0a 20 20   Mem3Global {.  
0f20: 2f 2a 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 61  /*.  ** Memory a
0f30: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
0f40: 6f 63 61 74 69 6f 6e 2e 20 6e 50 6f 6f 6c 20 69  ocation. nPool i
0f50: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
0f60: 65 20 61 72 72 61 79 0a 20 20 2a 2a 20 28 69 6e  e array.  ** (in
0f70: 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 20 70 6f 69   Mem3Blocks) poi
0f80: 6e 74 65 64 20 74 6f 20 62 79 20 61 50 6f 6f 6c  nted to by aPool
0f90: 20 6c 65 73 73 20 32 2e 0a 20 20 2a 2f 0a 20 20   less 2..  */.  
0fa0: 75 33 32 20 6e 50 6f 6f 6c 3b 0a 20 20 4d 65 6d  u32 nPool;.  Mem
0fb0: 33 42 6c 6f 63 6b 20 2a 61 50 6f 6f 6c 3b 0a 0a  3Block *aPool;..
0fc0: 20 20 2f 2a 0a 20 20 2a 2a 20 54 72 75 65 20 69    /*.  ** True i
0fd0: 66 20 77 65 20 61 72 65 20 65 76 61 6c 75 61 74  f we are evaluat
0fe0: 69 6e 67 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  ing an out-of-me
0ff0: 6d 6f 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  mory callback.. 
1000: 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 61 72 6d 42   */.  int alarmB
1010: 75 73 79 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  usy;.  .  /*.  *
1020: 2a 20 4d 75 74 65 78 20 74 6f 20 63 6f 6e 74 72  * Mutex to contr
1030: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ol access to the
1040: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1050: 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  on subsystem..  
1060: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1070: 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 0a 20 20  ex *mutex;.  .  
1080: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 69 6e 69  /*.  ** The mini
1090: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  mum amount of fr
10a0: 65 65 20 73 70 61 63 65 20 74 68 61 74 20 77 65  ee space that we
10b0: 20 68 61 76 65 20 73 65 65 6e 2e 0a 20 20 2a 2f   have seen..  */
10c0: 0a 20 20 75 33 32 20 6d 6e 4d 61 73 74 65 72 3b  .  u32 mnMaster;
10d0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 69 4d 61 73  ..  /*.  ** iMas
10e0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 64 65 78  ter is the index
10f0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 63   of the master c
1100: 68 75 6e 6b 2e 20 20 4d 6f 73 74 20 6e 65 77 20  hunk.  Most new 
1110: 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 20 20 2a 2a  allocations.  **
1120: 20 6f 63 63 75 72 20 6f 66 66 20 6f 66 20 74 68   occur off of th
1130: 69 73 20 63 68 75 6e 6b 2e 20 20 73 7a 4d 61 73  is chunk.  szMas
1140: 74 65 72 20 69 73 20 74 68 65 20 73 69 7a 65 20  ter is the size 
1150: 28 69 6e 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 0a  (in Mem3Blocks).
1160: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72    ** of the curr
1170: 65 6e 74 20 6d 61 73 74 65 72 2e 20 20 69 4d 61  ent master.  iMa
1180: 73 74 65 72 20 69 73 20 30 20 69 66 20 74 68 65  ster is 0 if the
1190: 72 65 20 69 73 20 6e 6f 74 20 6d 61 73 74 65 72  re is not master
11a0: 20 63 68 75 6e 6b 2e 0a 20 20 2a 2a 20 54 68 65   chunk..  ** The
11b0: 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 69 73   master chunk is
11c0: 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 20 74   not in either t
11d0: 68 65 20 61 69 48 61 73 68 5b 5d 20 6f 72 20 61  he aiHash[] or a
11e0: 69 53 6d 61 6c 6c 5b 5d 2e 0a 20 20 2a 2f 0a 20  iSmall[]..  */. 
11f0: 20 75 33 32 20 69 4d 61 73 74 65 72 3b 0a 20 20   u32 iMaster;.  
1200: 75 33 32 20 73 7a 4d 61 73 74 65 72 3b 0a 0a 20  u32 szMaster;.. 
1210: 20 2f 2a 0a 20 20 2a 2a 20 41 72 72 61 79 20 6f   /*.  ** Array o
1220: 66 20 6c 69 73 74 73 20 6f 66 20 66 72 65 65 20  f lists of free 
1230: 62 6c 6f 63 6b 73 20 61 63 63 6f 72 64 69 6e 67  blocks according
1240: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 73 69   to the block si
1250: 7a 65 20 0a 20 20 2a 2a 20 66 6f 72 20 73 6d 61  ze .  ** for sma
1260: 6c 6c 65 72 20 63 68 75 6e 6b 73 2c 20 6f 72 20  ller chunks, or 
1270: 61 20 68 61 73 68 20 6f 6e 20 74 68 65 20 62 6c  a hash on the bl
1280: 6f 63 6b 20 73 69 7a 65 20 66 6f 72 20 6c 61 72  ock size for lar
1290: 67 65 72 0a 20 20 2a 2a 20 63 68 75 6e 6b 73 2e  ger.  ** chunks.
12a0: 0a 20 20 2a 2f 0a 20 20 75 33 32 20 61 69 53 6d  .  */.  u32 aiSm
12b0: 61 6c 6c 5b 4d 58 5f 53 4d 41 4c 4c 2d 31 5d 3b  all[MX_SMALL-1];
12c0: 20 20 20 2f 2a 20 46 6f 72 20 73 69 7a 65 73 20     /* For sizes 
12d0: 32 20 74 68 72 6f 75 67 68 20 4d 58 5f 53 4d 41  2 through MX_SMA
12e0: 4c 4c 2c 20 69 6e 63 6c 75 73 69 76 65 20 2a 2f  LL, inclusive */
12f0: 0a 20 20 75 33 32 20 61 69 48 61 73 68 5b 4e 5f  .  u32 aiHash[N_
1300: 48 41 53 48 5d 3b 20 20 20 20 20 20 20 20 2f 2a  HASH];        /*
1310: 20 46 6f 72 20 73 69 7a 65 73 20 4d 58 5f 53 4d   For sizes MX_SM
1320: 41 4c 4c 2b 31 20 61 6e 64 20 6c 61 72 67 65 72  ALL+1 and larger
1330: 20 2a 2f 0a 7d 20 6d 65 6d 33 20 3d 20 7b 20 39   */.} mem3 = { 9
1340: 37 35 33 35 35 37 35 20 7d 3b 0a 0a 23 64 65 66  7535575 };..#def
1350: 69 6e 65 20 6d 65 6d 33 20 47 4c 4f 42 41 4c 28  ine mem3 GLOBAL(
1360: 73 74 72 75 63 74 20 4d 65 6d 33 47 6c 6f 62 61  struct Mem3Globa
1370: 6c 2c 20 6d 65 6d 33 29 0a 0a 2f 2a 0a 2a 2a 20  l, mem3)../*.** 
1380: 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68 75 6e 6b  Unlink the chunk
1390: 20 61 74 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69   at mem3.aPool[i
13a0: 5d 20 66 72 6f 6d 20 6c 69 73 74 20 69 74 20 69  ] from list it i
13b0: 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
13c0: 6e 2e 20 20 2a 70 52 6f 6f 74 20 69 73 20 74 68  n.  *pRoot is th
13d0: 65 20 6c 69 73 74 20 74 68 61 74 20 69 20 69 73  e list that i is
13e0: 20 61 20 6d 65 6d 62 65 72 20 6f 66 2e 0a 2a 2f   a member of..*/
13f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
1400: 73 79 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69  sys3UnlinkFromLi
1410: 73 74 28 75 33 32 20 69 2c 20 75 33 32 20 2a 70  st(u32 i, u32 *p
1420: 52 6f 6f 74 29 7b 0a 20 20 75 33 32 20 6e 65 78  Root){.  u32 nex
1430: 74 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  t = mem3.aPool[i
1440: 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b 0a 20  ].u.list.next;. 
1450: 20 75 33 32 20 70 72 65 76 20 3d 20 6d 65 6d 33   u32 prev = mem3
1460: 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74  .aPool[i].u.list
1470: 2e 70 72 65 76 3b 0a 20 20 61 73 73 65 72 74 28  .prev;.  assert(
1480: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1490: 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20  eld(mem3.mutex) 
14a0: 29 3b 0a 20 20 69 66 28 20 70 72 65 76 3d 3d 30  );.  if( prev==0
14b0: 20 29 7b 0a 20 20 20 20 2a 70 52 6f 6f 74 20 3d   ){.    *pRoot =
14c0: 20 6e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   next;.  }else{.
14d0: 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 70      mem3.aPool[p
14e0: 72 65 76 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74  rev].u.list.next
14f0: 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69   = next;.  }.  i
1500: 66 28 20 6e 65 78 74 20 29 7b 0a 20 20 20 20 6d  f( next ){.    m
1510: 65 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 78 74 5d 2e  em3.aPool[next].
1520: 75 2e 6c 69 73 74 2e 70 72 65 76 20 3d 20 70 72  u.list.prev = pr
1530: 65 76 3b 0a 20 20 7d 0a 20 20 6d 65 6d 33 2e 61  ev;.  }.  mem3.a
1540: 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e  Pool[i].u.list.n
1550: 65 78 74 20 3d 20 30 3b 0a 20 20 6d 65 6d 33 2e  ext = 0;.  mem3.
1560: 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e  aPool[i].u.list.
1570: 70 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  prev = 0;.}../*.
1580: 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68  ** Unlink the ch
1590: 75 6e 6b 20 61 74 20 69 6e 64 65 78 20 69 20 66  unk at index i f
15a0: 72 6f 6d 20 0a 2a 2a 20 77 68 61 74 65 76 65 72  rom .** whatever
15b0: 20 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74   list is current
15c0: 6c 79 20 61 20 6d 65 6d 62 65 72 20 6f 66 2e 0a  ly a member of..
15d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
15e0: 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 75 33 32  emsys3Unlink(u32
15f0: 20 69 29 7b 0a 20 20 75 33 32 20 73 69 7a 65 2c   i){.  u32 size,
1600: 20 68 61 73 68 3b 0a 20 20 61 73 73 65 72 74 28   hash;.  assert(
1610: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1620: 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20  eld(mem3.mutex) 
1630: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6d 65  );.  assert( (me
1640: 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e  m3.aPool[i-1].u.
1650: 68 64 72 2e 73 69 7a 65 34 78 20 26 20 31 29 3d  hdr.size4x & 1)=
1660: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1670: 69 3e 3d 31 20 29 3b 0a 20 20 73 69 7a 65 20 3d  i>=1 );.  size =
1680: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d   mem3.aPool[i-1]
1690: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 3b  .u.hdr.size4x/4;
16a0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3d  .  assert( size=
16b0: 3d 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69  =mem3.aPool[i+si
16c0: 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76  ze-1].u.hdr.prev
16d0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
16e0: 28 20 73 69 7a 65 3e 3d 32 20 29 3b 0a 20 20 69  ( size>=2 );.  i
16f0: 66 28 20 73 69 7a 65 20 3c 3d 20 4d 58 5f 53 4d  f( size <= MX_SM
1700: 41 4c 4c 20 29 7b 0a 20 20 20 20 6d 65 6d 73 79  ALL ){.    memsy
1710: 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74  s3UnlinkFromList
1720: 28 69 2c 20 26 6d 65 6d 33 2e 61 69 53 6d 61 6c  (i, &mem3.aiSmal
1730: 6c 5b 73 69 7a 65 2d 32 5d 29 3b 0a 20 20 7d 65  l[size-2]);.  }e
1740: 6c 73 65 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  lse{.    hash = 
1750: 73 69 7a 65 20 25 20 4e 5f 48 41 53 48 3b 0a 20  size % N_HASH;. 
1760: 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b     memsys3Unlink
1770: 46 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d  FromList(i, &mem
1780: 33 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b  3.aiHash[hash]);
1790: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  .  }.}../*.** Li
17a0: 6e 6b 20 74 68 65 20 63 68 75 6e 6b 20 61 74 20  nk the chunk at 
17b0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 20 73 6f  mem3.aPool[i] so
17c0: 20 74 68 61 74 20 69 73 20 6f 6e 20 74 68 65 20   that is on the 
17d0: 6c 69 73 74 20 72 6f 6f 74 65 64 0a 2a 2a 20 61  list rooted.** a
17e0: 74 20 2a 70 52 6f 6f 74 2e 0a 2a 2f 0a 73 74 61  t *pRoot..*/.sta
17f0: 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33  tic void memsys3
1800: 4c 69 6e 6b 49 6e 74 6f 4c 69 73 74 28 75 33 32  LinkIntoList(u32
1810: 20 69 2c 20 75 33 32 20 2a 70 52 6f 6f 74 29 7b   i, u32 *pRoot){
1820: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1830: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65  e3_mutex_held(me
1840: 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d  m3.mutex) );.  m
1850: 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c  em3.aPool[i].u.l
1860: 69 73 74 2e 6e 65 78 74 20 3d 20 2a 70 52 6f 6f  ist.next = *pRoo
1870: 74 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  t;.  mem3.aPool[
1880: 69 5d 2e 75 2e 6c 69 73 74 2e 70 72 65 76 20 3d  i].u.list.prev =
1890: 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 6f 6f 74   0;.  if( *pRoot
18a0: 20 29 7b 0a 20 20 20 20 6d 65 6d 33 2e 61 50 6f   ){.    mem3.aPo
18b0: 6f 6c 5b 2a 70 52 6f 6f 74 5d 2e 75 2e 6c 69 73  ol[*pRoot].u.lis
18c0: 74 2e 70 72 65 76 20 3d 20 69 3b 0a 20 20 7d 0a  t.prev = i;.  }.
18d0: 20 20 2a 70 52 6f 6f 74 20 3d 20 69 3b 0a 7d 0a    *pRoot = i;.}.
18e0: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
18f0: 63 68 75 6e 6b 20 61 74 20 69 6e 64 65 78 20 69  chunk at index i
1900: 20 69 6e 74 6f 20 65 69 74 68 65 72 20 74 68 65   into either the
1910: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
1920: 73 6d 61 6c 6c 20 63 68 75 6e 6b 20 6c 69 73 74  small chunk list
1930: 2c 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6c 61  , or into the la
1940: 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 20 74  rge chunk hash t
1950: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1960: 76 6f 69 64 20 6d 65 6d 73 79 73 33 4c 69 6e 6b  void memsys3Link
1970: 28 75 33 32 20 69 29 7b 0a 20 20 75 33 32 20 73  (u32 i){.  u32 s
1980: 69 7a 65 2c 20 68 61 73 68 3b 0a 20 20 61 73 73  ize, hash;.  ass
1990: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19a0: 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74  ex_held(mem3.mut
19b0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
19c0: 20 69 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   i>=1 );.  asser
19d0: 74 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  t( (mem3.aPool[i
19e0: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
19f0: 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 73 69   & 1)==0 );.  si
1a00: 7a 65 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  ze = mem3.aPool[
1a10: 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34  i-1].u.hdr.size4
1a20: 78 2f 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73  x/4;.  assert( s
1a30: 69 7a 65 3d 3d 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  ize==mem3.aPool[
1a40: 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e  i+size-1].u.hdr.
1a50: 70 72 65 76 53 69 7a 65 20 29 3b 0a 20 20 61 73  prevSize );.  as
1a60: 73 65 72 74 28 20 73 69 7a 65 3e 3d 32 20 29 3b  sert( size>=2 );
1a70: 0a 20 20 69 66 28 20 73 69 7a 65 20 3c 3d 20 4d  .  if( size <= M
1a80: 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20 20 20 20 6d  X_SMALL ){.    m
1a90: 65 6d 73 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c 69  emsys3LinkIntoLi
1aa0: 73 74 28 69 2c 20 26 6d 65 6d 33 2e 61 69 53 6d  st(i, &mem3.aiSm
1ab0: 61 6c 6c 5b 73 69 7a 65 2d 32 5d 29 3b 0a 20 20  all[size-2]);.  
1ac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 68 61 73 68 20  }else{.    hash 
1ad0: 3d 20 73 69 7a 65 20 25 20 4e 5f 48 41 53 48 3b  = size % N_HASH;
1ae0: 0a 20 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e 6b  .    memsys3Link
1af0: 49 6e 74 6f 4c 69 73 74 28 69 2c 20 26 6d 65 6d  IntoList(i, &mem
1b00: 33 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29 3b  3.aiHash[hash]);
1b10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
1b20: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 45 4d 20   the STATIC_MEM 
1b30: 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 61 6c 72  mutex is not alr
1b40: 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
1b50: 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 6d 75  n it now. The mu
1b60: 74 65 78 0a 2a 2a 20 77 69 6c 6c 20 61 6c 72 65  tex.** will alre
1b70: 61 64 79 20 62 65 20 68 65 6c 64 20 28 6f 62 74  ady be held (obt
1b80: 61 69 6e 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ained by code in
1b90: 20 6d 61 6c 6c 6f 63 2e 63 29 20 69 66 0a 2a 2a   malloc.c) if.**
1ba0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1bb0: 6e 66 69 67 2e 62 4d 65 6d 53 74 61 74 20 69 73  nfig.bMemStat is
1bc0: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1bd0: 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 45 6e 74   void memsys3Ent
1be0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
1bf0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1c00: 66 69 67 2e 62 4d 65 6d 73 74 61 74 3d 3d 30 20  fig.bMemstat==0 
1c10: 26 26 20 6d 65 6d 33 2e 6d 75 74 65 78 3d 3d 30  && mem3.mutex==0
1c20: 20 29 7b 0a 20 20 20 20 6d 65 6d 33 2e 6d 75 74   ){.    mem3.mut
1c30: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
1c40: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1c50: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b  TEX_STATIC_MEM);
1c60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1c70: 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 33 2e  utex_enter(mem3.
1c80: 6d 75 74 65 78 29 3b 0a 7d 0a 73 74 61 74 69 63  mutex);.}.static
1c90: 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 4c 65 61   void memsys3Lea
1ca0: 76 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ve(void){.  sqli
1cb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1cc0: 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a  mem3.mutex);.}..
1cd0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65  /*.** Called whe
1ce0: 6e 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  n we are unable 
1cf0: 74 6f 20 73 61 74 69 73 66 79 20 61 6e 20 61 6c  to satisfy an al
1d00: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 42 79 74  location of nByt
1d10: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1d20: 69 64 20 6d 65 6d 73 79 73 33 4f 75 74 4f 66 4d  id memsys3OutOfM
1d30: 65 6d 6f 72 79 28 69 6e 74 20 6e 42 79 74 65 29  emory(int nByte)
1d40: 7b 0a 20 20 69 66 28 20 21 6d 65 6d 33 2e 61 6c  {.  if( !mem3.al
1d50: 61 72 6d 42 75 73 79 20 29 7b 0a 20 20 20 20 6d  armBusy ){.    m
1d60: 65 6d 33 2e 61 6c 61 72 6d 42 75 73 79 20 3d 20  em3.alarmBusy = 
1d70: 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  1;.    assert( s
1d80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d90: 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b  d(mem3.mutex) );
1da0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
1db0: 65 78 5f 6c 65 61 76 65 28 6d 65 6d 33 2e 6d 75  ex_leave(mem3.mu
1dc0: 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tex);.    sqlite
1dd0: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
1de0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71 6c  (nByte);.    sql
1df0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e00: 28 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0a 20 20  (mem3.mutex);.  
1e10: 20 20 6d 65 6d 33 2e 61 6c 61 72 6d 42 75 73 79    mem3.alarmBusy
1e20: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = 0;.  }.}.../*
1e30: 0a 2a 2a 20 43 68 75 6e 6b 20 69 20 69 73 20 61  .** Chunk i is a
1e40: 20 66 72 65 65 20 63 68 75 6e 6b 20 74 68 61 74   free chunk that
1e50: 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b   has been unlink
1e60: 65 64 2e 20 20 41 64 6a 75 73 74 20 69 74 73 20  ed.  Adjust its 
1e70: 0a 2a 2a 20 73 69 7a 65 20 70 61 72 61 6d 65 74  .** size paramet
1e80: 65 72 73 20 66 6f 72 20 63 68 65 63 6b 2d 6f 75  ers for check-ou
1e90: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
1ea0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 0a 2a  ointer to the .*
1eb0: 2a 20 75 73 65 72 20 70 6f 72 74 69 6f 6e 20 6f  * user portion o
1ec0: 66 20 74 68 65 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  f the chunk..*/.
1ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d  static void *mem
1ee0: 73 79 73 33 43 68 65 63 6b 6f 75 74 28 75 33 32  sys3Checkout(u32
1ef0: 20 69 2c 20 75 33 32 20 6e 42 6c 6f 63 6b 29 7b   i, u32 nBlock){
1f00: 0a 20 20 75 33 32 20 78 3b 0a 20 20 61 73 73 65  .  u32 x;.  asse
1f10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f20: 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65  x_held(mem3.mute
1f30: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1f40: 69 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  i>=1 );.  assert
1f50: 28 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31  ( mem3.aPool[i-1
1f60: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34  ].u.hdr.size4x/4
1f70: 3d 3d 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 61 73  ==nBlock );.  as
1f80: 73 65 72 74 28 20 6d 65 6d 33 2e 61 50 6f 6f 6c  sert( mem3.aPool
1f90: 5b 69 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68  [i+nBlock-1].u.h
1fa0: 64 72 2e 70 72 65 76 53 69 7a 65 3d 3d 6e 42 6c  dr.prevSize==nBl
1fb0: 6f 63 6b 20 29 3b 0a 20 20 78 20 3d 20 6d 65 6d  ock );.  x = mem
1fc0: 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68  3.aPool[i-1].u.h
1fd0: 64 72 2e 73 69 7a 65 34 78 3b 0a 20 20 6d 65 6d  dr.size4x;.  mem
1fe0: 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68  3.aPool[i-1].u.h
1ff0: 64 72 2e 73 69 7a 65 34 78 20 3d 20 6e 42 6c 6f  dr.size4x = nBlo
2000: 63 6b 2a 34 20 7c 20 31 20 7c 20 28 78 26 32 29  ck*4 | 1 | (x&2)
2010: 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  ;.  mem3.aPool[i
2020: 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68 64 72  +nBlock-1].u.hdr
2030: 2e 70 72 65 76 53 69 7a 65 20 3d 20 6e 42 6c 6f  .prevSize = nBlo
2040: 63 6b 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c  ck;.  mem3.aPool
2050: 5b 69 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68  [i+nBlock-1].u.h
2060: 64 72 2e 73 69 7a 65 34 78 20 7c 3d 20 32 3b 0a  dr.size4x |= 2;.
2070: 20 20 72 65 74 75 72 6e 20 26 6d 65 6d 33 2e 61    return &mem3.a
2080: 50 6f 6f 6c 5b 69 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  Pool[i];.}../*.*
2090: 2a 20 43 61 72 76 65 20 61 20 70 69 65 63 65 20  * Carve a piece 
20a0: 6f 66 66 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  off of the end o
20b0: 66 20 74 68 65 20 6d 65 6d 33 2e 69 4d 61 73 74  f the mem3.iMast
20c0: 65 72 20 66 72 65 65 20 63 68 75 6e 6b 2e 0a 2a  er free chunk..*
20d0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
20e0: 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
20f0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 4f 72 2c 20 69  location.  Or, i
2100: 66 20 74 68 65 20 6d 61 73 74 65 72 20 63 68 75  f the master chu
2110: 6e 6b 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 61 72  nk.** is not lar
2120: 67 65 20 65 6e 6f 75 67 68 2c 20 72 65 74 75 72  ge enough, retur
2130: 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  n 0..*/.static v
2140: 6f 69 64 20 2a 6d 65 6d 73 79 73 33 46 72 6f 6d  oid *memsys3From
2150: 4d 61 73 74 65 72 28 75 33 32 20 6e 42 6c 6f 63  Master(u32 nBloc
2160: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  k){.  assert( sq
2170: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2180: 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a  (mem3.mutex) );.
2190: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 33 2e 73    assert( mem3.s
21a0: 7a 4d 61 73 74 65 72 3e 3d 6e 42 6c 6f 63 6b 20  zMaster>=nBlock 
21b0: 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 63 6b 3e  );.  if( nBlock>
21c0: 3d 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d 31  =mem3.szMaster-1
21d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   ){.    /* Use t
21e0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
21f0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 20   */.    void *p 
2200: 3d 20 6d 65 6d 73 79 73 33 43 68 65 63 6b 6f 75  = memsys3Checkou
2210: 74 28 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2c 20  t(mem3.iMaster, 
2220: 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 29 3b 0a  mem3.szMaster);.
2230: 20 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72      mem3.iMaster
2240: 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 33 2e 73   = 0;.    mem3.s
2250: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
2260: 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74 65 72 20 3d   mem3.mnMaster =
2270: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   0;.    return p
2280: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2290: 2a 20 53 70 6c 69 74 20 74 68 65 20 6d 61 73 74  * Split the mast
22a0: 65 72 20 62 6c 6f 63 6b 2e 20 20 52 65 74 75 72  er block.  Retur
22b0: 6e 20 74 68 65 20 74 61 69 6c 2e 20 2a 2f 0a 20  n the tail. */. 
22c0: 20 20 20 75 33 32 20 6e 65 77 69 2c 20 78 3b 0a     u32 newi, x;.
22d0: 20 20 20 20 6e 65 77 69 20 3d 20 6d 65 6d 33 2e      newi = mem3.
22e0: 69 4d 61 73 74 65 72 20 2b 20 6d 65 6d 33 2e 73  iMaster + mem3.s
22f0: 7a 4d 61 73 74 65 72 20 2d 20 6e 42 6c 6f 63 6b  zMaster - nBlock
2300: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 65  ;.    assert( ne
2310: 77 69 20 3e 20 6d 65 6d 33 2e 69 4d 61 73 74 65  wi > mem3.iMaste
2320: 72 2b 31 20 29 3b 0a 20 20 20 20 6d 65 6d 33 2e  r+1 );.    mem3.
2330: 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74  aPool[mem3.iMast
2340: 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72  er+mem3.szMaster
2350: 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69  -1].u.hdr.prevSi
2360: 7a 65 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20  ze = nBlock;.   
2370: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33   mem3.aPool[mem3
2380: 2e 69 4d 61 73 74 65 72 2b 6d 65 6d 33 2e 73 7a  .iMaster+mem3.sz
2390: 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e  Master-1].u.hdr.
23a0: 73 69 7a 65 34 78 20 7c 3d 20 32 3b 0a 20 20 20  size4x |= 2;.   
23b0: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 77 69   mem3.aPool[newi
23c0: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
23d0: 20 3d 20 6e 42 6c 6f 63 6b 2a 34 20 2b 20 31 3b   = nBlock*4 + 1;
23e0: 0a 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74  .    mem3.szMast
23f0: 65 72 20 2d 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20  er -= nBlock;.  
2400: 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 77    mem3.aPool[new
2410: 69 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53  i-1].u.hdr.prevS
2420: 69 7a 65 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73  ize = mem3.szMas
2430: 74 65 72 3b 0a 20 20 20 20 78 20 3d 20 6d 65 6d  ter;.    x = mem
2440: 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61  3.aPool[mem3.iMa
2450: 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ster-1].u.hdr.si
2460: 7a 65 34 78 20 26 20 32 3b 0a 20 20 20 20 6d 65  ze4x & 2;.    me
2470: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
2480: 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73  aster-1].u.hdr.s
2490: 69 7a 65 34 78 20 3d 20 6d 65 6d 33 2e 73 7a 4d  ize4x = mem3.szM
24a0: 61 73 74 65 72 2a 34 20 7c 20 78 3b 0a 20 20 20  aster*4 | x;.   
24b0: 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74   if( mem3.szMast
24c0: 65 72 20 3c 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74  er < mem3.mnMast
24d0: 65 72 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 33  er ){.      mem3
24e0: 2e 6d 6e 4d 61 73 74 65 72 20 3d 20 6d 65 6d 33  .mnMaster = mem3
24f0: 2e 73 7a 4d 61 73 74 65 72 3b 0a 20 20 20 20 7d  .szMaster;.    }
2500: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
2510: 64 2a 29 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6e  d*)&mem3.aPool[n
2520: 65 77 69 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ewi];.  }.}../*.
2530: 2a 2a 20 2a 70 52 6f 6f 74 20 69 73 20 74 68 65  ** *pRoot is the
2540: 20 68 65 61 64 20 6f 66 20 61 20 6c 69 73 74 20   head of a list 
2550: 6f 66 20 66 72 65 65 20 63 68 75 6e 6b 73 20 6f  of free chunks o
2560: 66 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 0a  f the same size.
2570: 2a 2a 20 6f 72 20 73 61 6d 65 20 73 69 7a 65 20  ** or same size 
2580: 68 61 73 68 2e 20 20 49 6e 20 6f 74 68 65 72 20  hash.  In other 
2590: 77 6f 72 64 73 2c 20 2a 70 52 6f 6f 74 20 69 73  words, *pRoot is
25a0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 65 69 74   an entry in eit
25b0: 68 65 72 0a 2a 2a 20 6d 65 6d 33 2e 61 69 53 6d  her.** mem3.aiSm
25c0: 61 6c 6c 5b 5d 20 6f 72 20 6d 65 6d 33 2e 61 69  all[] or mem3.ai
25d0: 48 61 73 68 5b 5d 2e 20 20 0a 2a 2a 0a 2a 2a 20  Hash[].  .**.** 
25e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 61  This routine exa
25f0: 6d 69 6e 65 73 20 61 6c 6c 20 65 6e 74 72 69 65  mines all entrie
2600: 73 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 6c  s on the given l
2610: 69 73 74 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a  ist and tries.**
2620: 20 74 6f 20 63 6f 61 6c 65 73 63 65 20 65 61 63   to coalesce eac
2630: 68 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 61  h entries with a
2640: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 63 68 75  djacent free chu
2650: 6e 6b 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  nks.  .**.** If 
2660: 69 74 20 73 65 65 73 20 61 20 63 68 75 6e 6b 20  it sees a chunk 
2670: 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
2680: 68 61 6e 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72  han mem3.iMaster
2690: 2c 20 69 74 20 72 65 70 6c 61 63 65 73 20 0a 2a  , it replaces .*
26a0: 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 65  * the current me
26b0: 6d 33 2e 69 4d 61 73 74 65 72 20 77 69 74 68 20  m3.iMaster with 
26c0: 74 68 65 20 6e 65 77 20 6c 61 72 67 65 72 20 63  the new larger c
26d0: 68 75 6e 6b 2e 20 20 49 6e 20 6f 72 64 65 72 20  hunk.  In order 
26e0: 66 6f 72 0a 2a 2a 20 74 68 69 73 20 6d 65 6d 33  for.** this mem3
26f0: 2e 69 4d 61 73 74 65 72 20 72 65 70 6c 61 63 65  .iMaster replace
2700: 6d 65 6e 74 20 74 6f 20 77 6f 72 6b 2c 20 74 68  ment to work, th
2710: 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 6d  e master chunk m
2720: 75 73 74 20 62 65 0a 2a 2a 20 6c 69 6e 6b 65 64  ust be.** linked
2730: 20 69 6e 74 6f 20 74 68 65 20 68 61 73 68 20 74   into the hash t
2740: 61 62 6c 65 73 2e 20 20 54 68 61 74 20 69 73 20  ables.  That is 
2750: 6e 6f 74 20 74 68 65 20 6e 6f 72 6d 61 6c 20 73  not the normal s
2760: 74 61 74 65 20 6f 66 0a 2a 2a 20 61 66 66 61 69  tate of.** affai
2770: 72 73 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20  rs, of course.  
2780: 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  The calling rout
2790: 69 6e 65 20 6d 75 73 74 20 6c 69 6e 6b 20 74 68  ine must link th
27a0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 63 68 75 6e  e master.** chun
27b0: 6b 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e  k before invokin
27c0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  g this routine, 
27d0: 74 68 65 6e 20 6d 75 73 74 20 75 6e 6c 69 6e 6b  then must unlink
27e0: 20 74 68 65 20 28 70 6f 73 73 69 62 6c 79 0a 2a   the (possibly.*
27f0: 2a 20 63 68 61 6e 67 65 64 29 20 6d 61 73 74 65  * changed) maste
2800: 72 20 63 68 75 6e 6b 20 6f 6e 63 65 20 74 68 69  r chunk once thi
2810: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 66 69  s routine has fi
2820: 6e 69 73 68 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  nished..*/.stati
2830: 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 4d 65  c void memsys3Me
2840: 72 67 65 28 75 33 32 20 2a 70 52 6f 6f 74 29 7b  rge(u32 *pRoot){
2850: 0a 20 20 75 33 32 20 69 4e 65 78 74 2c 20 70 72  .  u32 iNext, pr
2860: 65 76 2c 20 73 69 7a 65 2c 20 69 2c 20 78 3b 0a  ev, size, i, x;.
2870: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2880: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65  e3_mutex_held(me
2890: 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  m3.mutex) );.  f
28a0: 6f 72 28 69 3d 2a 70 52 6f 6f 74 3b 20 69 3e 30  or(i=*pRoot; i>0
28b0: 3b 20 69 3d 69 4e 65 78 74 29 7b 0a 20 20 20 20  ; i=iNext){.    
28c0: 69 4e 65 78 74 20 3d 20 6d 65 6d 33 2e 61 50 6f  iNext = mem3.aPo
28d0: 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78  ol[i].u.list.nex
28e0: 74 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 6d 65  t;.    size = me
28f0: 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e  m3.aPool[i-1].u.
2900: 68 64 72 2e 73 69 7a 65 34 78 3b 0a 20 20 20 20  hdr.size4x;.    
2910: 61 73 73 65 72 74 28 20 28 73 69 7a 65 26 31 29  assert( (size&1)
2920: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
2930: 73 69 7a 65 26 32 29 3d 3d 30 20 29 7b 0a 20 20  size&2)==0 ){.  
2940: 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e      memsys3Unlin
2950: 6b 46 72 6f 6d 4c 69 73 74 28 69 2c 20 70 52 6f  kFromList(i, pRo
2960: 6f 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ot);.      asser
2970: 74 28 20 69 20 3e 20 6d 65 6d 33 2e 61 50 6f 6f  t( i > mem3.aPoo
2980: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65  l[i-1].u.hdr.pre
2990: 76 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 70  vSize );.      p
29a0: 72 65 76 20 3d 20 69 20 2d 20 6d 65 6d 33 2e 61  rev = i - mem3.a
29b0: 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e  Pool[i-1].u.hdr.
29c0: 70 72 65 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  prevSize;.      
29d0: 69 66 28 20 70 72 65 76 3d 3d 69 4e 65 78 74 20  if( prev==iNext 
29e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ){.        iNext
29f0: 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 70 72   = mem3.aPool[pr
2a00: 65 76 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b  ev].u.list.next;
2a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2a20: 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 70 72 65  emsys3Unlink(pre
2a30: 76 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  v);.      size =
2a40: 20 69 20 2b 20 73 69 7a 65 2f 34 20 2d 20 70 72   i + size/4 - pr
2a50: 65 76 3b 0a 20 20 20 20 20 20 78 20 3d 20 6d 65  ev;.      x = me
2a60: 6d 33 2e 61 50 6f 6f 6c 5b 70 72 65 76 2d 31 5d  m3.aPool[prev-1]
2a70: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20  .u.hdr.size4x & 
2a80: 32 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50  2;.      mem3.aP
2a90: 6f 6f 6c 5b 70 72 65 76 2d 31 5d 2e 75 2e 68 64  ool[prev-1].u.hd
2aa0: 72 2e 73 69 7a 65 34 78 20 3d 20 73 69 7a 65 2a  r.size4x = size*
2ab0: 34 20 7c 20 78 3b 0a 20 20 20 20 20 20 6d 65 6d  4 | x;.      mem
2ac0: 33 2e 61 50 6f 6f 6c 5b 70 72 65 76 2b 73 69 7a  3.aPool[prev+siz
2ad0: 65 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53  e-1].u.hdr.prevS
2ae0: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ize = size;.    
2af0: 20 20 6d 65 6d 73 79 73 33 4c 69 6e 6b 28 70 72    memsys3Link(pr
2b00: 65 76 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70  ev);.      i = p
2b10: 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
2b20: 20 20 20 20 20 20 73 69 7a 65 20 2f 3d 20 34 3b        size /= 4;
2b30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2b40: 69 7a 65 3e 6d 65 6d 33 2e 73 7a 4d 61 73 74 65  ize>mem3.szMaste
2b50: 72 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 33 2e  r ){.      mem3.
2b60: 69 4d 61 73 74 65 72 20 3d 20 69 3b 0a 20 20 20  iMaster = i;.   
2b70: 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72     mem3.szMaster
2b80: 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20   = size;.    }. 
2b90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
2ba0: 72 6e 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  rn a block of me
2bb0: 6d 6f 72 79 20 6f 66 20 61 74 20 6c 65 61 73 74  mory of at least
2bc0: 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 2e   nBytes in size.
2bd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2be0: 69 66 20 75 6e 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  if unable..**.**
2bf0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2c00: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
2c10: 6e 65 63 65 73 73 61 72 79 20 6d 75 74 65 78 65  necessary mutexe
2c20: 73 2c 20 69 66 20 61 6e 79 2c 20 61 72 65 0a 2a  s, if any, are.*
2c30: 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  * already held b
2c40: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 48 65  y the caller. He
2c50: 6e 63 65 20 22 55 6e 73 61 66 65 22 2e 0a 2a 2f  nce "Unsafe"..*/
2c60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65  .static void *me
2c70: 6d 73 79 73 33 4d 61 6c 6c 6f 63 55 6e 73 61 66  msys3MallocUnsaf
2c80: 65 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  e(int nByte){.  
2c90: 75 33 32 20 69 3b 0a 20 20 75 33 32 20 6e 42 6c  u32 i;.  u32 nBl
2ca0: 6f 63 6b 3b 0a 20 20 75 33 32 20 74 6f 46 72 65  ock;.  u32 toFre
2cb0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
2cc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2cd0: 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a  (mem3.mutex) );.
2ce0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2cf0: 28 4d 65 6d 33 42 6c 6f 63 6b 29 3d 3d 38 20 29  (Mem3Block)==8 )
2d00: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 31  ;.  if( nByte<=1
2d10: 32 20 29 7b 0a 20 20 20 20 6e 42 6c 6f 63 6b 20  2 ){.    nBlock 
2d20: 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 2;.  }else{.  
2d30: 20 20 6e 42 6c 6f 63 6b 20 3d 20 28 6e 42 79 74    nBlock = (nByt
2d40: 65 20 2b 20 31 31 29 2f 38 3b 0a 20 20 7d 0a 20  e + 11)/8;.  }. 
2d50: 20 61 73 73 65 72 74 28 20 6e 42 6c 6f 63 6b 3e   assert( nBlock>
2d60: 3d 32 20 29 3b 0a 0a 20 20 2f 2a 20 53 54 45 50  =2 );..  /* STEP
2d70: 20 31 3a 0a 20 20 2a 2a 20 4c 6f 6f 6b 20 66 6f   1:.  ** Look fo
2d80: 72 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  r an entry of th
2d90: 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 69  e correct size i
2da0: 6e 20 65 69 74 68 65 72 20 74 68 65 20 73 6d 61  n either the sma
2db0: 6c 6c 0a 20 20 2a 2a 20 63 68 75 6e 6b 20 74 61  ll.  ** chunk ta
2dc0: 62 6c 65 20 6f 72 20 69 6e 20 74 68 65 20 6c 61  ble or in the la
2dd0: 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 20 74  rge chunk hash t
2de0: 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
2df0: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6d   ** successful m
2e00: 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20  ost of the time 
2e10: 28 61 62 6f 75 74 20 39 20 74 69 6d 65 73 20 6f  (about 9 times o
2e20: 75 74 20 6f 66 20 31 30 29 2e 0a 20 20 2a 2f 0a  ut of 10)..  */.
2e30: 20 20 69 66 28 20 6e 42 6c 6f 63 6b 20 3c 3d 20    if( nBlock <= 
2e40: 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20 20 20 20  MX_SMALL ){.    
2e50: 69 20 3d 20 6d 65 6d 33 2e 61 69 53 6d 61 6c 6c  i = mem3.aiSmall
2e60: 5b 6e 42 6c 6f 63 6b 2d 32 5d 3b 0a 20 20 20 20  [nBlock-2];.    
2e70: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
2e80: 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72   memsys3UnlinkFr
2e90: 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 33 2e  omList(i, &mem3.
2ea0: 61 69 53 6d 61 6c 6c 5b 6e 42 6c 6f 63 6b 2d 32  aiSmall[nBlock-2
2eb0: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
2ec0: 20 6d 65 6d 73 79 73 33 43 68 65 63 6b 6f 75 74   memsys3Checkout
2ed0: 28 69 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20  (i, nBlock);.   
2ee0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2ef0: 69 6e 74 20 68 61 73 68 20 3d 20 6e 42 6c 6f 63  int hash = nBloc
2f00: 6b 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20 20  k % N_HASH;.    
2f10: 66 6f 72 28 69 3d 6d 65 6d 33 2e 61 69 48 61 73  for(i=mem3.aiHas
2f20: 68 5b 68 61 73 68 5d 3b 20 69 3e 30 3b 20 69 3d  h[hash]; i>0; i=
2f30: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e  mem3.aPool[i].u.
2f40: 6c 69 73 74 2e 6e 65 78 74 29 7b 0a 20 20 20 20  list.next){.    
2f50: 20 20 69 66 28 20 6d 65 6d 33 2e 61 50 6f 6f 6c    if( mem3.aPool
2f60: 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65  [i-1].u.hdr.size
2f70: 34 78 2f 34 3d 3d 6e 42 6c 6f 63 6b 20 29 7b 0a  4x/4==nBlock ){.
2f80: 20 20 20 20 20 20 20 20 6d 65 6d 73 79 73 33 55          memsys3U
2f90: 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74 28 69 2c  nlinkFromList(i,
2fa0: 20 26 6d 65 6d 33 2e 61 69 48 61 73 68 5b 68 61   &mem3.aiHash[ha
2fb0: 73 68 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  sh]);.        re
2fc0: 74 75 72 6e 20 6d 65 6d 73 79 73 33 43 68 65 63  turn memsys3Chec
2fd0: 6b 6f 75 74 28 69 2c 20 6e 42 6c 6f 63 6b 29 3b  kout(i, nBlock);
2fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ff0: 20 7d 0a 0a 20 20 2f 2a 20 53 54 45 50 20 32 3a   }..  /* STEP 2:
3000: 0a 20 20 2a 2a 20 54 72 79 20 74 6f 20 73 61 74  .  ** Try to sat
3010: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
3020: 69 6f 6e 20 62 79 20 63 61 72 76 69 6e 67 20 61  ion by carving a
3030: 20 70 69 65 63 65 20 6f 66 66 20 6f 66 20 74 68   piece off of th
3040: 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
3050: 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 2e 20  e master chunk. 
3060: 20 54 68 69 73 20 73 74 65 70 20 75 73 75 61 6c   This step usual
3070: 6c 79 20 77 6f 72 6b 73 20 69 66 20 73 74 65 70  ly works if step
3080: 20 31 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a 20   1 fails..  */. 
3090: 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73 74   if( mem3.szMast
30a0: 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 7b 0a 20 20  er>=nBlock ){.  
30b0: 20 20 72 65 74 75 72 6e 20 6d 65 6d 73 79 73 33    return memsys3
30c0: 46 72 6f 6d 4d 61 73 74 65 72 28 6e 42 6c 6f 63  FromMaster(nBloc
30d0: 6b 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 53  k);.  }...  /* S
30e0: 54 45 50 20 33 3a 20 20 0a 20 20 2a 2a 20 4c 6f  TEP 3:  .  ** Lo
30f0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  op through the e
3100: 6e 74 69 72 65 20 6d 65 6d 6f 72 79 20 70 6f 6f  ntire memory poo
3110: 6c 2e 20 20 43 6f 61 6c 65 73 63 65 20 61 64 6a  l.  Coalesce adj
3120: 61 63 65 6e 74 20 66 72 65 65 0a 20 20 2a 2a 20  acent free.  ** 
3130: 63 68 75 6e 6b 73 2e 20 20 52 65 63 6f 6d 70 75  chunks.  Recompu
3140: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 63 68  te the master ch
3150: 75 6e 6b 20 61 73 20 74 68 65 20 6c 61 72 67 65  unk as the large
3160: 73 74 20 66 72 65 65 20 63 68 75 6e 6b 2e 0a 20  st free chunk.. 
3170: 20 2a 2a 20 54 68 65 6e 20 74 72 79 20 61 67 61   ** Then try aga
3180: 69 6e 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  in to satisfy th
3190: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 62 79 20  e allocation by 
31a0: 63 61 72 76 69 6e 67 20 61 20 70 69 65 63 65 20  carving a piece 
31b0: 6f 66 66 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  off.  ** of the 
31c0: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
31d0: 72 20 63 68 75 6e 6b 2e 20 20 54 68 69 73 20 73  r chunk.  This s
31e0: 74 65 70 20 68 61 70 70 65 6e 73 20 76 65 72 79  tep happens very
31f0: 0a 20 20 2a 2a 20 72 61 72 65 6c 79 20 28 77 65  .  ** rarely (we
3200: 20 68 6f 70 65 21 29 0a 20 20 2a 2f 0a 20 20 66   hope!).  */.  f
3210: 6f 72 28 74 6f 46 72 65 65 3d 6e 42 6c 6f 63 6b  or(toFree=nBlock
3220: 2a 31 36 3b 20 74 6f 46 72 65 65 3c 28 6d 65 6d  *16; toFree<(mem
3230: 33 2e 6e 50 6f 6f 6c 2a 31 36 29 3b 20 74 6f 46  3.nPool*16); toF
3240: 72 65 65 20 2a 3d 20 32 29 7b 0a 20 20 20 20 6d  ree *= 2){.    m
3250: 65 6d 73 79 73 33 4f 75 74 4f 66 4d 65 6d 6f 72  emsys3OutOfMemor
3260: 79 28 74 6f 46 72 65 65 29 3b 0a 20 20 20 20 69  y(toFree);.    i
3270: 66 28 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72 20  f( mem3.iMaster 
3280: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 33  ){.      memsys3
3290: 4c 69 6e 6b 28 6d 65 6d 33 2e 69 4d 61 73 74 65  Link(mem3.iMaste
32a0: 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 69  r);.      mem3.i
32b0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
32c0: 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20    mem3.szMaster 
32d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
32e0: 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 41 53 48  or(i=0; i<N_HASH
32f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 65  ; i++){.      me
3300: 6d 73 79 73 33 4d 65 72 67 65 28 26 6d 65 6d 33  msys3Merge(&mem3
3310: 2e 61 69 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20  .aiHash[i]);.   
3320: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
3330: 69 3c 4d 58 5f 53 4d 41 4c 4c 2d 31 3b 20 69 2b  i<MX_SMALL-1; i+
3340: 2b 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73  +){.      memsys
3350: 33 4d 65 72 67 65 28 26 6d 65 6d 33 2e 61 69 53  3Merge(&mem3.aiS
3360: 6d 61 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  mall[i]);.    }.
3370: 20 20 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d      if( mem3.szM
3380: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 6d  aster ){.      m
3390: 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 6d 65 6d  emsys3Unlink(mem
33a0: 33 2e 69 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  3.iMaster);.    
33b0: 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73    if( mem3.szMas
33c0: 74 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 7b 0a 20  ter>=nBlock ){. 
33d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 65         return me
33e0: 6d 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72 28  msys3FromMaster(
33f0: 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d  nBlock);.      }
3400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
3410: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
3420: 61 62 6f 76 65 20 77 6f 72 6b 65 64 2c 20 74 68  above worked, th
3430: 65 6e 20 77 65 20 66 61 69 6c 2e 20 2a 2f 0a 20  en we fail. */. 
3440: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3450: 0a 2a 2a 20 46 72 65 65 20 61 6e 20 6f 75 74 73  .** Free an outs
3460: 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61  tanding memory a
3470: 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  llocation..**.**
3480: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
3490: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
34a0: 6e 65 63 65 73 73 61 72 79 20 6d 75 74 65 78 65  necessary mutexe
34b0: 73 2c 20 69 66 20 61 6e 79 2c 20 61 72 65 0a 2a  s, if any, are.*
34c0: 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  * already held b
34d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 48 65  y the caller. He
34e0: 6e 63 65 20 22 55 6e 73 61 66 65 22 2e 0a 2a 2f  nce "Unsafe"..*/
34f0: 0a 76 6f 69 64 20 6d 65 6d 73 79 73 33 46 72 65  .void memsys3Fre
3500: 65 55 6e 73 61 66 65 28 76 6f 69 64 20 2a 70 4f  eUnsafe(void *pO
3510: 6c 64 29 7b 0a 20 20 4d 65 6d 33 42 6c 6f 63 6b  ld){.  Mem3Block
3520: 20 2a 70 20 3d 20 28 4d 65 6d 33 42 6c 6f 63 6b   *p = (Mem3Block
3530: 2a 29 70 4f 6c 64 3b 0a 20 20 69 6e 74 20 69 3b  *)pOld;.  int i;
3540: 0a 20 20 75 33 32 20 73 69 7a 65 2c 20 78 3b 0a  .  u32 size, x;.
3550: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3560: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65 6d  3_mutex_held(mem
3570: 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  3.mutex) );.  as
3580: 73 65 72 74 28 20 70 3e 6d 65 6d 33 2e 61 50 6f  sert( p>mem3.aPo
3590: 6f 6c 20 26 26 20 70 3c 26 6d 65 6d 33 2e 61 50  ol && p<&mem3.aP
35a0: 6f 6f 6c 5b 6d 65 6d 33 2e 6e 50 6f 6f 6c 5d 20  ool[mem3.nPool] 
35b0: 29 3b 0a 20 20 69 20 3d 20 70 20 2d 20 6d 65 6d  );.  i = p - mem
35c0: 33 2e 61 50 6f 6f 6c 3b 0a 20 20 61 73 73 65 72  3.aPool;.  asser
35d0: 74 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  t( (mem3.aPool[i
35e0: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
35f0: 26 31 29 3d 3d 31 20 29 3b 0a 20 20 73 69 7a 65  &1)==1 );.  size
3600: 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d   = mem3.aPool[i-
3610: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
3620: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 69 2b 73  4;.  assert( i+s
3630: 69 7a 65 3c 3d 6d 65 6d 33 2e 6e 50 6f 6f 6c 2b  ize<=mem3.nPool+
3640: 31 20 29 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f  1 );.  mem3.aPoo
3650: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[i-1].u.hdr.siz
3660: 65 34 78 20 26 3d 20 7e 31 3b 0a 20 20 6d 65 6d  e4x &= ~1;.  mem
3670: 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31  3.aPool[i+size-1
3680: 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65  ].u.hdr.prevSize
3690: 20 3d 20 73 69 7a 65 3b 0a 20 20 6d 65 6d 33 2e   = size;.  mem3.
36a0: 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31 5d 2e  aPool[i+size-1].
36b0: 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 3d 20  u.hdr.size4x &= 
36c0: 7e 32 3b 0a 20 20 6d 65 6d 73 79 73 33 4c 69 6e  ~2;.  memsys3Lin
36d0: 6b 28 69 29 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  k(i);..  /* Try 
36e0: 74 6f 20 65 78 70 61 6e 64 20 74 68 65 20 6d 61  to expand the ma
36f0: 73 74 65 72 20 75 73 69 6e 67 20 74 68 65 20 6e  ster using the n
3700: 65 77 6c 79 20 66 72 65 65 64 20 63 68 75 6e 6b  ewly freed chunk
3710: 20 2a 2f 0a 20 20 69 66 28 20 6d 65 6d 33 2e 69   */.  if( mem3.i
3720: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 77 68  Master ){.    wh
3730: 69 6c 65 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c  ile( (mem3.aPool
3740: 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d  [mem3.iMaster-1]
3750: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 32 29  .u.hdr.size4x&2)
3760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  ==0 ){.      siz
3770: 65 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d  e = mem3.aPool[m
3780: 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75  em3.iMaster-1].u
3790: 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 3b 0a 20  .hdr.prevSize;. 
37a0: 20 20 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65       mem3.iMaste
37b0: 72 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20  r -= size;.     
37c0: 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20 2b   mem3.szMaster +
37d0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65  = size;.      me
37e0: 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 6d 65 6d 33  msys3Unlink(mem3
37f0: 2e 69 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  .iMaster);.     
3800: 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b   x = mem3.aPool[
3810: 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e  mem3.iMaster-1].
3820: 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20 32  u.hdr.size4x & 2
3830: 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f  ;.      mem3.aPo
3840: 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d  ol[mem3.iMaster-
3850: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20  1].u.hdr.size4x 
3860: 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2a  = mem3.szMaster*
3870: 34 20 7c 20 78 3b 0a 20 20 20 20 20 20 6d 65 6d  4 | x;.      mem
3880: 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61  3.aPool[mem3.iMa
3890: 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74  ster+mem3.szMast
38a0: 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76  er-1].u.hdr.prev
38b0: 53 69 7a 65 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61  Size = mem3.szMa
38c0: 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ster;.    }.    
38d0: 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d  x = mem3.aPool[m
38e0: 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75  em3.iMaster-1].u
38f0: 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20 32 3b  .hdr.size4x & 2;
3900: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 6d 65 6d  .    while( (mem
3910: 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61  3.aPool[mem3.iMa
3920: 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74  ster+mem3.szMast
3930: 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65  er-1].u.hdr.size
3940: 34 78 26 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  4x&1)==0 ){.    
3950: 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28    memsys3Unlink(
3960: 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d 65 6d  mem3.iMaster+mem
3970: 33 2e 73 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  3.szMaster);.   
3980: 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72     mem3.szMaster
3990: 20 2b 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d   += mem3.aPool[m
39a0: 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d 65 6d 33  em3.iMaster+mem3
39b0: 2e 73 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68  .szMaster-1].u.h
39c0: 64 72 2e 73 69 7a 65 34 78 2f 34 3b 0a 20 20 20  dr.size4x/4;.   
39d0: 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65     mem3.aPool[me
39e0: 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e 75 2e  m3.iMaster-1].u.
39f0: 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6d 65 6d  hdr.size4x = mem
3a00: 33 2e 73 7a 4d 61 73 74 65 72 2a 34 20 7c 20 78  3.szMaster*4 | x
3a10: 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50 6f  ;.      mem3.aPo
3a20: 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b  ol[mem3.iMaster+
3a30: 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d 31 5d  mem3.szMaster-1]
3a40: 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20  .u.hdr.prevSize 
3a50: 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 3b  = mem3.szMaster;
3a60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
3a70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
3a80: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
3a90: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
3aa0: 2c 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 65  , in bytes.  The
3ab0: 0a 2a 2a 20 73 69 7a 65 20 72 65 74 75 72 6e 65  .** size returne
3ac0: 64 20 6f 6d 69 74 73 20 74 68 65 20 38 2d 62 79  d omits the 8-by
3ad0: 74 65 20 68 65 61 64 65 72 20 6f 76 65 72 68 65  te header overhe
3ae0: 61 64 2e 20 20 54 68 69 73 20 6f 6e 6c 79 0a 2a  ad.  This only.*
3af0: 2a 20 77 6f 72 6b 73 20 66 6f 72 20 63 68 75 6e  * works for chun
3b00: 6b 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  ks that are curr
3b10: 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f 75  ently checked ou
3b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3b30: 20 6d 65 6d 73 79 73 33 53 69 7a 65 28 76 6f 69   memsys3Size(voi
3b40: 64 20 2a 70 29 7b 0a 20 20 4d 65 6d 33 42 6c 6f  d *p){.  Mem3Blo
3b50: 63 6b 20 2a 70 42 6c 6f 63 6b 3b 0a 20 20 69 66  ck *pBlock;.  if
3b60: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
3b70: 30 3b 0a 20 20 70 42 6c 6f 63 6b 20 3d 20 28 4d  0;.  pBlock = (M
3b80: 65 6d 33 42 6c 6f 63 6b 2a 29 70 3b 0a 20 20 61  em3Block*)p;.  a
3b90: 73 73 65 72 74 28 20 28 70 42 6c 6f 63 6b 5b 2d  ssert( (pBlock[-
3ba0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26  1].u.hdr.size4x&
3bb0: 31 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  1)!=0 );.  retur
3bc0: 6e 20 28 70 42 6c 6f 63 6b 5b 2d 31 5d 2e 75 2e  n (pBlock[-1].u.
3bd0: 68 64 72 2e 73 69 7a 65 34 78 26 7e 33 29 2a 32  hdr.size4x&~3)*2
3be0: 20 2d 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   - 4;.}../*.** R
3bf0: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
3c00: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
3c10: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
3c20: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
3c30: 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 33 52  tic int memsys3R
3c40: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20  oundup(int n){. 
3c50: 20 69 66 28 20 6e 3c 3d 31 32 20 29 7b 0a 20 20   if( n<=12 ){.  
3c60: 20 20 72 65 74 75 72 6e 20 31 32 3b 0a 20 20 7d    return 12;.  }
3c70: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3c80: 20 28 28 6e 2b 31 31 29 26 7e 37 29 20 2d 20 34   ((n+11)&~7) - 4
3c90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3ca0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
3cb0: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
3cc0: 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79 73  tic void *memsys
3cd0: 33 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  3Malloc(int nByt
3ce0: 65 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  es){.  sqlite3_i
3cf0: 6e 74 36 34 20 2a 70 3b 0a 20 20 61 73 73 65 72  nt64 *p;.  asser
3d00: 74 28 20 6e 42 79 74 65 73 3e 30 20 29 3b 20 20  t( nBytes>0 );  
3d10: 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f          /* mallo
3d20: 63 2e 63 20 66 69 6c 74 65 72 73 20 6f 75 74 20  c.c filters out 
3d30: 30 20 62 79 74 65 20 72 65 71 75 65 73 74 73 20  0 byte requests 
3d40: 2a 2f 0a 20 20 6d 65 6d 73 79 73 33 45 6e 74 65  */.  memsys3Ente
3d50: 72 28 29 3b 0a 20 20 70 20 3d 20 6d 65 6d 73 79  r();.  p = memsy
3d60: 73 33 4d 61 6c 6c 6f 63 55 6e 73 61 66 65 28 6e  s3MallocUnsafe(n
3d70: 42 79 74 65 73 29 3b 0a 20 20 6d 65 6d 73 79 73  Bytes);.  memsys
3d80: 33 4c 65 61 76 65 28 29 3b 0a 20 20 72 65 74 75  3Leave();.  retu
3d90: 72 6e 20 28 76 6f 69 64 2a 29 70 3b 20 0a 7d 0a  rn (void*)p; .}.
3da0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
3db0: 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 73  ry..*/.void mems
3dc0: 79 73 33 46 72 65 65 28 76 6f 69 64 20 2a 70 50  ys3Free(void *pP
3dd0: 72 69 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rior){.  assert(
3de0: 20 70 50 72 69 6f 72 20 29 3b 0a 20 20 6d 65 6d   pPrior );.  mem
3df0: 73 79 73 33 45 6e 74 65 72 28 29 3b 0a 20 20 6d  sys3Enter();.  m
3e00: 65 6d 73 79 73 33 46 72 65 65 55 6e 73 61 66 65  emsys3FreeUnsafe
3e10: 28 70 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d 73  (pPrior);.  mems
3e20: 79 73 33 4c 65 61 76 65 28 29 3b 0a 7d 0a 0a 2f  ys3Leave();.}../
3e30: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3e40: 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74  size of an exist
3e50: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
3e60: 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 2a 6d  ation.*/.void *m
3e70: 65 6d 73 79 73 33 52 65 61 6c 6c 6f 63 28 76 6f  emsys3Realloc(vo
3e80: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
3e90: 6e 42 79 74 65 73 29 7b 0a 20 20 69 6e 74 20 6e  nBytes){.  int n
3ea0: 4f 6c 64 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a  Old;.  void *p;.
3eb0: 20 20 69 66 28 20 70 50 72 69 6f 72 3d 3d 30 20    if( pPrior==0 
3ec0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
3ed0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
3ee0: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
3ef0: 6e 42 79 74 65 73 3c 3d 30 20 29 7b 0a 20 20 20  nBytes<=0 ){.   
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
3f10: 72 69 6f 72 29 3b 0a 20 20 20 20 72 65 74 75 72  rior);.    retur
3f20: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  n 0;.  }.  nOld 
3f30: 3d 20 6d 65 6d 73 79 73 33 53 69 7a 65 28 70 50  = memsys3Size(pP
3f40: 72 69 6f 72 29 3b 0a 20 20 69 66 28 20 6e 42 79  rior);.  if( nBy
3f50: 74 65 73 3c 3d 6e 4f 6c 64 20 26 26 20 6e 42 79  tes<=nOld && nBy
3f60: 74 65 73 3e 3d 6e 4f 6c 64 2d 31 32 38 20 29 7b  tes>=nOld-128 ){
3f70: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 72 69  .    return pPri
3f80: 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 79 73  or;.  }.  memsys
3f90: 33 45 6e 74 65 72 28 29 3b 0a 20 20 70 20 3d 20  3Enter();.  p = 
3fa0: 6d 65 6d 73 79 73 33 4d 61 6c 6c 6f 63 55 6e 73  memsys3MallocUns
3fb0: 61 66 65 28 6e 42 79 74 65 73 29 3b 0a 20 20 69  afe(nBytes);.  i
3fc0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3fd0: 6e 4f 6c 64 3c 6e 42 79 74 65 73 20 29 7b 0a 20  nOld<nBytes ){. 
3fe0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 70       memcpy(p, p
3ff0: 50 72 69 6f 72 2c 20 6e 4f 6c 64 29 3b 0a 20 20  Prior, nOld);.  
4000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
4010: 65 6d 63 70 79 28 70 2c 20 70 50 72 69 6f 72 2c  emcpy(p, pPrior,
4020: 20 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 7d 0a   nBytes);.    }.
4030: 20 20 20 20 6d 65 6d 73 79 73 33 46 72 65 65 55      memsys3FreeU
4040: 6e 73 61 66 65 28 70 50 72 69 6f 72 29 3b 0a 20  nsafe(pPrior);. 
4050: 20 7d 0a 20 20 6d 65 6d 73 79 73 33 4c 65 61 76   }.  memsys3Leav
4060: 65 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  e();.  return p;
4070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
4080: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
4090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
40a0: 6d 65 6d 73 79 73 33 49 6e 69 74 28 76 6f 69 64  memsys3Init(void
40b0: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
40c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
40d0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 21  otUsed);.  if( !
40e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
40f0: 66 69 67 2e 70 48 65 61 70 20 29 7b 0a 20 20 20  fig.pHeap ){.   
4100: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
4110: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
4120: 53 74 6f 72 65 20 61 20 70 6f 69 6e 74 65 72 20  Store a pointer 
4130: 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 6c  to the memory bl
4140: 6f 63 6b 20 69 6e 20 67 6c 6f 62 61 6c 20 73 74  ock in global st
4150: 72 75 63 74 75 72 65 20 6d 65 6d 33 2e 20 2a 2f  ructure mem3. */
4160: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
4170: 66 28 4d 65 6d 33 42 6c 6f 63 6b 29 3d 3d 38 20  f(Mem3Block)==8 
4180: 29 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 20  );.  mem3.aPool 
4190: 3d 20 28 4d 65 6d 33 42 6c 6f 63 6b 20 2a 29 73  = (Mem3Block *)s
41a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
41b0: 69 67 2e 70 48 65 61 70 3b 0a 20 20 6d 65 6d 33  ig.pHeap;.  mem3
41c0: 2e 6e 50 6f 6f 6c 20 3d 20 28 73 71 6c 69 74 65  .nPool = (sqlite
41d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
41e0: 65 61 70 20 2f 20 73 69 7a 65 6f 66 28 4d 65 6d  eap / sizeof(Mem
41f0: 33 42 6c 6f 63 6b 29 29 20 2d 20 32 3b 0a 0a 20  3Block)) - 2;.. 
4200: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
4210: 68 65 20 6d 61 73 74 65 72 20 62 6c 6f 63 6b 2e  he master block.
4220: 20 2a 2f 0a 20 20 6d 65 6d 33 2e 73 7a 4d 61 73   */.  mem3.szMas
4230: 74 65 72 20 3d 20 6d 65 6d 33 2e 6e 50 6f 6f 6c  ter = mem3.nPool
4240: 3b 0a 20 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74 65  ;.  mem3.mnMaste
4250: 72 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65  r = mem3.szMaste
4260: 72 3b 0a 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65  r;.  mem3.iMaste
4270: 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 33 2e 61 50  r = 1;.  mem3.aP
4280: 6f 6f 6c 5b 30 5d 2e 75 2e 68 64 72 2e 73 69 7a  ool[0].u.hdr.siz
4290: 65 34 78 20 3d 20 28 6d 65 6d 33 2e 73 7a 4d 61  e4x = (mem3.szMa
42a0: 73 74 65 72 3c 3c 32 29 20 2b 20 32 3b 0a 20 20  ster<<2) + 2;.  
42b0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e  mem3.aPool[mem3.
42c0: 6e 50 6f 6f 6c 5d 2e 75 2e 68 64 72 2e 70 72 65  nPool].u.hdr.pre
42d0: 76 53 69 7a 65 20 3d 20 6d 65 6d 33 2e 6e 50 6f  vSize = mem3.nPo
42e0: 6f 6c 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c  ol;.  mem3.aPool
42f0: 5b 6d 65 6d 33 2e 6e 50 6f 6f 6c 5d 2e 75 2e 68  [mem3.nPool].u.h
4300: 64 72 2e 73 69 7a 65 34 78 20 3d 20 31 3b 0a 0a  dr.size4x = 1;..
4310: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4320: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69  OK;.}../*.** Dei
4330: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
4340: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
4350: 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 53 68 75   void memsys3Shu
4360: 74 64 6f 77 6e 28 76 6f 69 64 20 2a 4e 6f 74 55  tdown(void *NotU
4370: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
4380: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
4390: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
43a0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
43b0: 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 20   file indicated 
43c0: 61 6e 64 20 77 72 69 74 65 20 61 20 6c 6f 67 20  and write a log 
43d0: 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65 64 20 6d  of all unfreed m
43e0: 65 6d 6f 72 79 20 0a 2a 2a 20 61 6c 6c 6f 63 61  emory .** alloca
43f0: 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68 61 74 20  tions into that 
4400: 6c 6f 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  log..*/.void sql
4410: 69 74 65 33 4d 65 6d 73 79 73 33 44 75 6d 70 28  ite3Memsys3Dump(
4420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
4430: 65 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  ename){.#ifdef S
4440: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 46 49  QLITE_DEBUG.  FI
4450: 4c 45 20 2a 6f 75 74 3b 0a 20 20 75 33 32 20 69  LE *out;.  u32 i
4460: 2c 20 6a 3b 0a 20 20 75 33 32 20 73 69 7a 65 3b  , j;.  u32 size;
4470: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
4480: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
4490: 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 75  [0]==0 ){.    ou
44a0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65  t = stdout;.  }e
44b0: 6c 73 65 7b 0a 20 20 20 20 6f 75 74 20 3d 20 66  lse{.    out = f
44c0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
44d0: 22 77 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "w");.    if( ou
44e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
44f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2a  rintf(stderr, "*
4500: 2a 20 55 6e 61 62 6c 65 20 74 6f 20 6f 75 74 70  * Unable to outp
4510: 75 74 20 6d 65 6d 6f 72 79 20 64 65 62 75 67 20  ut memory debug 
4520: 6f 75 74 70 75 74 20 6c 6f 67 3a 20 25 73 20 2a  output log: %s *
4530: 2a 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  *\n",.          
4540: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
4550: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  ename);.      re
4560: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4570: 20 20 6d 65 6d 73 79 73 33 45 6e 74 65 72 28 29    memsys3Enter()
4580: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
4590: 20 22 43 48 55 4e 4b 53 3a 5c 6e 22 29 3b 0a 20   "CHUNKS:\n");. 
45a0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6d 65 6d   for(i=1; i<=mem
45b0: 33 2e 6e 50 6f 6f 6c 3b 20 69 2b 3d 73 69 7a 65  3.nPool; i+=size
45c0: 2f 34 29 7b 0a 20 20 20 20 73 69 7a 65 20 3d 20  /4){.    size = 
45d0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e  mem3.aPool[i-1].
45e0: 75 2e 68 64 72 2e 73 69 7a 65 34 78 3b 0a 20 20  u.hdr.size4x;.  
45f0: 20 20 69 66 28 20 73 69 7a 65 2f 34 3c 3d 31 20    if( size/4<=1 
4600: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4610: 28 6f 75 74 2c 20 22 25 70 20 73 69 7a 65 20 65  (out, "%p size e
4620: 72 72 6f 72 5c 6e 22 2c 20 26 6d 65 6d 33 2e 61  rror\n", &mem3.a
4630: 50 6f 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Pool[i]);.      
4640: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
4650: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4660: 20 20 20 20 69 66 28 20 28 73 69 7a 65 26 31 29      if( (size&1)
4670: 3d 3d 30 20 26 26 20 6d 65 6d 33 2e 61 50 6f 6f  ==0 && mem3.aPoo
4680: 6c 5b 69 2b 73 69 7a 65 2f 34 2d 31 5d 2e 75 2e  l[i+size/4-1].u.
4690: 68 64 72 2e 70 72 65 76 53 69 7a 65 21 3d 73 69  hdr.prevSize!=si
46a0: 7a 65 2f 34 20 29 7b 0a 20 20 20 20 20 20 66 70  ze/4 ){.      fp
46b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 74  rintf(out, "%p t
46c0: 61 69 6c 20 73 69 7a 65 20 64 6f 65 73 20 6e 6f  ail size does no
46d0: 74 20 6d 61 74 63 68 5c 6e 22 2c 20 26 6d 65 6d  t match\n", &mem
46e0: 33 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0a 20 20 20  3.aPool[i]);.   
46f0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4710: 20 7d 0a 20 20 20 20 69 66 28 20 28 28 6d 65 6d   }.    if( ((mem
4720: 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2f 34  3.aPool[i+size/4
4730: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
4740: 26 32 29 3e 3e 31 29 21 3d 28 73 69 7a 65 26 31  &2)>>1)!=(size&1
4750: 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
4760: 74 66 28 6f 75 74 2c 20 22 25 70 20 74 61 69 6c  tf(out, "%p tail
4770: 20 63 68 65 63 6b 6f 75 74 20 62 69 74 20 69 73   checkout bit is
4780: 20 69 6e 63 6f 72 72 65 63 74 5c 6e 22 2c 20 26   incorrect\n", &
4790: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0a  mem3.aPool[i]);.
47a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
47b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
47c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 69      }.    if( si
47d0: 7a 65 26 31 20 29 7b 0a 20 20 20 20 20 20 66 70  ze&1 ){.      fp
47e0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 25  rintf(out, "%p %
47f0: 36 64 20 62 79 74 65 73 20 63 68 65 63 6b 65 64  6d bytes checked
4800: 20 6f 75 74 5c 6e 22 2c 20 26 6d 65 6d 33 2e 61   out\n", &mem3.a
4810: 50 6f 6f 6c 5b 69 5d 2c 20 28 73 69 7a 65 2f 34  Pool[i], (size/4
4820: 29 2a 38 2d 38 29 3b 0a 20 20 20 20 7d 65 6c 73  )*8-8);.    }els
4830: 65 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e{.      fprintf
4840: 28 6f 75 74 2c 20 22 25 70 20 25 36 64 20 62 79  (out, "%p %6d by
4850: 74 65 73 20 66 72 65 65 25 73 5c 6e 22 2c 20 26  tes free%s\n", &
4860: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2c 20 28  mem3.aPool[i], (
4870: 73 69 7a 65 2f 34 29 2a 38 2d 38 2c 0a 20 20 20  size/4)*8-8,.   
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4890: 3d 3d 6d 65 6d 33 2e 69 4d 61 73 74 65 72 20 3f  ==mem3.iMaster ?
48a0: 20 22 20 2a 2a 6d 61 73 74 65 72 2a 2a 22 20 3a   " **master**" :
48b0: 20 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   "");.    }.  }.
48c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f    for(i=0; i<MX_
48d0: 53 4d 41 4c 4c 2d 31 3b 20 69 2b 2b 29 7b 0a 20  SMALL-1; i++){. 
48e0: 20 20 20 69 66 28 20 6d 65 6d 33 2e 61 69 53 6d     if( mem3.aiSm
48f0: 61 6c 6c 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  all[i]==0 ) cont
4900: 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
4910: 66 28 6f 75 74 2c 20 22 73 6d 61 6c 6c 28 25 32  f(out, "small(%2
4920: 64 29 3a 22 2c 20 69 29 3b 0a 20 20 20 20 66 6f  d):", i);.    fo
4930: 72 28 6a 20 3d 20 6d 65 6d 33 2e 61 69 53 6d 61  r(j = mem3.aiSma
4940: 6c 6c 5b 69 5d 3b 20 6a 3e 30 3b 20 6a 3d 6d 65  ll[i]; j>0; j=me
4950: 6d 33 2e 61 50 6f 6f 6c 5b 6a 5d 2e 75 2e 6c 69  m3.aPool[j].u.li
4960: 73 74 2e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  st.next){.      
4970: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
4980: 70 28 25 64 29 22 2c 20 26 6d 65 6d 33 2e 61 50  p(%d)", &mem3.aP
4990: 6f 6f 6c 5b 6a 5d 2c 0a 20 20 20 20 20 20 20 20  ool[j],.        
49a0: 20 20 20 20 20 20 28 6d 65 6d 33 2e 61 50 6f 6f        (mem3.aPoo
49b0: 6c 5b 6a 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[j-1].u.hdr.siz
49c0: 65 34 78 2f 34 29 2a 38 2d 38 29 3b 0a 20 20 20  e4x/4)*8-8);.   
49d0: 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
49e0: 75 74 2c 20 22 5c 6e 22 29 3b 20 0a 20 20 7d 0a  ut, "\n"); .  }.
49f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48    for(i=0; i<N_H
4a00: 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ASH; i++){.    i
4a10: 66 28 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b 69  f( mem3.aiHash[i
4a20: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
4a30: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
4a40: 2c 20 22 68 61 73 68 28 25 32 64 29 3a 22 2c 20  , "hash(%2d):", 
4a50: 69 29 3b 0a 20 20 20 20 66 6f 72 28 6a 20 3d 20  i);.    for(j = 
4a60: 6d 65 6d 33 2e 61 69 48 61 73 68 5b 69 5d 3b 20  mem3.aiHash[i]; 
4a70: 6a 3e 30 3b 20 6a 3d 6d 65 6d 33 2e 61 50 6f 6f  j>0; j=mem3.aPoo
4a80: 6c 5b 6a 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74  l[j].u.list.next
4a90: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4aa0: 28 6f 75 74 2c 20 22 20 25 70 28 25 64 29 22 2c  (out, " %p(%d)",
4ab0: 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 5d 2c   &mem3.aPool[j],
4ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
4ad0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 2d 31 5d 2e  mem3.aPool[j-1].
4ae0: 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34 29 2a  u.hdr.size4x/4)*
4af0: 38 2d 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  8-8);.    }.    
4b00: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
4b10: 22 29 3b 20 0a 20 20 7d 0a 20 20 66 70 72 69 6e  "); .  }.  fprin
4b20: 74 66 28 6f 75 74 2c 20 22 6d 61 73 74 65 72 3d  tf(out, "master=
4b30: 25 64 5c 6e 22 2c 20 6d 65 6d 33 2e 69 4d 61 73  %d\n", mem3.iMas
4b40: 74 65 72 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  ter);.  fprintf(
4b50: 6f 75 74 2c 20 22 6e 6f 77 55 73 65 64 3d 25 64  out, "nowUsed=%d
4b60: 5c 6e 22 2c 20 6d 65 6d 33 2e 6e 50 6f 6f 6c 2a  \n", mem3.nPool*
4b70: 38 20 2d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65  8 - mem3.szMaste
4b80: 72 2a 38 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  r*8);.  fprintf(
4b90: 6f 75 74 2c 20 22 6d 78 55 73 65 64 3d 25 64 5c  out, "mxUsed=%d\
4ba0: 6e 22 2c 20 6d 65 6d 33 2e 6e 50 6f 6f 6c 2a 38  n", mem3.nPool*8
4bb0: 20 2d 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74 65 72   - mem3.mnMaster
4bc0: 2a 38 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  *8);.  sqlite3_m
4bd0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 33 2e  utex_leave(mem3.
4be0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6f 75  mutex);.  if( ou
4bf0: 74 3d 3d 73 74 64 6f 75 74 20 29 7b 0a 20 20 20  t==stdout ){.   
4c00: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
4c10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 63  .  }else{.    fc
4c20: 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 23  lose(out);.  }.#
4c30: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
4c40: 52 41 4d 45 54 45 52 28 7a 46 69 6c 65 6e 61 6d  RAMETER(zFilenam
4c50: 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  e);.#endif.}../*
4c60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4c70: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75   is the only rou
4c80: 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c  tine in this fil
4c90: 65 20 77 69 74 68 20 65 78 74 65 72 6e 61 6c 20  e with external 
4ca0: 0a 2a 2a 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2a 0a  .** linkage..**.
4cb0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
4cc0: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
4cd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
4ce0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
4cf0: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
4d00: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
4d10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
4d20: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
4d30: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
4d40: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
4d50: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
4d60: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
4d70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4d80: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
4d90: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
4da0: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
4db0: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
4dc0: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
4dd0: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
4de0: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
4df0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
4e00: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
4e10: 65 6d 73 79 73 33 28 76 6f 69 64 29 7b 0a 20 20  emsys3(void){.  
4e20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
4e30: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
4e40: 20 6d 65 6d 70 6f 6f 6c 4d 65 74 68 6f 64 73 20   mempoolMethods 
4e50: 3d 20 7b 0a 20 20 20 20 20 6d 65 6d 73 79 73 33  = {.     memsys3
4e60: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 20 6d 65 6d  Malloc,.     mem
4e70: 73 79 73 33 46 72 65 65 2c 0a 20 20 20 20 20 6d  sys3Free,.     m
4e80: 65 6d 73 79 73 33 52 65 61 6c 6c 6f 63 2c 0a 20  emsys3Realloc,. 
4e90: 20 20 20 20 6d 65 6d 73 79 73 33 53 69 7a 65 2c      memsys3Size,
4ea0: 0a 20 20 20 20 20 6d 65 6d 73 79 73 33 52 6f 75  .     memsys3Rou
4eb0: 6e 64 75 70 2c 0a 20 20 20 20 20 6d 65 6d 73 79  ndup,.     memsy
4ec0: 73 33 49 6e 69 74 2c 0a 20 20 20 20 20 6d 65 6d  s3Init,.     mem
4ed0: 73 79 73 33 53 68 75 74 64 6f 77 6e 2c 0a 20 20  sys3Shutdown,.  
4ee0: 20 20 20 30 0a 20 20 7d 3b 0a 20 20 72 65 74 75     0.  };.  retu
4ef0: 72 6e 20 26 6d 65 6d 70 6f 6f 6c 4d 65 74 68 6f  rn &mempoolMetho
4f00: 64 73 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ds;.}..#endif /*
4f10: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4f20: 45 4d 53 59 53 33 20 2a 2f 0a                    EMSYS3 */.