/ Hex Artifact Content
Login

Artifact 9b237d911ba9904142a804be727cc6664873f8a3:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
03f0: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0400: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
0410: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0420: 63 61 74 6f 72 20 69 73 20 6f 6e 6c 79 20 62 75  cator is only bu
0430: 69 6c 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 62  ilt into the lib
0440: 72 61 72 79 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rary.** SQLITE_E
0450: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 69 73  NABLE_MEMSYS3 is
0460: 20 64 65 66 69 6e 65 64 2e 20 44 65 66 69 6e 69   defined. Defini
0470: 6e 67 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 64  ng this symbol d
0480: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d 65 61 6e 20  oes not.** mean 
0490: 74 68 61 74 20 74 68 65 20 6c 69 62 72 61 72 79  that the library
04a0: 20 77 69 6c 6c 20 75 73 65 20 61 20 6d 65 6d 6f   will use a memo
04b0: 72 79 2d 70 6f 6f 6c 20 62 79 20 64 65 66 61 75  ry-pool by defau
04c0: 6c 74 2c 20 6a 75 73 74 20 74 68 61 74 0a 2a 2a  lt, just that.**
04d0: 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65   it is available
04e0: 2e 20 54 68 65 20 6d 65 6d 70 6f 6f 6c 20 61 6c  . The mempool al
04f0: 6c 6f 63 61 74 6f 72 20 69 73 20 61 63 74 69 76  locator is activ
0500: 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 0a  ated by calling.
0510: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  ** sqlite3_confi
0520: 67 28 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  g()..*/.#ifdef S
0530: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
0540: 53 59 53 33 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  SYS3../*.** Maxi
0550: 6d 75 6d 20 73 69 7a 65 20 28 69 6e 20 4d 65 6d  mum size (in Mem
0560: 33 42 6c 6f 63 6b 73 29 20 6f 66 20 61 20 22 73  3Blocks) of a "s
0570: 6d 61 6c 6c 22 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  mall" chunk..*/.
0580: 23 64 65 66 69 6e 65 20 4d 58 5f 53 4d 41 4c 4c  #define MX_SMALL
0590: 20 31 30 0a 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62   10.../*.** Numb
05a0: 65 72 20 6f 66 20 66 72 65 65 6c 69 73 74 20 68  er of freelist h
05b0: 61 73 68 20 73 6c 6f 74 73 0a 2a 2f 0a 23 64 65  ash slots.*/.#de
05c0: 66 69 6e 65 20 4e 5f 48 41 53 48 20 20 36 31 0a  fine N_HASH  61.
05d0: 0a 2f 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79 20  ./*.** A memory 
05e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 61 6c 73 6f  allocation (also
05f0: 20 63 61 6c 6c 65 64 20 61 20 22 63 68 75 6e 6b   called a "chunk
0600: 22 29 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ") consists of t
0610: 77 6f 20 6f 72 20 0a 2a 2a 20 6d 6f 72 65 20 62  wo or .** more b
0620: 6c 6f 63 6b 73 20 77 68 65 72 65 20 65 61 63 68  locks where each
0630: 20 62 6c 6f 63 6b 20 69 73 20 38 20 62 79 74 65   block is 8 byte
0640: 73 2e 20 20 54 68 65 20 66 69 72 73 74 20 38 20  s.  The first 8 
0650: 62 79 74 65 73 20 61 72 65 20 0a 2a 2a 20 61 20  bytes are .** a 
0660: 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 6e  header that is n
0670: 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
0680: 68 65 20 75 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  he user..**.** A
0690: 20 63 68 75 6e 6b 20 69 73 20 74 77 6f 20 6f 72   chunk is two or
06a0: 20 6d 6f 72 65 20 62 6c 6f 63 6b 73 20 74 68 61   more blocks tha
06b0: 74 20 69 73 20 65 69 74 68 65 72 20 63 68 65 63  t is either chec
06c0: 6b 65 64 20 6f 75 74 20 6f 72 0a 2a 2a 20 66 72  ked out or.** fr
06d0: 65 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 62  ee.  The first b
06e0: 6c 6f 63 6b 20 68 61 73 20 66 6f 72 6d 61 74 20  lock has format 
06f0: 75 2e 68 64 72 2e 20 20 75 2e 68 64 72 2e 73 69  u.hdr.  u.hdr.si
0700: 7a 65 34 78 20 69 73 20 34 20 74 69 6d 65 73 20  ze4x is 4 times 
0710: 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
0720: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 6e  he allocation in
0730: 20 62 6c 6f 63 6b 73 20 69 66 20 74 68 65 20 61   blocks if the a
0740: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 66 72 65  llocation is fre
0750: 65 2e 0a 2a 2a 20 54 68 65 20 75 2e 68 64 72 2e  e..** The u.hdr.
0760: 73 69 7a 65 34 78 26 31 20 62 69 74 20 69 73 20  size4x&1 bit is 
0770: 74 72 75 65 20 69 66 20 74 68 65 20 63 68 75 6e  true if the chun
0780: 6b 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75 74  k is checked out
0790: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 69 66   and.** false if
07a0: 20 74 68 65 20 63 68 75 6e 6b 20 69 73 20 6f 6e   the chunk is on
07b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
07c0: 54 68 65 20 75 2e 68 64 72 2e 73 69 7a 65 34 78  The u.hdr.size4x
07d0: 26 32 20 62 69 74 0a 2a 2a 20 69 73 20 74 72 75  &2 bit.** is tru
07e0: 65 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75  e if the previou
07f0: 73 20 63 68 75 6e 6b 20 69 73 20 63 68 65 63 6b  s chunk is check
0800: 65 64 20 6f 75 74 20 61 6e 64 20 66 61 6c 73 65  ed out and false
0810: 20 69 66 20 74 68 65 0a 2a 2a 20 70 72 65 76 69   if the.** previ
0820: 6f 75 73 20 63 68 75 6e 6b 20 69 73 20 66 72 65  ous chunk is fre
0830: 65 2e 20 20 54 68 65 20 75 2e 68 64 72 2e 70 72  e.  The u.hdr.pr
0840: 65 76 53 69 7a 65 20 66 69 65 6c 64 20 69 73 20  evSize field is 
0850: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  the size of.** t
0860: 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 75 6e  he previous chun
0870: 6b 20 69 6e 20 62 6c 6f 63 6b 73 20 69 66 20 74  k in blocks if t
0880: 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 75 6e  he previous chun
0890: 6b 20 69 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66  k is on the.** f
08a0: 72 65 65 6c 69 73 74 2e 20 49 66 20 74 68 65 20  reelist. If the 
08b0: 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69  previous chunk i
08c0: 73 20 63 68 65 63 6b 65 64 20 6f 75 74 2c 20 74  s checked out, t
08d0: 68 65 6e 0a 2a 2a 20 75 2e 68 64 72 2e 70 72 65  hen.** u.hdr.pre
08e0: 76 53 69 7a 65 20 63 61 6e 20 62 65 20 70 61 72  vSize can be par
08f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f  t of the data fo
0900: 72 20 74 68 61 74 20 63 68 75 6e 6b 20 61 6e 64  r that chunk and
0910: 20 73 68 6f 75 6c 64 0a 2a 2a 20 6e 6f 74 20 62   should.** not b
0920: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
0930: 6e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 6f 66 74 65  n..**.** We ofte
0940: 6e 20 69 64 65 6e 74 69 66 79 20 61 20 63 68 75  n identify a chu
0950: 6e 6b 20 62 79 20 69 74 73 20 69 6e 64 65 78 20  nk by its index 
0960: 69 6e 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 5d 2e  in mem3.aPool[].
0970: 20 20 57 68 65 6e 0a 2a 2a 20 74 68 69 73 20 69    When.** this i
0980: 73 20 64 6f 6e 65 2c 20 74 68 65 20 63 68 75 6e  s done, the chun
0990: 6b 20 69 6e 64 65 78 20 72 65 66 65 72 73 20 74  k index refers t
09a0: 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 62 6c 6f  o the second blo
09b0: 63 6b 20 6f 66 0a 2a 2a 20 74 68 65 20 63 68 75  ck of.** the chu
09c0: 6e 6b 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  nk.  In this way
09d0: 2c 20 74 68 65 20 66 69 72 73 74 20 63 68 75 6e  , the first chun
09e0: 6b 20 68 61 73 20 61 6e 20 69 6e 64 65 78 20 6f  k has an index o
09f0: 66 20 31 2e 0a 2a 2a 20 41 20 63 68 75 6e 6b 20  f 1..** A chunk 
0a00: 69 6e 64 65 78 20 6f 66 20 30 20 6d 65 61 6e 73  index of 0 means
0a10: 20 22 6e 6f 20 73 75 63 68 20 63 68 75 6e 6b 22   "no such chunk"
0a20: 20 61 6e 64 20 69 73 20 74 68 65 20 65 71 75 69   and is the equi
0a30: 76 61 6c 65 6e 74 0a 2a 2a 20 6f 66 20 61 20 4e  valent.** of a N
0a40: 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ULL pointer..**.
0a50: 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 62 6c  ** The second bl
0a60: 6f 63 6b 20 6f 66 20 66 72 65 65 20 63 68 75 6e  ock of free chun
0a70: 6b 73 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ks is of the for
0a80: 6d 20 75 2e 6c 69 73 74 2e 20 20 54 68 65 0a 2a  m u.list.  The.*
0a90: 2a 20 74 77 6f 20 66 69 65 6c 64 73 20 66 6f 72  * two fields for
0aa0: 6d 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65  m a double-linke
0ab0: 64 20 6c 69 73 74 20 6f 66 20 63 68 75 6e 6b 73  d list of chunks
0ac0: 20 6f 66 20 72 65 6c 61 74 65 64 20 73 69 7a 65   of related size
0ad0: 73 2e 0a 2a 2a 20 50 6f 69 6e 74 65 72 73 20 74  s..** Pointers t
0ae0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
0af0: 65 20 6c 69 73 74 20 61 72 65 20 73 74 6f 72 65  e list are store
0b00: 64 20 69 6e 20 6d 65 6d 33 2e 61 69 53 6d 61 6c  d in mem3.aiSmal
0b10: 6c 5b 5d 20 0a 2a 2a 20 66 6f 72 20 73 6d 61 6c  l[] .** for smal
0b20: 6c 65 72 20 63 68 75 6e 6b 73 20 61 6e 64 20 6d  ler chunks and m
0b30: 65 6d 33 2e 61 69 48 61 73 68 5b 5d 20 66 6f 72  em3.aiHash[] for
0b40: 20 6c 61 72 67 65 72 20 63 68 75 6e 6b 73 2e 0a   larger chunks..
0b50: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
0b60: 20 62 6c 6f 63 6b 20 6f 66 20 61 20 63 68 75 6e   block of a chun
0b70: 6b 20 69 73 20 75 73 65 72 20 64 61 74 61 20 69  k is user data i
0b80: 66 20 74 68 65 20 63 68 75 6e 6b 20 69 73 20 63  f the chunk is c
0b90: 68 65 63 6b 65 64 20 0a 2a 2a 20 6f 75 74 2e 20  hecked .** out. 
0ba0: 20 49 66 20 61 20 63 68 75 6e 6b 20 69 73 20 63   If a chunk is c
0bb0: 68 65 63 6b 65 64 20 6f 75 74 2c 20 74 68 65 20  hecked out, the 
0bc0: 75 73 65 72 20 64 61 74 61 20 6d 61 79 20 65 78  user data may ex
0bd0: 74 65 6e 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  tend into.** the
0be0: 20 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 20   u.hdr.prevSize 
0bf0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6f 6c  value of the fol
0c00: 6c 6f 77 69 6e 67 20 63 68 75 6e 6b 2e 0a 2a 2f  lowing chunk..*/
0c10: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0c20: 4d 65 6d 33 42 6c 6f 63 6b 20 4d 65 6d 33 42 6c  Mem3Block Mem3Bl
0c30: 6f 63 6b 3b 0a 73 74 72 75 63 74 20 4d 65 6d 33  ock;.struct Mem3
0c40: 42 6c 6f 63 6b 20 7b 0a 20 20 75 6e 69 6f 6e 20  Block {.  union 
0c50: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20  {.    struct {. 
0c60: 20 20 20 20 20 75 33 32 20 70 72 65 76 53 69 7a       u32 prevSiz
0c70: 65 3b 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  e;   /* Size of 
0c80: 70 72 65 76 69 6f 75 73 20 63 68 75 6e 6b 20 69  previous chunk i
0c90: 6e 20 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d  n Mem3Block elem
0ca0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 75 33  ents */.      u3
0cb0: 32 20 73 69 7a 65 34 78 3b 20 20 20 20 20 2f 2a  2 size4x;     /*
0cc0: 20 34 78 20 74 68 65 20 73 69 7a 65 20 6f 66 20   4x the size of 
0cd0: 63 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 69 6e  current chunk in
0ce0: 20 4d 65 6d 33 42 6c 6f 63 6b 20 65 6c 65 6d 65   Mem3Block eleme
0cf0: 6e 74 73 20 2a 2f 0a 20 20 20 20 7d 20 68 64 72  nts */.    } hdr
0d00: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a 20  ;.    struct {. 
0d10: 20 20 20 20 20 75 33 32 20 6e 65 78 74 3b 20 20       u32 next;  
0d20: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
0d30: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 5d 20 6f 66   mem3.aPool[] of
0d40: 20 6e 65 78 74 20 66 72 65 65 20 63 68 75 6e 6b   next free chunk
0d50: 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 70 72   */.      u32 pr
0d60: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ev;       /* Ind
0d70: 65 78 20 69 6e 20 6d 65 6d 33 2e 61 50 6f 6f 6c  ex in mem3.aPool
0d80: 5b 5d 20 6f 66 20 70 72 65 76 69 6f 75 73 20 66  [] of previous f
0d90: 72 65 65 20 63 68 75 6e 6b 20 2a 2f 0a 20 20 20  ree chunk */.   
0da0: 20 7d 20 6c 69 73 74 3b 0a 20 20 7d 20 75 3b 0a   } list;.  } u;.
0db0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 66  };../*.** All of
0dc0: 20 74 68 65 20 73 74 61 74 69 63 20 76 61 72 69   the static vari
0dd0: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68  ables used by th
0de0: 69 73 20 6d 6f 64 75 6c 65 20 61 72 65 20 63 6f  is module are co
0df0: 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 74 6f 20  llected.** into 
0e00: 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75  a single structu
0e10: 72 65 20 6e 61 6d 65 64 20 22 6d 65 6d 33 22 2e  re named "mem3".
0e20: 20 20 54 68 69 73 20 69 73 20 74 6f 20 6b 65 65    This is to kee
0e30: 70 20 74 68 65 0a 2a 2a 20 73 74 61 74 69 63 20  p the.** static 
0e40: 76 61 72 69 61 62 6c 65 73 20 6f 72 67 61 6e 69  variables organi
0e50: 7a 65 64 20 61 6e 64 20 74 6f 20 72 65 64 75 63  zed and to reduc
0e60: 65 20 6e 61 6d 65 73 70 61 63 65 20 70 6f 6c 6c  e namespace poll
0e70: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 74 68  ution.** when th
0e80: 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d  is module is com
0e90: 62 69 6e 65 64 20 77 69 74 68 20 6f 74 68 65 72  bined with other
0ea0: 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
0eb0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
0ec0: 53 51 4c 49 54 45 5f 57 53 44 20 73 74 72 75 63  SQLITE_WSD struc
0ed0: 74 20 4d 65 6d 33 47 6c 6f 62 61 6c 20 7b 0a 20  t Mem3Global {. 
0ee0: 20 2f 2a 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20   /*.  ** Memory 
0ef0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
0f00: 6c 6f 63 61 74 69 6f 6e 2e 20 6e 50 6f 6f 6c 20  location. nPool 
0f10: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
0f20: 68 65 20 61 72 72 61 79 0a 20 20 2a 2a 20 28 69  he array.  ** (i
0f30: 6e 20 4d 65 6d 33 42 6c 6f 63 6b 73 29 20 70 6f  n Mem3Blocks) po
0f40: 69 6e 74 65 64 20 74 6f 20 62 79 20 61 50 6f 6f  inted to by aPoo
0f50: 6c 20 6c 65 73 73 20 32 2e 0a 20 20 2a 2f 0a 20  l less 2..  */. 
0f60: 20 75 33 32 20 6e 50 6f 6f 6c 3b 0a 20 20 4d 65   u32 nPool;.  Me
0f70: 6d 33 42 6c 6f 63 6b 20 2a 61 50 6f 6f 6c 3b 0a  m3Block *aPool;.
0f80: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 72 75 65 20  .  /*.  ** True 
0f90: 69 66 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  if we are evalua
0fa0: 74 69 6e 67 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  ting an out-of-m
0fb0: 65 6d 6f 72 79 20 63 61 6c 6c 62 61 63 6b 2e 0a  emory callback..
0fc0: 20 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 61 72 6d    */.  int alarm
0fd0: 42 75 73 79 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20  Busy;.  .  /*.  
0fe0: 2a 2a 20 4d 75 74 65 78 20 74 6f 20 63 6f 6e 74  ** Mutex to cont
0ff0: 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
1000: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
1010: 69 6f 6e 20 73 75 62 73 79 73 74 65 6d 2e 0a 20  ion subsystem.. 
1020: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1030: 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 0a 20  tex *mutex;.  . 
1040: 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 69 6e   /*.  ** The min
1050: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66  imum amount of f
1060: 72 65 65 20 73 70 61 63 65 20 74 68 61 74 20 77  ree space that w
1070: 65 20 68 61 76 65 20 73 65 65 6e 2e 0a 20 20 2a  e have seen..  *
1080: 2f 0a 20 20 75 33 32 20 6d 6e 4d 61 73 74 65 72  /.  u32 mnMaster
1090: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 69 4d 61  ;..  /*.  ** iMa
10a0: 73 74 65 72 20 69 73 20 74 68 65 20 69 6e 64 65  ster is the inde
10b0: 78 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  x of the master 
10c0: 63 68 75 6e 6b 2e 20 20 4d 6f 73 74 20 6e 65 77  chunk.  Most new
10d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 0a 20 20 2a   allocations.  *
10e0: 2a 20 6f 63 63 75 72 20 6f 66 66 20 6f 66 20 74  * occur off of t
10f0: 68 69 73 20 63 68 75 6e 6b 2e 20 20 73 7a 4d 61  his chunk.  szMa
1100: 73 74 65 72 20 69 73 20 74 68 65 20 73 69 7a 65  ster is the size
1110: 20 28 69 6e 20 4d 65 6d 33 42 6c 6f 63 6b 73 29   (in Mem3Blocks)
1120: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 72  .  ** of the cur
1130: 72 65 6e 74 20 6d 61 73 74 65 72 2e 20 20 69 4d  rent master.  iM
1140: 61 73 74 65 72 20 69 73 20 30 20 69 66 20 74 68  aster is 0 if th
1150: 65 72 65 20 69 73 20 6e 6f 74 20 6d 61 73 74 65  ere is not maste
1160: 72 20 63 68 75 6e 6b 2e 0a 20 20 2a 2a 20 54 68  r chunk..  ** Th
1170: 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20 69  e master chunk i
1180: 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 20  s not in either 
1190: 74 68 65 20 61 69 48 61 73 68 5b 5d 20 6f 72 20  the aiHash[] or 
11a0: 61 69 53 6d 61 6c 6c 5b 5d 2e 0a 20 20 2a 2f 0a  aiSmall[]..  */.
11b0: 20 20 75 33 32 20 69 4d 61 73 74 65 72 3b 0a 20    u32 iMaster;. 
11c0: 20 75 33 32 20 73 7a 4d 61 73 74 65 72 3b 0a 0a   u32 szMaster;..
11d0: 20 20 2f 2a 0a 20 20 2a 2a 20 41 72 72 61 79 20    /*.  ** Array 
11e0: 6f 66 20 6c 69 73 74 73 20 6f 66 20 66 72 65 65  of lists of free
11f0: 20 62 6c 6f 63 6b 73 20 61 63 63 6f 72 64 69 6e   blocks accordin
1200: 67 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 73  g to the block s
1210: 69 7a 65 20 0a 20 20 2a 2a 20 66 6f 72 20 73 6d  ize .  ** for sm
1220: 61 6c 6c 65 72 20 63 68 75 6e 6b 73 2c 20 6f 72  aller chunks, or
1230: 20 61 20 68 61 73 68 20 6f 6e 20 74 68 65 20 62   a hash on the b
1240: 6c 6f 63 6b 20 73 69 7a 65 20 66 6f 72 20 6c 61  lock size for la
1250: 72 67 65 72 0a 20 20 2a 2a 20 63 68 75 6e 6b 73  rger.  ** chunks
1260: 2e 0a 20 20 2a 2f 0a 20 20 75 33 32 20 61 69 53  ..  */.  u32 aiS
1270: 6d 61 6c 6c 5b 4d 58 5f 53 4d 41 4c 4c 2d 31 5d  mall[MX_SMALL-1]
1280: 3b 20 20 20 2f 2a 20 46 6f 72 20 73 69 7a 65 73  ;   /* For sizes
1290: 20 32 20 74 68 72 6f 75 67 68 20 4d 58 5f 53 4d   2 through MX_SM
12a0: 41 4c 4c 2c 20 69 6e 63 6c 75 73 69 76 65 20 2a  ALL, inclusive *
12b0: 2f 0a 20 20 75 33 32 20 61 69 48 61 73 68 5b 4e  /.  u32 aiHash[N
12c0: 5f 48 41 53 48 5d 3b 20 20 20 20 20 20 20 20 2f  _HASH];        /
12d0: 2a 20 46 6f 72 20 73 69 7a 65 73 20 4d 58 5f 53  * For sizes MX_S
12e0: 4d 41 4c 4c 2b 31 20 61 6e 64 20 6c 61 72 67 65  MALL+1 and large
12f0: 72 20 2a 2f 0a 7d 20 6d 65 6d 33 20 3d 20 7b 20  r */.} mem3 = { 
1300: 39 37 35 33 35 35 37 35 20 7d 3b 0a 0a 23 64 65  97535575 };..#de
1310: 66 69 6e 65 20 6d 65 6d 33 20 47 4c 4f 42 41 4c  fine mem3 GLOBAL
1320: 28 73 74 72 75 63 74 20 4d 65 6d 33 47 6c 6f 62  (struct Mem3Glob
1330: 61 6c 2c 20 6d 65 6d 33 29 0a 0a 2f 2a 0a 2a 2a  al, mem3)../*.**
1340: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68 75 6e   Unlink the chun
1350: 6b 20 61 74 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  k at mem3.aPool[
1360: 69 5d 20 66 72 6f 6d 20 6c 69 73 74 20 69 74 20  i] from list it 
1370: 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1380: 6f 6e 2e 20 20 2a 70 52 6f 6f 74 20 69 73 20 74  on.  *pRoot is t
1390: 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 20 69  he list that i i
13a0: 73 20 61 20 6d 65 6d 62 65 72 20 6f 66 2e 0a 2a  s a member of..*
13b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
13c0: 6d 73 79 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c  msys3UnlinkFromL
13d0: 69 73 74 28 75 33 32 20 69 2c 20 75 33 32 20 2a  ist(u32 i, u32 *
13e0: 70 52 6f 6f 74 29 7b 0a 20 20 75 33 32 20 6e 65  pRoot){.  u32 ne
13f0: 78 74 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  xt = mem3.aPool[
1400: 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74 3b 0a  i].u.list.next;.
1410: 20 20 75 33 32 20 70 72 65 76 20 3d 20 6d 65 6d    u32 prev = mem
1420: 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73  3.aPool[i].u.lis
1430: 74 2e 70 72 65 76 3b 0a 20 20 61 73 73 65 72 74  t.prev;.  assert
1440: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1450: 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29  held(mem3.mutex)
1460: 20 29 3b 0a 20 20 69 66 28 20 70 72 65 76 3d 3d   );.  if( prev==
1470: 30 20 29 7b 0a 20 20 20 20 2a 70 52 6f 6f 74 20  0 ){.    *pRoot 
1480: 3d 20 6e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  = next;.  }else{
1490: 0a 20 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  .    mem3.aPool[
14a0: 70 72 65 76 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78  prev].u.list.nex
14b0: 74 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  t = next;.  }.  
14c0: 69 66 28 20 6e 65 78 74 20 29 7b 0a 20 20 20 20  if( next ){.    
14d0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 78 74 5d  mem3.aPool[next]
14e0: 2e 75 2e 6c 69 73 74 2e 70 72 65 76 20 3d 20 70  .u.list.prev = p
14f0: 72 65 76 3b 0a 20 20 7d 0a 20 20 6d 65 6d 33 2e  rev;.  }.  mem3.
1500: 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e  aPool[i].u.list.
1510: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 6d 65 6d 33  next = 0;.  mem3
1520: 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74  .aPool[i].u.list
1530: 2e 70 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  .prev = 0;.}../*
1540: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63  .** Unlink the c
1550: 68 75 6e 6b 20 61 74 20 69 6e 64 65 78 20 69 20  hunk at index i 
1560: 66 72 6f 6d 20 0a 2a 2a 20 77 68 61 74 65 76 65  from .** whateve
1570: 72 20 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  r list is curren
1580: 74 6c 79 20 61 20 6d 65 6d 62 65 72 20 6f 66 2e  tly a member of.
1590: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15a0: 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 75 33  memsys3Unlink(u3
15b0: 32 20 69 29 7b 0a 20 20 75 33 32 20 73 69 7a 65  2 i){.  u32 size
15c0: 2c 20 68 61 73 68 3b 0a 20 20 61 73 73 65 72 74  , hash;.  assert
15d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15e0: 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29  held(mem3.mutex)
15f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6d   );.  assert( (m
1600: 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75  em3.aPool[i-1].u
1610: 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20 31 29  .hdr.size4x & 1)
1620: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1630: 20 69 3e 3d 31 20 29 3b 0a 20 20 73 69 7a 65 20   i>=1 );.  size 
1640: 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31  = mem3.aPool[i-1
1650: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f 34  ].u.hdr.size4x/4
1660: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
1670: 3d 3d 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 73  ==mem3.aPool[i+s
1680: 69 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65  ize-1].u.hdr.pre
1690: 76 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  vSize );.  asser
16a0: 74 28 20 73 69 7a 65 3e 3d 32 20 29 3b 0a 20 20  t( size>=2 );.  
16b0: 69 66 28 20 73 69 7a 65 20 3c 3d 20 4d 58 5f 53  if( size <= MX_S
16c0: 4d 41 4c 4c 20 29 7b 0a 20 20 20 20 6d 65 6d 73  MALL ){.    mems
16d0: 79 73 33 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73  ys3UnlinkFromLis
16e0: 74 28 69 2c 20 26 6d 65 6d 33 2e 61 69 53 6d 61  t(i, &mem3.aiSma
16f0: 6c 6c 5b 73 69 7a 65 2d 32 5d 29 3b 0a 20 20 7d  ll[size-2]);.  }
1700: 65 6c 73 65 7b 0a 20 20 20 20 68 61 73 68 20 3d  else{.    hash =
1710: 20 73 69 7a 65 20 25 20 4e 5f 48 41 53 48 3b 0a   size % N_HASH;.
1720: 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e      memsys3Unlin
1730: 6b 46 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65  kFromList(i, &me
1740: 6d 33 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29  m3.aiHash[hash])
1750: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
1760: 69 6e 6b 20 74 68 65 20 63 68 75 6e 6b 20 61 74  ink the chunk at
1770: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 20 73   mem3.aPool[i] s
1780: 6f 20 74 68 61 74 20 69 73 20 6f 6e 20 74 68 65  o that is on the
1790: 20 6c 69 73 74 20 72 6f 6f 74 65 64 0a 2a 2a 20   list rooted.** 
17a0: 61 74 20 2a 70 52 6f 6f 74 2e 0a 2a 2f 0a 73 74  at *pRoot..*/.st
17b0: 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73  atic void memsys
17c0: 33 4c 69 6e 6b 49 6e 74 6f 4c 69 73 74 28 75 33  3LinkIntoList(u3
17d0: 32 20 69 2c 20 75 33 32 20 2a 70 52 6f 6f 74 29  2 i, u32 *pRoot)
17e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
17f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
1800: 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20  em3.mutex) );.  
1810: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75 2e  mem3.aPool[i].u.
1820: 6c 69 73 74 2e 6e 65 78 74 20 3d 20 2a 70 52 6f  list.next = *pRo
1830: 6f 74 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c  ot;.  mem3.aPool
1840: 5b 69 5d 2e 75 2e 6c 69 73 74 2e 70 72 65 76 20  [i].u.list.prev 
1850: 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 6f 6f  = 0;.  if( *pRoo
1860: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 33 2e 61 50  t ){.    mem3.aP
1870: 6f 6f 6c 5b 2a 70 52 6f 6f 74 5d 2e 75 2e 6c 69  ool[*pRoot].u.li
1880: 73 74 2e 70 72 65 76 20 3d 20 69 3b 0a 20 20 7d  st.prev = i;.  }
1890: 0a 20 20 2a 70 52 6f 6f 74 20 3d 20 69 3b 0a 7d  .  *pRoot = i;.}
18a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
18b0: 20 63 68 75 6e 6b 20 61 74 20 69 6e 64 65 78 20   chunk at index 
18c0: 69 20 69 6e 74 6f 20 65 69 74 68 65 72 20 74 68  i into either th
18d0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
18e0: 20 73 6d 61 6c 6c 20 63 68 75 6e 6b 20 6c 69 73   small chunk lis
18f0: 74 2c 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6c  t, or into the l
1900: 61 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 20  arge chunk hash 
1910: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1920: 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 4c 69 6e   void memsys3Lin
1930: 6b 28 75 33 32 20 69 29 7b 0a 20 20 75 33 32 20  k(u32 i){.  u32 
1940: 73 69 7a 65 2c 20 68 61 73 68 3b 0a 20 20 61 73  size, hash;.  as
1950: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1960: 74 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75  tex_held(mem3.mu
1970: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1980: 28 20 69 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( i>=1 );.  asse
1990: 72 74 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  rt( (mem3.aPool[
19a0: 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34  i-1].u.hdr.size4
19b0: 78 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 73  x & 1)==0 );.  s
19c0: 69 7a 65 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c  ize = mem3.aPool
19d0: 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65  [i-1].u.hdr.size
19e0: 34 78 2f 34 3b 0a 20 20 61 73 73 65 72 74 28 20  4x/4;.  assert( 
19f0: 73 69 7a 65 3d 3d 6d 65 6d 33 2e 61 50 6f 6f 6c  size==mem3.aPool
1a00: 5b 69 2b 73 69 7a 65 2d 31 5d 2e 75 2e 68 64 72  [i+size-1].u.hdr
1a10: 2e 70 72 65 76 53 69 7a 65 20 29 3b 0a 20 20 61  .prevSize );.  a
1a20: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 32 20 29  ssert( size>=2 )
1a30: 3b 0a 20 20 69 66 28 20 73 69 7a 65 20 3c 3d 20  ;.  if( size <= 
1a40: 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20 20 20 20  MX_SMALL ){.    
1a50: 6d 65 6d 73 79 73 33 4c 69 6e 6b 49 6e 74 6f 4c  memsys3LinkIntoL
1a60: 69 73 74 28 69 2c 20 26 6d 65 6d 33 2e 61 69 53  ist(i, &mem3.aiS
1a70: 6d 61 6c 6c 5b 73 69 7a 65 2d 32 5d 29 3b 0a 20  mall[size-2]);. 
1a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 61 73 68   }else{.    hash
1a90: 20 3d 20 73 69 7a 65 20 25 20 4e 5f 48 41 53 48   = size % N_HASH
1aa0: 3b 0a 20 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e  ;.    memsys3Lin
1ab0: 6b 49 6e 74 6f 4c 69 73 74 28 69 2c 20 26 6d 65  kIntoList(i, &me
1ac0: 6d 33 2e 61 69 48 61 73 68 5b 68 61 73 68 5d 29  m3.aiHash[hash])
1ad0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1ae0: 66 20 74 68 65 20 53 54 41 54 49 43 5f 4d 45 4d  f the STATIC_MEM
1af0: 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 61 6c   mutex is not al
1b00: 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
1b10: 69 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 6d  in it now. The m
1b20: 75 74 65 78 0a 2a 2a 20 77 69 6c 6c 20 61 6c 72  utex.** will alr
1b30: 65 61 64 79 20 62 65 20 68 65 6c 64 20 28 6f 62  eady be held (ob
1b40: 74 61 69 6e 65 64 20 62 79 20 63 6f 64 65 20 69  tained by code i
1b50: 6e 20 6d 61 6c 6c 6f 63 2e 63 29 20 69 66 0a 2a  n malloc.c) if.*
1b60: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
1b70: 6f 6e 66 69 67 2e 62 4d 65 6d 53 74 61 74 20 69  onfig.bMemStat i
1b80: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
1b90: 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 45 6e  c void memsys3En
1ba0: 74 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  ter(void){.  if(
1bb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1bc0: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 3d 3d 30  nfig.bMemstat==0
1bd0: 20 26 26 20 6d 65 6d 33 2e 6d 75 74 65 78 3d 3d   && mem3.mutex==
1be0: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 33 2e 6d 75  0 ){.    mem3.mu
1bf0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
1c00: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1c10: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 29  UTEX_STATIC_MEM)
1c20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 65 6d 33  mutex_enter(mem3
1c40: 2e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74 61 74 69  .mutex);.}.stati
1c50: 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 4c 65  c void memsys3Le
1c60: 61 76 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ave(void){.  sql
1c70: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c80: 28 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0a 7d 0a  (mem3.mutex);.}.
1c90: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
1ca0: 65 6e 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  en we are unable
1cb0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6e 20 61   to satisfy an a
1cc0: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 42 79  llocation of nBy
1cd0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
1ce0: 6f 69 64 20 6d 65 6d 73 79 73 33 4f 75 74 4f 66  oid memsys3OutOf
1cf0: 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 42 79 74 65  Memory(int nByte
1d00: 29 7b 0a 20 20 69 66 28 20 21 6d 65 6d 33 2e 61  ){.  if( !mem3.a
1d10: 6c 61 72 6d 42 75 73 79 20 29 7b 0a 20 20 20 20  larmBusy ){.    
1d20: 6d 65 6d 33 2e 61 6c 61 72 6d 42 75 73 79 20 3d  mem3.alarmBusy =
1d30: 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
1d40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d50: 6c 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29  ld(mem3.mutex) )
1d60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
1d70: 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 33 2e 6d  tex_leave(mem3.m
1d80: 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  utex);.    sqlit
1d90: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
1da0: 79 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 73 71  y(nByte);.    sq
1db0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1dc0: 72 28 6d 65 6d 33 2e 6d 75 74 65 78 29 3b 0a 20  r(mem3.mutex);. 
1dd0: 20 20 20 6d 65 6d 33 2e 61 6c 61 72 6d 42 75 73     mem3.alarmBus
1de0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  y = 0;.  }.}.../
1df0: 2a 0a 2a 2a 20 43 68 75 6e 6b 20 69 20 69 73 20  *.** Chunk i is 
1e00: 61 20 66 72 65 65 20 63 68 75 6e 6b 20 74 68 61  a free chunk tha
1e10: 74 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  t has been unlin
1e20: 6b 65 64 2e 20 20 41 64 6a 75 73 74 20 69 74 73  ked.  Adjust its
1e30: 20 0a 2a 2a 20 73 69 7a 65 20 70 61 72 61 6d 65   .** size parame
1e40: 74 65 72 73 20 66 6f 72 20 63 68 65 63 6b 2d 6f  ters for check-o
1e50: 75 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ut and return a 
1e60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 0a  pointer to the .
1e70: 2a 2a 20 75 73 65 72 20 70 6f 72 74 69 6f 6e 20  ** user portion 
1e80: 6f 66 20 74 68 65 20 63 68 75 6e 6b 2e 0a 2a 2f  of the chunk..*/
1e90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65  .static void *me
1ea0: 6d 73 79 73 33 43 68 65 63 6b 6f 75 74 28 75 33  msys3Checkout(u3
1eb0: 32 20 69 2c 20 75 33 32 20 6e 42 6c 6f 63 6b 29  2 i, u32 nBlock)
1ec0: 7b 0a 20 20 75 33 32 20 78 3b 0a 20 20 61 73 73  {.  u32 x;.  ass
1ed0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ee0: 65 78 5f 68 65 6c 64 28 6d 65 6d 33 2e 6d 75 74  ex_held(mem3.mut
1ef0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1f00: 20 69 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   i>=1 );.  asser
1f10: 74 28 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d  t( mem3.aPool[i-
1f20: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
1f30: 34 3d 3d 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 61  4==nBlock );.  a
1f40: 73 73 65 72 74 28 20 6d 65 6d 33 2e 61 50 6f 6f  ssert( mem3.aPoo
1f50: 6c 5b 69 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e  l[i+nBlock-1].u.
1f60: 68 64 72 2e 70 72 65 76 53 69 7a 65 3d 3d 6e 42  hdr.prevSize==nB
1f70: 6c 6f 63 6b 20 29 3b 0a 20 20 78 20 3d 20 6d 65  lock );.  x = me
1f80: 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e  m3.aPool[i-1].u.
1f90: 68 64 72 2e 73 69 7a 65 34 78 3b 0a 20 20 6d 65  hdr.size4x;.  me
1fa0: 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e  m3.aPool[i-1].u.
1fb0: 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6e 42 6c  hdr.size4x = nBl
1fc0: 6f 63 6b 2a 34 20 7c 20 31 20 7c 20 28 78 26 32  ock*4 | 1 | (x&2
1fd0: 29 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  );.  mem3.aPool[
1fe0: 69 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e 68 64  i+nBlock-1].u.hd
1ff0: 72 2e 70 72 65 76 53 69 7a 65 20 3d 20 6e 42 6c  r.prevSize = nBl
2000: 6f 63 6b 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f  ock;.  mem3.aPoo
2010: 6c 5b 69 2b 6e 42 6c 6f 63 6b 2d 31 5d 2e 75 2e  l[i+nBlock-1].u.
2020: 68 64 72 2e 73 69 7a 65 34 78 20 7c 3d 20 32 3b  hdr.size4x |= 2;
2030: 0a 20 20 72 65 74 75 72 6e 20 26 6d 65 6d 33 2e  .  return &mem3.
2040: 61 50 6f 6f 6c 5b 69 5d 3b 0a 7d 0a 0a 2f 2a 0a  aPool[i];.}../*.
2050: 2a 2a 20 43 61 72 76 65 20 61 20 70 69 65 63 65  ** Carve a piece
2060: 20 6f 66 66 20 6f 66 20 74 68 65 20 65 6e 64 20   off of the end 
2070: 6f 66 20 74 68 65 20 6d 65 6d 33 2e 69 4d 61 73  of the mem3.iMas
2080: 74 65 72 20 66 72 65 65 20 63 68 75 6e 6b 2e 0a  ter free chunk..
2090: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
20a0: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
20b0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 4f 72 2c 20  llocation.  Or, 
20c0: 69 66 20 74 68 65 20 6d 61 73 74 65 72 20 63 68  if the master ch
20d0: 75 6e 6b 0a 2a 2a 20 69 73 20 6e 6f 74 20 6c 61  unk.** is not la
20e0: 72 67 65 20 65 6e 6f 75 67 68 2c 20 72 65 74 75  rge enough, retu
20f0: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
2100: 76 6f 69 64 20 2a 6d 65 6d 73 79 73 33 46 72 6f  void *memsys3Fro
2110: 6d 4d 61 73 74 65 72 28 75 33 32 20 6e 42 6c 6f  mMaster(u32 nBlo
2120: 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ck){.  assert( s
2130: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2140: 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b  d(mem3.mutex) );
2150: 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 33 2e  .  assert( mem3.
2160: 73 7a 4d 61 73 74 65 72 3e 3d 6e 42 6c 6f 63 6b  szMaster>=nBlock
2170: 20 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 63 6b   );.  if( nBlock
2180: 3e 3d 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d  >=mem3.szMaster-
2190: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 65 20  1 ){.    /* Use 
21a0: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
21b0: 72 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  r */.    void *p
21c0: 20 3d 20 6d 65 6d 73 79 73 33 43 68 65 63 6b 6f   = memsys3Checko
21d0: 75 74 28 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2c  ut(mem3.iMaster,
21e0: 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 29 3b   mem3.szMaster);
21f0: 0a 20 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74 65  .    mem3.iMaste
2200: 72 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 33 2e  r = 0;.    mem3.
2210: 73 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  szMaster = 0;.  
2220: 20 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74 65 72 20    mem3.mnMaster 
2230: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
2240: 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  p;.  }else{.    
2250: 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 6d 61 73  /* Split the mas
2260: 74 65 72 20 62 6c 6f 63 6b 2e 20 20 52 65 74 75  ter block.  Retu
2270: 72 6e 20 74 68 65 20 74 61 69 6c 2e 20 2a 2f 0a  rn the tail. */.
2280: 20 20 20 20 75 33 32 20 6e 65 77 69 2c 20 78 3b      u32 newi, x;
2290: 0a 20 20 20 20 6e 65 77 69 20 3d 20 6d 65 6d 33  .    newi = mem3
22a0: 2e 69 4d 61 73 74 65 72 20 2b 20 6d 65 6d 33 2e  .iMaster + mem3.
22b0: 73 7a 4d 61 73 74 65 72 20 2d 20 6e 42 6c 6f 63  szMaster - nBloc
22c0: 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  k;.    assert( n
22d0: 65 77 69 20 3e 20 6d 65 6d 33 2e 69 4d 61 73 74  ewi > mem3.iMast
22e0: 65 72 2b 31 20 29 3b 0a 20 20 20 20 6d 65 6d 33  er+1 );.    mem3
22f0: 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73  .aPool[mem3.iMas
2300: 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 65  ter+mem3.szMaste
2310: 72 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53  r-1].u.hdr.prevS
2320: 69 7a 65 20 3d 20 6e 42 6c 6f 63 6b 3b 0a 20 20  ize = nBlock;.  
2330: 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d    mem3.aPool[mem
2340: 33 2e 69 4d 61 73 74 65 72 2b 6d 65 6d 33 2e 73  3.iMaster+mem3.s
2350: 7a 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72  zMaster-1].u.hdr
2360: 2e 73 69 7a 65 34 78 20 7c 3d 20 32 3b 0a 20 20  .size4x |= 2;.  
2370: 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6e 65 77    mem3.aPool[new
2380: 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34  i-1].u.hdr.size4
2390: 78 20 3d 20 6e 42 6c 6f 63 6b 2a 34 20 2b 20 31  x = nBlock*4 + 1
23a0: 3b 0a 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73  ;.    mem3.szMas
23b0: 74 65 72 20 2d 3d 20 6e 42 6c 6f 63 6b 3b 0a 20  ter -= nBlock;. 
23c0: 20 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6e 65     mem3.aPool[ne
23d0: 77 69 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76  wi-1].u.hdr.prev
23e0: 53 69 7a 65 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61  Size = mem3.szMa
23f0: 73 74 65 72 3b 0a 20 20 20 20 78 20 3d 20 6d 65  ster;.    x = me
2400: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
2410: 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73  aster-1].u.hdr.s
2420: 69 7a 65 34 78 20 26 20 32 3b 0a 20 20 20 20 6d  ize4x & 2;.    m
2430: 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69  em3.aPool[mem3.i
2440: 4d 61 73 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e  Master-1].u.hdr.
2450: 73 69 7a 65 34 78 20 3d 20 6d 65 6d 33 2e 73 7a  size4x = mem3.sz
2460: 4d 61 73 74 65 72 2a 34 20 7c 20 78 3b 0a 20 20  Master*4 | x;.  
2470: 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73    if( mem3.szMas
2480: 74 65 72 20 3c 20 6d 65 6d 33 2e 6d 6e 4d 61 73  ter < mem3.mnMas
2490: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ter ){.      mem
24a0: 33 2e 6d 6e 4d 61 73 74 65 72 20 3d 20 6d 65 6d  3.mnMaster = mem
24b0: 33 2e 73 7a 4d 61 73 74 65 72 3b 0a 20 20 20 20  3.szMaster;.    
24c0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  }.    return (vo
24d0: 69 64 2a 29 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  id*)&mem3.aPool[
24e0: 6e 65 77 69 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  newi];.  }.}../*
24f0: 0a 2a 2a 20 2a 70 52 6f 6f 74 20 69 73 20 74 68  .** *pRoot is th
2500: 65 20 68 65 61 64 20 6f 66 20 61 20 6c 69 73 74  e head of a list
2510: 20 6f 66 20 66 72 65 65 20 63 68 75 6e 6b 73 20   of free chunks 
2520: 6f 66 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  of the same size
2530: 0a 2a 2a 20 6f 72 20 73 61 6d 65 20 73 69 7a 65  .** or same size
2540: 20 68 61 73 68 2e 20 20 49 6e 20 6f 74 68 65 72   hash.  In other
2550: 20 77 6f 72 64 73 2c 20 2a 70 52 6f 6f 74 20 69   words, *pRoot i
2560: 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 65 69  s an entry in ei
2570: 74 68 65 72 0a 2a 2a 20 6d 65 6d 33 2e 61 69 53  ther.** mem3.aiS
2580: 6d 61 6c 6c 5b 5d 20 6f 72 20 6d 65 6d 33 2e 61  mall[] or mem3.a
2590: 69 48 61 73 68 5b 5d 2e 20 20 0a 2a 2a 0a 2a 2a  iHash[].  .**.**
25a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
25b0: 61 6d 69 6e 65 73 20 61 6c 6c 20 65 6e 74 72 69  amines all entri
25c0: 65 73 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  es on the given 
25d0: 6c 69 73 74 20 61 6e 64 20 74 72 69 65 73 0a 2a  list and tries.*
25e0: 2a 20 74 6f 20 63 6f 61 6c 65 73 63 65 20 65 61  * to coalesce ea
25f0: 63 68 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ch entries with 
2600: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 63 68  adjacent free ch
2610: 75 6e 6b 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  unks.  .**.** If
2620: 20 69 74 20 73 65 65 73 20 61 20 63 68 75 6e 6b   it sees a chunk
2630: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
2640: 74 68 61 6e 20 6d 65 6d 33 2e 69 4d 61 73 74 65  than mem3.iMaste
2650: 72 2c 20 69 74 20 72 65 70 6c 61 63 65 73 20 0a  r, it replaces .
2660: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ** the current m
2670: 65 6d 33 2e 69 4d 61 73 74 65 72 20 77 69 74 68  em3.iMaster with
2680: 20 74 68 65 20 6e 65 77 20 6c 61 72 67 65 72 20   the new larger 
2690: 63 68 75 6e 6b 2e 20 20 49 6e 20 6f 72 64 65 72  chunk.  In order
26a0: 20 66 6f 72 0a 2a 2a 20 74 68 69 73 20 6d 65 6d   for.** this mem
26b0: 33 2e 69 4d 61 73 74 65 72 20 72 65 70 6c 61 63  3.iMaster replac
26c0: 65 6d 65 6e 74 20 74 6f 20 77 6f 72 6b 2c 20 74  ement to work, t
26d0: 68 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 20  he master chunk 
26e0: 6d 75 73 74 20 62 65 0a 2a 2a 20 6c 69 6e 6b 65  must be.** linke
26f0: 64 20 69 6e 74 6f 20 74 68 65 20 68 61 73 68 20  d into the hash 
2700: 74 61 62 6c 65 73 2e 20 20 54 68 61 74 20 69 73  tables.  That is
2710: 20 6e 6f 74 20 74 68 65 20 6e 6f 72 6d 61 6c 20   not the normal 
2720: 73 74 61 74 65 20 6f 66 0a 2a 2a 20 61 66 66 61  state of.** affa
2730: 69 72 73 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20  irs, of course. 
2740: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   The calling rou
2750: 74 69 6e 65 20 6d 75 73 74 20 6c 69 6e 6b 20 74  tine must link t
2760: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 63 68 75  he master.** chu
2770: 6e 6b 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69  nk before invoki
2780: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  ng this routine,
2790: 20 74 68 65 6e 20 6d 75 73 74 20 75 6e 6c 69 6e   then must unlin
27a0: 6b 20 74 68 65 20 28 70 6f 73 73 69 62 6c 79 0a  k the (possibly.
27b0: 2a 2a 20 63 68 61 6e 67 65 64 29 20 6d 61 73 74  ** changed) mast
27c0: 65 72 20 63 68 75 6e 6b 20 6f 6e 63 65 20 74 68  er chunk once th
27d0: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 66  is routine has f
27e0: 69 6e 69 73 68 65 64 2e 0a 2a 2f 0a 73 74 61 74  inished..*/.stat
27f0: 69 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 4d  ic void memsys3M
2800: 65 72 67 65 28 75 33 32 20 2a 70 52 6f 6f 74 29  erge(u32 *pRoot)
2810: 7b 0a 20 20 75 33 32 20 69 4e 65 78 74 2c 20 70  {.  u32 iNext, p
2820: 72 65 76 2c 20 73 69 7a 65 2c 20 69 2c 20 78 3b  rev, size, i, x;
2830: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2840: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
2850: 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20  em3.mutex) );.  
2860: 66 6f 72 28 69 3d 2a 70 52 6f 6f 74 3b 20 69 3e  for(i=*pRoot; i>
2870: 30 3b 20 69 3d 69 4e 65 78 74 29 7b 0a 20 20 20  0; i=iNext){.   
2880: 20 69 4e 65 78 74 20 3d 20 6d 65 6d 33 2e 61 50   iNext = mem3.aP
2890: 6f 6f 6c 5b 69 5d 2e 75 2e 6c 69 73 74 2e 6e 65  ool[i].u.list.ne
28a0: 78 74 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 6d  xt;.    size = m
28b0: 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75  em3.aPool[i-1].u
28c0: 2e 68 64 72 2e 73 69 7a 65 34 78 3b 0a 20 20 20  .hdr.size4x;.   
28d0: 20 61 73 73 65 72 74 28 20 28 73 69 7a 65 26 31   assert( (size&1
28e0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
28f0: 28 73 69 7a 65 26 32 29 3d 3d 30 20 29 7b 0a 20  (size&2)==0 ){. 
2900: 20 20 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69       memsys3Unli
2910: 6e 6b 46 72 6f 6d 4c 69 73 74 28 69 2c 20 70 52  nkFromList(i, pR
2920: 6f 6f 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  oot);.      asse
2930: 72 74 28 20 69 20 3e 20 6d 65 6d 33 2e 61 50 6f  rt( i > mem3.aPo
2940: 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 70 72  ol[i-1].u.hdr.pr
2950: 65 76 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  evSize );.      
2960: 70 72 65 76 20 3d 20 69 20 2d 20 6d 65 6d 33 2e  prev = i - mem3.
2970: 61 50 6f 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72  aPool[i-1].u.hdr
2980: 2e 70 72 65 76 53 69 7a 65 3b 0a 20 20 20 20 20  .prevSize;.     
2990: 20 69 66 28 20 70 72 65 76 3d 3d 69 4e 65 78 74   if( prev==iNext
29a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4e 65 78   ){.        iNex
29b0: 74 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 70  t = mem3.aPool[p
29c0: 72 65 76 5d 2e 75 2e 6c 69 73 74 2e 6e 65 78 74  rev].u.list.next
29d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29e0: 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 70 72  memsys3Unlink(pr
29f0: 65 76 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  ev);.      size 
2a00: 3d 20 69 20 2b 20 73 69 7a 65 2f 34 20 2d 20 70  = i + size/4 - p
2a10: 72 65 76 3b 0a 20 20 20 20 20 20 78 20 3d 20 6d  rev;.      x = m
2a20: 65 6d 33 2e 61 50 6f 6f 6c 5b 70 72 65 76 2d 31  em3.aPool[prev-1
2a30: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26  ].u.hdr.size4x &
2a40: 20 32 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61   2;.      mem3.a
2a50: 50 6f 6f 6c 5b 70 72 65 76 2d 31 5d 2e 75 2e 68  Pool[prev-1].u.h
2a60: 64 72 2e 73 69 7a 65 34 78 20 3d 20 73 69 7a 65  dr.size4x = size
2a70: 2a 34 20 7c 20 78 3b 0a 20 20 20 20 20 20 6d 65  *4 | x;.      me
2a80: 6d 33 2e 61 50 6f 6f 6c 5b 70 72 65 76 2b 73 69  m3.aPool[prev+si
2a90: 7a 65 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76  ze-1].u.hdr.prev
2aa0: 53 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20 20 20  Size = size;.   
2ab0: 20 20 20 6d 65 6d 73 79 73 33 4c 69 6e 6b 28 70     memsys3Link(p
2ac0: 72 65 76 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  rev);.      i = 
2ad0: 70 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  prev;.    }else{
2ae0: 0a 20 20 20 20 20 20 73 69 7a 65 20 2f 3d 20 34  .      size /= 4
2af0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b00: 73 69 7a 65 3e 6d 65 6d 33 2e 73 7a 4d 61 73 74  size>mem3.szMast
2b10: 65 72 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 33  er ){.      mem3
2b20: 2e 69 4d 61 73 74 65 72 20 3d 20 69 3b 0a 20 20  .iMaster = i;.  
2b30: 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65      mem3.szMaste
2b40: 72 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 7d 0a  r = size;.    }.
2b50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2b60: 75 72 6e 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6d  urn a block of m
2b70: 65 6d 6f 72 79 20 6f 66 20 61 74 20 6c 65 61 73  emory of at leas
2b80: 74 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  t nBytes in size
2b90: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
2ba0: 20 69 66 20 75 6e 61 62 6c 65 2e 0a 2a 2a 0a 2a   if unable..**.*
2bb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2bc0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2bd0: 20 6e 65 63 65 73 73 61 72 79 20 6d 75 74 65 78   necessary mutex
2be0: 65 73 2c 20 69 66 20 61 6e 79 2c 20 61 72 65 0a  es, if any, are.
2bf0: 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  ** already held 
2c00: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 48  by the caller. H
2c10: 65 6e 63 65 20 22 55 6e 73 61 66 65 22 2e 0a 2a  ence "Unsafe"..*
2c20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d  /.static void *m
2c30: 65 6d 73 79 73 33 4d 61 6c 6c 6f 63 55 6e 73 61  emsys3MallocUnsa
2c40: 66 65 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  fe(int nByte){. 
2c50: 20 75 33 32 20 69 3b 0a 20 20 75 33 32 20 6e 42   u32 i;.  u32 nB
2c60: 6c 6f 63 6b 3b 0a 20 20 75 33 32 20 74 6f 46 72  lock;.  u32 toFr
2c70: 65 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ee;..  assert( s
2c80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c90: 64 28 6d 65 6d 33 2e 6d 75 74 65 78 29 20 29 3b  d(mem3.mutex) );
2ca0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
2cb0: 66 28 4d 65 6d 33 42 6c 6f 63 6b 29 3d 3d 38 20  f(Mem3Block)==8 
2cc0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d  );.  if( nByte<=
2cd0: 31 32 20 29 7b 0a 20 20 20 20 6e 42 6c 6f 63 6b  12 ){.    nBlock
2ce0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
2cf0: 20 20 20 6e 42 6c 6f 63 6b 20 3d 20 28 6e 42 79     nBlock = (nBy
2d00: 74 65 20 2b 20 31 31 29 2f 38 3b 0a 20 20 7d 0a  te + 11)/8;.  }.
2d10: 20 20 61 73 73 65 72 74 28 20 6e 42 6c 6f 63 6b    assert( nBlock
2d20: 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 20 53 54 45  >=2 );..  /* STE
2d30: 50 20 31 3a 0a 20 20 2a 2a 20 4c 6f 6f 6b 20 66  P 1:.  ** Look f
2d40: 6f 72 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  or an entry of t
2d50: 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
2d60: 69 6e 20 65 69 74 68 65 72 20 74 68 65 20 73 6d  in either the sm
2d70: 61 6c 6c 0a 20 20 2a 2a 20 63 68 75 6e 6b 20 74  all.  ** chunk t
2d80: 61 62 6c 65 20 6f 72 20 69 6e 20 74 68 65 20 6c  able or in the l
2d90: 61 72 67 65 20 63 68 75 6e 6b 20 68 61 73 68 20  arge chunk hash 
2da0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a  table.  This is.
2db0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
2dc0: 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65  most of the time
2dd0: 20 28 61 62 6f 75 74 20 39 20 74 69 6d 65 73 20   (about 9 times 
2de0: 6f 75 74 20 6f 66 20 31 30 29 2e 0a 20 20 2a 2f  out of 10)..  */
2df0: 0a 20 20 69 66 28 20 6e 42 6c 6f 63 6b 20 3c 3d  .  if( nBlock <=
2e00: 20 4d 58 5f 53 4d 41 4c 4c 20 29 7b 0a 20 20 20   MX_SMALL ){.   
2e10: 20 69 20 3d 20 6d 65 6d 33 2e 61 69 53 6d 61 6c   i = mem3.aiSmal
2e20: 6c 5b 6e 42 6c 6f 63 6b 2d 32 5d 3b 0a 20 20 20  l[nBlock-2];.   
2e30: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
2e40: 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 46    memsys3UnlinkF
2e50: 72 6f 6d 4c 69 73 74 28 69 2c 20 26 6d 65 6d 33  romList(i, &mem3
2e60: 2e 61 69 53 6d 61 6c 6c 5b 6e 42 6c 6f 63 6b 2d  .aiSmall[nBlock-
2e70: 32 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  2]);.      retur
2e80: 6e 20 6d 65 6d 73 79 73 33 43 68 65 63 6b 6f 75  n memsys3Checkou
2e90: 74 28 69 2c 20 6e 42 6c 6f 63 6b 29 3b 0a 20 20  t(i, nBlock);.  
2ea0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2eb0: 20 69 6e 74 20 68 61 73 68 20 3d 20 6e 42 6c 6f   int hash = nBlo
2ec0: 63 6b 20 25 20 4e 5f 48 41 53 48 3b 0a 20 20 20  ck % N_HASH;.   
2ed0: 20 66 6f 72 28 69 3d 6d 65 6d 33 2e 61 69 48 61   for(i=mem3.aiHa
2ee0: 73 68 5b 68 61 73 68 5d 3b 20 69 3e 30 3b 20 69  sh[hash]; i>0; i
2ef0: 3d 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 2e 75  =mem3.aPool[i].u
2f00: 2e 6c 69 73 74 2e 6e 65 78 74 29 7b 0a 20 20 20  .list.next){.   
2f10: 20 20 20 69 66 28 20 6d 65 6d 33 2e 61 50 6f 6f     if( mem3.aPoo
2f20: 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  l[i-1].u.hdr.siz
2f30: 65 34 78 2f 34 3d 3d 6e 42 6c 6f 63 6b 20 29 7b  e4x/4==nBlock ){
2f40: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 79 73 33  .        memsys3
2f50: 55 6e 6c 69 6e 6b 46 72 6f 6d 4c 69 73 74 28 69  UnlinkFromList(i
2f60: 2c 20 26 6d 65 6d 33 2e 61 69 48 61 73 68 5b 68  , &mem3.aiHash[h
2f70: 61 73 68 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  ash]);.        r
2f80: 65 74 75 72 6e 20 6d 65 6d 73 79 73 33 43 68 65  eturn memsys3Che
2f90: 63 6b 6f 75 74 28 69 2c 20 6e 42 6c 6f 63 6b 29  ckout(i, nBlock)
2fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2fb0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 54 45 50 20 32    }..  /* STEP 2
2fc0: 3a 0a 20 20 2a 2a 20 54 72 79 20 74 6f 20 73 61  :.  ** Try to sa
2fd0: 74 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61  tisfy the alloca
2fe0: 74 69 6f 6e 20 62 79 20 63 61 72 76 69 6e 67 20  tion by carving 
2ff0: 61 20 70 69 65 63 65 20 6f 66 66 20 6f 66 20 74  a piece off of t
3000: 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  he end.  ** of t
3010: 68 65 20 6d 61 73 74 65 72 20 63 68 75 6e 6b 2e  he master chunk.
3020: 20 20 54 68 69 73 20 73 74 65 70 20 75 73 75 61    This step usua
3030: 6c 6c 79 20 77 6f 72 6b 73 20 69 66 20 73 74 65  lly works if ste
3040: 70 20 31 20 66 61 69 6c 73 2e 0a 20 20 2a 2f 0a  p 1 fails..  */.
3050: 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61 73    if( mem3.szMas
3060: 74 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 7b 0a 20  ter>=nBlock ){. 
3070: 20 20 20 72 65 74 75 72 6e 20 6d 65 6d 73 79 73     return memsys
3080: 33 46 72 6f 6d 4d 61 73 74 65 72 28 6e 42 6c 6f  3FromMaster(nBlo
3090: 63 6b 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ck);.  }...  /* 
30a0: 53 54 45 50 20 33 3a 20 20 0a 20 20 2a 2a 20 4c  STEP 3:  .  ** L
30b0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
30c0: 65 6e 74 69 72 65 20 6d 65 6d 6f 72 79 20 70 6f  entire memory po
30d0: 6f 6c 2e 20 20 43 6f 61 6c 65 73 63 65 20 61 64  ol.  Coalesce ad
30e0: 6a 61 63 65 6e 74 20 66 72 65 65 0a 20 20 2a 2a  jacent free.  **
30f0: 20 63 68 75 6e 6b 73 2e 20 20 52 65 63 6f 6d 70   chunks.  Recomp
3100: 75 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 63  ute the master c
3110: 68 75 6e 6b 20 61 73 20 74 68 65 20 6c 61 72 67  hunk as the larg
3120: 65 73 74 20 66 72 65 65 20 63 68 75 6e 6b 2e 0a  est free chunk..
3130: 20 20 2a 2a 20 54 68 65 6e 20 74 72 79 20 61 67    ** Then try ag
3140: 61 69 6e 20 74 6f 20 73 61 74 69 73 66 79 20 74  ain to satisfy t
3150: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 62 79  he allocation by
3160: 20 63 61 72 76 69 6e 67 20 61 20 70 69 65 63 65   carving a piece
3170: 20 6f 66 66 0a 20 20 2a 2a 20 6f 66 20 74 68 65   off.  ** of the
3180: 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
3190: 65 72 20 63 68 75 6e 6b 2e 20 20 54 68 69 73 20  er chunk.  This 
31a0: 73 74 65 70 20 68 61 70 70 65 6e 73 20 76 65 72  step happens ver
31b0: 79 0a 20 20 2a 2a 20 72 61 72 65 6c 79 20 28 77  y.  ** rarely (w
31c0: 65 20 68 6f 70 65 21 29 0a 20 20 2a 2f 0a 20 20  e hope!).  */.  
31d0: 66 6f 72 28 74 6f 46 72 65 65 3d 6e 42 6c 6f 63  for(toFree=nBloc
31e0: 6b 2a 31 36 3b 20 74 6f 46 72 65 65 3c 28 6d 65  k*16; toFree<(me
31f0: 6d 33 2e 6e 50 6f 6f 6c 2a 31 36 29 3b 20 74 6f  m3.nPool*16); to
3200: 46 72 65 65 20 2a 3d 20 32 29 7b 0a 20 20 20 20  Free *= 2){.    
3210: 6d 65 6d 73 79 73 33 4f 75 74 4f 66 4d 65 6d 6f  memsys3OutOfMemo
3220: 72 79 28 74 6f 46 72 65 65 29 3b 0a 20 20 20 20  ry(toFree);.    
3230: 69 66 28 20 6d 65 6d 33 2e 69 4d 61 73 74 65 72  if( mem3.iMaster
3240: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79 73   ){.      memsys
3250: 33 4c 69 6e 6b 28 6d 65 6d 33 2e 69 4d 61 73 74  3Link(mem3.iMast
3260: 65 72 29 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e  er);.      mem3.
3270: 69 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  iMaster = 0;.   
3280: 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72     mem3.szMaster
3290: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
32a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48 41 53  for(i=0; i<N_HAS
32b0: 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6d  H; i++){.      m
32c0: 65 6d 73 79 73 33 4d 65 72 67 65 28 26 6d 65 6d  emsys3Merge(&mem
32d0: 33 2e 61 69 48 61 73 68 5b 69 5d 29 3b 0a 20 20  3.aiHash[i]);.  
32e0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
32f0: 20 69 3c 4d 58 5f 53 4d 41 4c 4c 2d 31 3b 20 69   i<MX_SMALL-1; i
3300: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 79  ++){.      memsy
3310: 73 33 4d 65 72 67 65 28 26 6d 65 6d 33 2e 61 69  s3Merge(&mem3.ai
3320: 53 6d 61 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d  Small[i]);.    }
3330: 0a 20 20 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a  .    if( mem3.sz
3340: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
3350: 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 6d 65  memsys3Unlink(me
3360: 6d 33 2e 69 4d 61 73 74 65 72 29 3b 0a 20 20 20  m3.iMaster);.   
3370: 20 20 20 69 66 28 20 6d 65 6d 33 2e 73 7a 4d 61     if( mem3.szMa
3380: 73 74 65 72 3e 3d 6e 42 6c 6f 63 6b 20 29 7b 0a  ster>=nBlock ){.
3390: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
33a0: 65 6d 73 79 73 33 46 72 6f 6d 4d 61 73 74 65 72  emsys3FromMaster
33b0: 28 6e 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  (nBlock);.      
33c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
33d0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
33e0: 20 61 62 6f 76 65 20 77 6f 72 6b 65 64 2c 20 74   above worked, t
33f0: 68 65 6e 20 77 65 20 66 61 69 6c 2e 20 2a 2f 0a  hen we fail. */.
3400: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3410: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 6f 75 74  *.** Free an out
3420: 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20  standing memory 
3430: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  allocation..**.*
3440: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3450: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
3460: 20 6e 65 63 65 73 73 61 72 79 20 6d 75 74 65 78   necessary mutex
3470: 65 73 2c 20 69 66 20 61 6e 79 2c 20 61 72 65 0a  es, if any, are.
3480: 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  ** already held 
3490: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 48  by the caller. H
34a0: 65 6e 63 65 20 22 55 6e 73 61 66 65 22 2e 0a 2a  ence "Unsafe"..*
34b0: 2f 0a 76 6f 69 64 20 6d 65 6d 73 79 73 33 46 72  /.void memsys3Fr
34c0: 65 65 55 6e 73 61 66 65 28 76 6f 69 64 20 2a 70  eeUnsafe(void *p
34d0: 4f 6c 64 29 7b 0a 20 20 4d 65 6d 33 42 6c 6f 63  Old){.  Mem3Bloc
34e0: 6b 20 2a 70 20 3d 20 28 4d 65 6d 33 42 6c 6f 63  k *p = (Mem3Bloc
34f0: 6b 2a 29 70 4f 6c 64 3b 0a 20 20 69 6e 74 20 69  k*)pOld;.  int i
3500: 3b 0a 20 20 75 33 32 20 73 69 7a 65 2c 20 78 3b  ;.  u32 size, x;
3510: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3520: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 65  e3_mutex_held(me
3530: 6d 33 2e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  m3.mutex) );.  a
3540: 73 73 65 72 74 28 20 70 3e 6d 65 6d 33 2e 61 50  ssert( p>mem3.aP
3550: 6f 6f 6c 20 26 26 20 70 3c 26 6d 65 6d 33 2e 61  ool && p<&mem3.a
3560: 50 6f 6f 6c 5b 6d 65 6d 33 2e 6e 50 6f 6f 6c 5d  Pool[mem3.nPool]
3570: 20 29 3b 0a 20 20 69 20 3d 20 70 20 2d 20 6d 65   );.  i = p - me
3580: 6d 33 2e 61 50 6f 6f 6c 3b 0a 20 20 61 73 73 65  m3.aPool;.  asse
3590: 72 74 28 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  rt( (mem3.aPool[
35a0: 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34  i-1].u.hdr.size4
35b0: 78 26 31 29 3d 3d 31 20 29 3b 0a 20 20 73 69 7a  x&1)==1 );.  siz
35c0: 65 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69  e = mem3.aPool[i
35d0: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
35e0: 2f 34 3b 0a 20 20 61 73 73 65 72 74 28 20 69 2b  /4;.  assert( i+
35f0: 73 69 7a 65 3c 3d 6d 65 6d 33 2e 6e 50 6f 6f 6c  size<=mem3.nPool
3600: 2b 31 20 29 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f  +1 );.  mem3.aPo
3610: 6f 6c 5b 69 2d 31 5d 2e 75 2e 68 64 72 2e 73 69  ol[i-1].u.hdr.si
3620: 7a 65 34 78 20 26 3d 20 7e 31 3b 0a 20 20 6d 65  ze4x &= ~1;.  me
3630: 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d  m3.aPool[i+size-
3640: 31 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a  1].u.hdr.prevSiz
3650: 65 20 3d 20 73 69 7a 65 3b 0a 20 20 6d 65 6d 33  e = size;.  mem3
3660: 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2d 31 5d  .aPool[i+size-1]
3670: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 3d  .u.hdr.size4x &=
3680: 20 7e 32 3b 0a 20 20 6d 65 6d 73 79 73 33 4c 69   ~2;.  memsys3Li
3690: 6e 6b 28 69 29 3b 0a 0a 20 20 2f 2a 20 54 72 79  nk(i);..  /* Try
36a0: 20 74 6f 20 65 78 70 61 6e 64 20 74 68 65 20 6d   to expand the m
36b0: 61 73 74 65 72 20 75 73 69 6e 67 20 74 68 65 20  aster using the 
36c0: 6e 65 77 6c 79 20 66 72 65 65 64 20 63 68 75 6e  newly freed chun
36d0: 6b 20 2a 2f 0a 20 20 69 66 28 20 6d 65 6d 33 2e  k */.  if( mem3.
36e0: 69 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 77  iMaster ){.    w
36f0: 68 69 6c 65 28 20 28 6d 65 6d 33 2e 61 50 6f 6f  hile( (mem3.aPoo
3700: 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31  l[mem3.iMaster-1
3710: 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 26 32  ].u.hdr.size4x&2
3720: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 69  )==0 ){.      si
3730: 7a 65 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  ze = mem3.aPool[
3740: 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e  mem3.iMaster-1].
3750: 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 3b 0a  u.hdr.prevSize;.
3760: 20 20 20 20 20 20 6d 65 6d 33 2e 69 4d 61 73 74        mem3.iMast
3770: 65 72 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  er -= size;.    
3780: 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 20    mem3.szMaster 
3790: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 6d  += size;.      m
37a0: 65 6d 73 79 73 33 55 6e 6c 69 6e 6b 28 6d 65 6d  emsys3Unlink(mem
37b0: 33 2e 69 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  3.iMaster);.    
37c0: 20 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c    x = mem3.aPool
37d0: 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d  [mem3.iMaster-1]
37e0: 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20  .u.hdr.size4x & 
37f0: 32 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50  2;.      mem3.aP
3800: 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72  ool[mem3.iMaster
3810: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
3820: 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72   = mem3.szMaster
3830: 2a 34 20 7c 20 78 3b 0a 20 20 20 20 20 20 6d 65  *4 | x;.      me
3840: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
3850: 61 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73  aster+mem3.szMas
3860: 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 70 72 65  ter-1].u.hdr.pre
3870: 76 53 69 7a 65 20 3d 20 6d 65 6d 33 2e 73 7a 4d  vSize = mem3.szM
3880: 61 73 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  aster;.    }.   
3890: 20 78 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b   x = mem3.aPool[
38a0: 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2d 31 5d 2e  mem3.iMaster-1].
38b0: 75 2e 68 64 72 2e 73 69 7a 65 34 78 20 26 20 32  u.hdr.size4x & 2
38c0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 6d 65  ;.    while( (me
38d0: 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d  m3.aPool[mem3.iM
38e0: 61 73 74 65 72 2b 6d 65 6d 33 2e 73 7a 4d 61 73  aster+mem3.szMas
38f0: 74 65 72 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  ter-1].u.hdr.siz
3900: 65 34 78 26 31 29 3d 3d 30 20 29 7b 0a 20 20 20  e4x&1)==0 ){.   
3910: 20 20 20 6d 65 6d 73 79 73 33 55 6e 6c 69 6e 6b     memsys3Unlink
3920: 28 6d 65 6d 33 2e 69 4d 61 73 74 65 72 2b 6d 65  (mem3.iMaster+me
3930: 6d 33 2e 73 7a 4d 61 73 74 65 72 29 3b 0a 20 20  m3.szMaster);.  
3940: 20 20 20 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65      mem3.szMaste
3950: 72 20 2b 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  r += mem3.aPool[
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 2d 31 5d 2e 75 2e  3.szMaster-1].u.
3980: 68 64 72 2e 73 69 7a 65 34 78 2f 34 3b 0a 20 20  hdr.size4x/4;.  
3990: 20 20 20 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 2d 31 5d 2e 75  em3.iMaster-1].u
39b0: 2e 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 6d 65  .hdr.size4x = me
39c0: 6d 33 2e 73 7a 4d 61 73 74 65 72 2a 34 20 7c 20  m3.szMaster*4 | 
39d0: 78 3b 0a 20 20 20 20 20 20 6d 65 6d 33 2e 61 50  x;.      mem3.aP
39e0: 6f 6f 6c 5b 6d 65 6d 33 2e 69 4d 61 73 74 65 72  ool[mem3.iMaster
39f0: 2b 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72 2d 31  +mem3.szMaster-1
3a00: 5d 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65  ].u.hdr.prevSize
3a10: 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74 65 72   = mem3.szMaster
3a20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
3a30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3a40: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
3a50: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
3a60: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  n, in bytes.  Th
3a70: 65 0a 2a 2a 20 73 69 7a 65 20 72 65 74 75 72 6e  e.** size return
3a80: 65 64 20 6f 6d 69 74 73 20 74 68 65 20 38 2d 62  ed omits the 8-b
3a90: 79 74 65 20 68 65 61 64 65 72 20 6f 76 65 72 68  yte header overh
3aa0: 65 61 64 2e 20 20 54 68 69 73 20 6f 6e 6c 79 0a  ead.  This only.
3ab0: 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 63 68 75  ** works for chu
3ac0: 6e 6b 73 20 74 68 61 74 20 61 72 65 20 63 75 72  nks that are cur
3ad0: 72 65 6e 74 6c 79 20 63 68 65 63 6b 65 64 20 6f  rently checked o
3ae0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ut..*/.static in
3af0: 74 20 6d 65 6d 73 79 73 33 53 69 7a 65 28 76 6f  t memsys3Size(vo
3b00: 69 64 20 2a 70 29 7b 0a 20 20 4d 65 6d 33 42 6c  id *p){.  Mem3Bl
3b10: 6f 63 6b 20 2a 70 42 6c 6f 63 6b 3b 0a 20 20 69  ock *pBlock;.  i
3b20: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3b30: 20 30 3b 0a 20 20 70 42 6c 6f 63 6b 20 3d 20 28   0;.  pBlock = (
3b40: 4d 65 6d 33 42 6c 6f 63 6b 2a 29 70 3b 0a 20 20  Mem3Block*)p;.  
3b50: 61 73 73 65 72 74 28 20 28 70 42 6c 6f 63 6b 5b  assert( (pBlock[
3b60: 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78  -1].u.hdr.size4x
3b70: 26 31 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  &1)!=0 );.  retu
3b80: 72 6e 20 28 70 42 6c 6f 63 6b 5b 2d 31 5d 2e 75  rn (pBlock[-1].u
3b90: 2e 68 64 72 2e 73 69 7a 65 34 78 26 7e 33 29 2a  .hdr.size4x&~3)*
3ba0: 32 20 2d 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2 - 4;.}../*.** 
3bb0: 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65  Round up a reque
3bc0: 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e  st size to the n
3bd0: 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61  ext valid alloca
3be0: 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  tion size..*/.st
3bf0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 33  atic int memsys3
3c00: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
3c10: 20 20 69 66 28 20 6e 3c 3d 31 32 20 29 7b 0a 20    if( n<=12 ){. 
3c20: 20 20 20 72 65 74 75 72 6e 20 31 32 3b 0a 20 20     return 12;.  
3c30: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
3c40: 6e 20 28 28 6e 2b 31 31 29 26 7e 37 29 20 2d 20  n ((n+11)&~7) - 
3c50: 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  4;.  }.}../*.** 
3c60: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20  Allocate nBytes 
3c70: 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  of memory..*/.st
3c80: 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 73 79  atic void *memsy
3c90: 73 33 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  s3Malloc(int nBy
3ca0: 74 65 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tes){.  sqlite3_
3cb0: 69 6e 74 36 34 20 2a 70 3b 0a 20 20 61 73 73 65  int64 *p;.  asse
3cc0: 72 74 28 20 6e 42 79 74 65 73 3e 30 20 29 3b 20  rt( nBytes>0 ); 
3cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c           /* mall
3ce0: 6f 63 2e 63 20 66 69 6c 74 65 72 73 20 6f 75 74  oc.c filters out
3cf0: 20 30 20 62 79 74 65 20 72 65 71 75 65 73 74 73   0 byte requests
3d00: 20 2a 2f 0a 20 20 6d 65 6d 73 79 73 33 45 6e 74   */.  memsys3Ent
3d10: 65 72 28 29 3b 0a 20 20 70 20 3d 20 6d 65 6d 73  er();.  p = mems
3d20: 79 73 33 4d 61 6c 6c 6f 63 55 6e 73 61 66 65 28  ys3MallocUnsafe(
3d30: 6e 42 79 74 65 73 29 3b 0a 20 20 6d 65 6d 73 79  nBytes);.  memsy
3d40: 73 33 4c 65 61 76 65 28 29 3b 0a 20 20 72 65 74  s3Leave();.  ret
3d50: 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 20 0a 7d  urn (void*)p; .}
3d60: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
3d70: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d  ory..*/.void mem
3d80: 73 79 73 33 46 72 65 65 28 76 6f 69 64 20 2a 70  sys3Free(void *p
3d90: 50 72 69 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  Prior){.  assert
3da0: 28 20 70 50 72 69 6f 72 20 29 3b 0a 20 20 6d 65  ( pPrior );.  me
3db0: 6d 73 79 73 33 45 6e 74 65 72 28 29 3b 0a 20 20  msys3Enter();.  
3dc0: 6d 65 6d 73 79 73 33 46 72 65 65 55 6e 73 61 66  memsys3FreeUnsaf
3dd0: 65 28 70 50 72 69 6f 72 29 3b 0a 20 20 6d 65 6d  e(pPrior);.  mem
3de0: 73 79 73 33 4c 65 61 76 65 28 29 3b 0a 7d 0a 0a  sys3Leave();.}..
3df0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3e00: 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73   size of an exis
3e10: 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ting memory allo
3e20: 63 61 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 2a  cation.*/.void *
3e30: 6d 65 6d 73 79 73 33 52 65 61 6c 6c 6f 63 28 76  memsys3Realloc(v
3e40: 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74  oid *pPrior, int
3e50: 20 6e 42 79 74 65 73 29 7b 0a 20 20 69 6e 74 20   nBytes){.  int 
3e60: 6e 4f 6c 64 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  nOld;.  void *p;
3e70: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 3d 3d 30  .  if( pPrior==0
3e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
3e90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
3ea0: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
3eb0: 20 6e 42 79 74 65 73 3c 3d 30 20 29 7b 0a 20 20   nBytes<=0 ){.  
3ec0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3ed0: 50 72 69 6f 72 29 3b 0a 20 20 20 20 72 65 74 75  Prior);.    retu
3ee0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64  rn 0;.  }.  nOld
3ef0: 20 3d 20 6d 65 6d 73 79 73 33 53 69 7a 65 28 70   = memsys3Size(p
3f00: 50 72 69 6f 72 29 3b 0a 20 20 69 66 28 20 6e 42  Prior);.  if( nB
3f10: 79 74 65 73 3c 3d 6e 4f 6c 64 20 26 26 20 6e 42  ytes<=nOld && nB
3f20: 79 74 65 73 3e 3d 6e 4f 6c 64 2d 31 32 38 20 29  ytes>=nOld-128 )
3f30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 72  {.    return pPr
3f40: 69 6f 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 79  ior;.  }.  memsy
3f50: 73 33 45 6e 74 65 72 28 29 3b 0a 20 20 70 20 3d  s3Enter();.  p =
3f60: 20 6d 65 6d 73 79 73 33 4d 61 6c 6c 6f 63 55 6e   memsys3MallocUn
3f70: 73 61 66 65 28 6e 42 79 74 65 73 29 3b 0a 20 20  safe(nBytes);.  
3f80: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
3f90: 20 6e 4f 6c 64 3c 6e 42 79 74 65 73 20 29 7b 0a   nOld<nBytes ){.
3fa0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20        memcpy(p, 
3fb0: 70 50 72 69 6f 72 2c 20 6e 4f 6c 64 29 3b 0a 20  pPrior, nOld);. 
3fc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3fd0: 6d 65 6d 63 70 79 28 70 2c 20 70 50 72 69 6f 72  memcpy(p, pPrior
3fe0: 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 7d  , nBytes);.    }
3ff0: 0a 20 20 20 20 6d 65 6d 73 79 73 33 46 72 65 65  .    memsys3Free
4000: 55 6e 73 61 66 65 28 70 50 72 69 6f 72 29 3b 0a  Unsafe(pPrior);.
4010: 20 20 7d 0a 20 20 6d 65 6d 73 79 73 33 4c 65 61    }.  memsys3Lea
4020: 76 65 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ve();.  return p
4030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
4040: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
4050: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4060: 20 6d 65 6d 73 79 73 33 49 6e 69 74 28 76 6f 69   memsys3Init(voi
4070: 64 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  d *NotUsed){.  U
4080: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4090: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
40a0: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
40b0: 6e 66 69 67 2e 70 48 65 61 70 20 29 7b 0a 20 20  nfig.pHeap ){.  
40c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
40d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
40e0: 20 53 74 6f 72 65 20 61 20 70 6f 69 6e 74 65 72   Store a pointer
40f0: 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 62   to the memory b
4100: 6c 6f 63 6b 20 69 6e 20 67 6c 6f 62 61 6c 20 73  lock in global s
4110: 74 72 75 63 74 75 72 65 20 6d 65 6d 33 2e 20 2a  tructure mem3. *
4120: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  /.  assert( size
4130: 6f 66 28 4d 65 6d 33 42 6c 6f 63 6b 29 3d 3d 38  of(Mem3Block)==8
4140: 20 29 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f 6c   );.  mem3.aPool
4150: 20 3d 20 28 4d 65 6d 33 42 6c 6f 63 6b 20 2a 29   = (Mem3Block *)
4160: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4170: 66 69 67 2e 70 48 65 61 70 3b 0a 20 20 6d 65 6d  fig.pHeap;.  mem
4180: 33 2e 6e 50 6f 6f 6c 20 3d 20 28 73 71 6c 69 74  3.nPool = (sqlit
4190: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
41a0: 48 65 61 70 20 2f 20 73 69 7a 65 6f 66 28 4d 65  Heap / sizeof(Me
41b0: 6d 33 42 6c 6f 63 6b 29 29 20 2d 20 32 3b 0a 0a  m3Block)) - 2;..
41c0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
41d0: 74 68 65 20 6d 61 73 74 65 72 20 62 6c 6f 63 6b  the master block
41e0: 2e 20 2a 2f 0a 20 20 6d 65 6d 33 2e 73 7a 4d 61  . */.  mem3.szMa
41f0: 73 74 65 72 20 3d 20 6d 65 6d 33 2e 6e 50 6f 6f  ster = mem3.nPoo
4200: 6c 3b 0a 20 20 6d 65 6d 33 2e 6d 6e 4d 61 73 74  l;.  mem3.mnMast
4210: 65 72 20 3d 20 6d 65 6d 33 2e 73 7a 4d 61 73 74  er = mem3.szMast
4220: 65 72 3b 0a 20 20 6d 65 6d 33 2e 69 4d 61 73 74  er;.  mem3.iMast
4230: 65 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 33 2e 61  er = 1;.  mem3.a
4240: 50 6f 6f 6c 5b 30 5d 2e 75 2e 68 64 72 2e 73 69  Pool[0].u.hdr.si
4250: 7a 65 34 78 20 3d 20 28 6d 65 6d 33 2e 73 7a 4d  ze4x = (mem3.szM
4260: 61 73 74 65 72 3c 3c 32 29 20 2b 20 32 3b 0a 20  aster<<2) + 2;. 
4270: 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6d 65 6d 33   mem3.aPool[mem3
4280: 2e 6e 50 6f 6f 6c 5d 2e 75 2e 68 64 72 2e 70 72  .nPool].u.hdr.pr
4290: 65 76 53 69 7a 65 20 3d 20 6d 65 6d 33 2e 6e 50  evSize = mem3.nP
42a0: 6f 6f 6c 3b 0a 20 20 6d 65 6d 33 2e 61 50 6f 6f  ool;.  mem3.aPoo
42b0: 6c 5b 6d 65 6d 33 2e 6e 50 6f 6f 6c 5d 2e 75 2e  l[mem3.nPool].u.
42c0: 68 64 72 2e 73 69 7a 65 34 78 20 3d 20 31 3b 0a  hdr.size4x = 1;.
42d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
42e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
42f0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  initialize this 
4300: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
4310: 63 20 76 6f 69 64 20 6d 65 6d 73 79 73 33 53 68  c void memsys3Sh
4320: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 4e 6f 74  utdown(void *Not
4330: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
4340: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
4350: 64 29 3b 0a 20 20 6d 65 6d 33 2e 6d 75 74 65 78  d);.  mem3.mutex
4360: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
4370: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }..../*.** Open 
4380: 74 68 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  the file indicat
4390: 65 64 20 61 6e 64 20 77 72 69 74 65 20 61 20 6c  ed and write a l
43a0: 6f 67 20 6f 66 20 61 6c 6c 20 75 6e 66 72 65 65  og of all unfree
43b0: 64 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 61 6c 6c  d memory .** all
43c0: 6f 63 61 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68  ocations into th
43d0: 61 74 20 6c 6f 67 2e 0a 2a 2f 0a 76 6f 69 64 20  at log..*/.void 
43e0: 73 71 6c 69 74 65 33 4d 65 6d 73 79 73 33 44 75  sqlite3Memsys3Du
43f0: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  mp(const char *z
4400: 46 69 6c 65 6e 61 6d 65 29 7b 0a 23 69 66 64 65  Filename){.#ifde
4410: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
4420: 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 75 33   FILE *out;.  u3
4430: 32 20 69 2c 20 6a 3b 0a 20 20 75 33 32 20 73 69  2 i, j;.  u32 si
4440: 7a 65 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  ze;.  if( zFilen
4450: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
4460: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  ame[0]==0 ){.   
4470: 20 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20   out = stdout;. 
4480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 20   }else{.    out 
4490: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
44a0: 65 2c 20 22 77 22 29 3b 0a 20 20 20 20 69 66 28  e, "w");.    if(
44b0: 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   out==0 ){.     
44c0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
44d0: 20 22 2a 2a 20 55 6e 61 62 6c 65 20 74 6f 20 6f   "** Unable to o
44e0: 75 74 70 75 74 20 6d 65 6d 6f 72 79 20 64 65 62  utput memory deb
44f0: 75 67 20 6f 75 74 70 75 74 20 6c 6f 67 3a 20 25  ug output log: %
4500: 73 20 2a 2a 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s **\n",.       
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4520: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
4530: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
4540: 20 7d 0a 20 20 6d 65 6d 73 79 73 33 45 6e 74 65   }.  memsys3Ente
4550: 72 28 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  r();.  fprintf(o
4560: 75 74 2c 20 22 43 48 55 4e 4b 53 3a 5c 6e 22 29  ut, "CHUNKS:\n")
4570: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
4580: 6d 65 6d 33 2e 6e 50 6f 6f 6c 3b 20 69 2b 3d 73  mem3.nPool; i+=s
4590: 69 7a 65 2f 34 29 7b 0a 20 20 20 20 73 69 7a 65  ize/4){.    size
45a0: 20 3d 20 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2d   = mem3.aPool[i-
45b0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 3b  1].u.hdr.size4x;
45c0: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 2f 34 3c  .    if( size/4<
45d0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =1 ){.      fpri
45e0: 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 73 69 7a  ntf(out, "%p siz
45f0: 65 20 65 72 72 6f 72 5c 6e 22 2c 20 26 6d 65 6d  e error\n", &mem
4600: 33 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0a 20 20 20  3.aPool[i]);.   
4610: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
4620: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4630: 20 7d 0a 20 20 20 20 69 66 28 20 28 73 69 7a 65   }.    if( (size
4640: 26 31 29 3d 3d 30 20 26 26 20 6d 65 6d 33 2e 61  &1)==0 && mem3.a
4650: 50 6f 6f 6c 5b 69 2b 73 69 7a 65 2f 34 2d 31 5d  Pool[i+size/4-1]
4660: 2e 75 2e 68 64 72 2e 70 72 65 76 53 69 7a 65 21  .u.hdr.prevSize!
4670: 3d 73 69 7a 65 2f 34 20 29 7b 0a 20 20 20 20 20  =size/4 ){.     
4680: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
4690: 70 20 74 61 69 6c 20 73 69 7a 65 20 64 6f 65 73  p tail size does
46a0: 20 6e 6f 74 20 6d 61 74 63 68 5c 6e 22 2c 20 26   not match\n", &
46b0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d 29 3b 0a  mem3.aPool[i]);.
46c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
46d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
46e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 28      }.    if( ((
46f0: 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 2b 73 69 7a  mem3.aPool[i+siz
4700: 65 2f 34 2d 31 5d 2e 75 2e 68 64 72 2e 73 69 7a  e/4-1].u.hdr.siz
4710: 65 34 78 26 32 29 3e 3e 31 29 21 3d 28 73 69 7a  e4x&2)>>1)!=(siz
4720: 65 26 31 29 20 29 7b 0a 20 20 20 20 20 20 66 70  e&1) ){.      fp
4730: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 74  rintf(out, "%p t
4740: 61 69 6c 20 63 68 65 63 6b 6f 75 74 20 62 69 74  ail checkout bit
4750: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 5c 6e 22   is incorrect\n"
4760: 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d  , &mem3.aPool[i]
4770: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4780: 20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61   0 );.      brea
4790: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
47a0: 20 73 69 7a 65 26 31 20 29 7b 0a 20 20 20 20 20   size&1 ){.     
47b0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
47c0: 70 20 25 36 64 20 62 79 74 65 73 20 63 68 65 63  p %6d bytes chec
47d0: 6b 65 64 20 6f 75 74 5c 6e 22 2c 20 26 6d 65 6d  ked out\n", &mem
47e0: 33 2e 61 50 6f 6f 6c 5b 69 5d 2c 20 28 73 69 7a  3.aPool[i], (siz
47f0: 65 2f 34 29 2a 38 2d 38 29 3b 0a 20 20 20 20 7d  e/4)*8-8);.    }
4800: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
4810: 6e 74 66 28 6f 75 74 2c 20 22 25 70 20 25 36 64  ntf(out, "%p %6d
4820: 20 62 79 74 65 73 20 66 72 65 65 25 73 5c 6e 22   bytes free%s\n"
4830: 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 69 5d  , &mem3.aPool[i]
4840: 2c 20 28 73 69 7a 65 2f 34 29 2a 38 2d 38 2c 0a  , (size/4)*8-8,.
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 69 3d 3d 6d 65 6d 33 2e 69 4d 61 73 74 65    i==mem3.iMaste
4870: 72 20 3f 20 22 20 2a 2a 6d 61 73 74 65 72 2a 2a  r ? " **master**
4880: 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 7d 0a 20  " : "");.    }. 
4890: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
48a0: 4d 58 5f 53 4d 41 4c 4c 2d 31 3b 20 69 2b 2b 29  MX_SMALL-1; i++)
48b0: 7b 0a 20 20 20 20 69 66 28 20 6d 65 6d 33 2e 61  {.    if( mem3.a
48c0: 69 53 6d 61 6c 6c 5b 69 5d 3d 3d 30 20 29 20 63  iSmall[i]==0 ) c
48d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72  ontinue;.    fpr
48e0: 69 6e 74 66 28 6f 75 74 2c 20 22 73 6d 61 6c 6c  intf(out, "small
48f0: 28 25 32 64 29 3a 22 2c 20 69 29 3b 0a 20 20 20  (%2d):", i);.   
4900: 20 66 6f 72 28 6a 20 3d 20 6d 65 6d 33 2e 61 69   for(j = mem3.ai
4910: 53 6d 61 6c 6c 5b 69 5d 3b 20 6a 3e 30 3b 20 6a  Small[i]; j>0; j
4920: 3d 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 5d 2e 75  =mem3.aPool[j].u
4930: 2e 6c 69 73 74 2e 6e 65 78 74 29 7b 0a 20 20 20  .list.next){.   
4940: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
4950: 22 20 25 70 28 25 64 29 22 2c 20 26 6d 65 6d 33  " %p(%d)", &mem3
4960: 2e 61 50 6f 6f 6c 5b 6a 5d 2c 0a 20 20 20 20 20  .aPool[j],.     
4970: 20 20 20 20 20 20 20 20 20 28 6d 65 6d 33 2e 61           (mem3.a
4980: 50 6f 6f 6c 5b 6a 2d 31 5d 2e 75 2e 68 64 72 2e  Pool[j-1].u.hdr.
4990: 73 69 7a 65 34 78 2f 34 29 2a 38 2d 38 29 3b 0a  size4x/4)*8-8);.
49a0: 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
49b0: 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 0a 20  f(out, "\n"); . 
49c0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
49d0: 4e 5f 48 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20  N_HASH; i++){.  
49e0: 20 20 69 66 28 20 6d 65 6d 33 2e 61 69 48 61 73    if( mem3.aiHas
49f0: 68 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  h[i]==0 ) contin
4a00: 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
4a10: 6f 75 74 2c 20 22 68 61 73 68 28 25 32 64 29 3a  out, "hash(%2d):
4a20: 22 2c 20 69 29 3b 0a 20 20 20 20 66 6f 72 28 6a  ", i);.    for(j
4a30: 20 3d 20 6d 65 6d 33 2e 61 69 48 61 73 68 5b 69   = mem3.aiHash[i
4a40: 5d 3b 20 6a 3e 30 3b 20 6a 3d 6d 65 6d 33 2e 61  ]; j>0; j=mem3.a
4a50: 50 6f 6f 6c 5b 6a 5d 2e 75 2e 6c 69 73 74 2e 6e  Pool[j].u.list.n
4a60: 65 78 74 29 7b 0a 20 20 20 20 20 20 66 70 72 69  ext){.      fpri
4a70: 6e 74 66 28 6f 75 74 2c 20 22 20 25 70 28 25 64  ntf(out, " %p(%d
4a80: 29 22 2c 20 26 6d 65 6d 33 2e 61 50 6f 6f 6c 5b  )", &mem3.aPool[
4a90: 6a 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  j],.            
4aa0: 20 20 28 6d 65 6d 33 2e 61 50 6f 6f 6c 5b 6a 2d    (mem3.aPool[j-
4ab0: 31 5d 2e 75 2e 68 64 72 2e 73 69 7a 65 34 78 2f  1].u.hdr.size4x/
4ac0: 34 29 2a 38 2d 38 29 3b 0a 20 20 20 20 7d 0a 20  4)*8-8);.    }. 
4ad0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
4ae0: 22 5c 6e 22 29 3b 20 0a 20 20 7d 0a 20 20 66 70  "\n"); .  }.  fp
4af0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 6d 61 73 74  rintf(out, "mast
4b00: 65 72 3d 25 64 5c 6e 22 2c 20 6d 65 6d 33 2e 69  er=%d\n", mem3.i
4b10: 4d 61 73 74 65 72 29 3b 0a 20 20 66 70 72 69 6e  Master);.  fprin
4b20: 74 66 28 6f 75 74 2c 20 22 6e 6f 77 55 73 65 64  tf(out, "nowUsed
4b30: 3d 25 64 5c 6e 22 2c 20 6d 65 6d 33 2e 6e 50 6f  =%d\n", mem3.nPo
4b40: 6f 6c 2a 38 20 2d 20 6d 65 6d 33 2e 73 7a 4d 61  ol*8 - mem3.szMa
4b50: 73 74 65 72 2a 38 29 3b 0a 20 20 66 70 72 69 6e  ster*8);.  fprin
4b60: 74 66 28 6f 75 74 2c 20 22 6d 78 55 73 65 64 3d  tf(out, "mxUsed=
4b70: 25 64 5c 6e 22 2c 20 6d 65 6d 33 2e 6e 50 6f 6f  %d\n", mem3.nPoo
4b80: 6c 2a 38 20 2d 20 6d 65 6d 33 2e 6d 6e 4d 61 73  l*8 - mem3.mnMas
4b90: 74 65 72 2a 38 29 3b 0a 20 20 73 71 6c 69 74 65  ter*8);.  sqlite
4ba0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65  3_mutex_leave(me
4bb0: 6d 33 2e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  m3.mutex);.  if(
4bc0: 20 6f 75 74 3d 3d 73 74 64 6f 75 74 20 29 7b 0a   out==stdout ){.
4bd0: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
4be0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
4bf0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
4c00: 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
4c10: 5f 50 41 52 41 4d 45 54 45 52 28 7a 46 69 6c 65  _PARAMETER(zFile
4c20: 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  name);.#endif.}.
4c30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4c40: 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
4c50: 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20  routine in this 
4c60: 66 69 6c 65 20 77 69 74 68 20 65 78 74 65 72 6e  file with extern
4c70: 61 6c 20 0a 2a 2a 20 6c 69 6e 6b 61 67 65 2e 0a  al .** linkage..
4c80: 2a 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  **.** Populate t
4c90: 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d  he low-level mem
4ca0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
4cb0: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  unction pointers
4cc0: 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c   in.** sqlite3Gl
4cd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74  obalConfig.m wit
4ce0: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  h pointers to th
4cf0: 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68  e routines in th
4d00: 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  is file. The.** 
4d10: 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66  arguments specif
4d20: 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  y the block of m
4d30: 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e  emory to manage.
4d40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4d50: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
4d60: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f  ed by sqlite3_co
4d70: 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72  nfig(), and ther
4d80: 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20  efore.** is not 
4d90: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74  required to be t
4da0: 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73  hreadsafe (it is
4db0: 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   not)..*/.const 
4dc0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
4dd0: 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  ods *sqlite3MemG
4de0: 65 74 4d 65 6d 73 79 73 33 28 76 6f 69 64 29 7b  etMemsys3(void){
4df0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
4e00: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
4e10: 6f 64 73 20 6d 65 6d 70 6f 6f 6c 4d 65 74 68 6f  ods mempoolMetho
4e20: 64 73 20 3d 20 7b 0a 20 20 20 20 20 6d 65 6d 73  ds = {.     mems
4e30: 79 73 33 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 20  ys3Malloc,.     
4e40: 6d 65 6d 73 79 73 33 46 72 65 65 2c 0a 20 20 20  memsys3Free,.   
4e50: 20 20 6d 65 6d 73 79 73 33 52 65 61 6c 6c 6f 63    memsys3Realloc
4e60: 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 33 53 69  ,.     memsys3Si
4e70: 7a 65 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 33  ze,.     memsys3
4e80: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 20 6d 65  Roundup,.     me
4e90: 6d 73 79 73 33 49 6e 69 74 2c 0a 20 20 20 20 20  msys3Init,.     
4ea0: 6d 65 6d 73 79 73 33 53 68 75 74 64 6f 77 6e 2c  memsys3Shutdown,
4eb0: 0a 20 20 20 20 20 30 0a 20 20 7d 3b 0a 20 20 72  .     0.  };.  r
4ec0: 65 74 75 72 6e 20 26 6d 65 6d 70 6f 6f 6c 4d 65  eturn &mempoolMe
4ed0: 74 68 6f 64 73 3b 0a 7d 0a 0a 23 65 6e 64 69 66  thods;.}..#endif
4ee0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
4ef0: 45 5f 4d 45 4d 53 59 53 33 20 2a 2f 0a           E_MEMSYS3 */.