/ Hex Artifact Content
Login

Artifact febe4db9ddef73df500989e68a9d4ac68602a075:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4a 75 6c 79 20  /*.** 2008 July 
0010: 32 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  24.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 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 61 6e 20 61 6c  e contains an al
0190: 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79  ternative memory
01a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 79 73 74   allocation syst
01b0: 65 6d 20 66 6f 72 20 53 51 4c 69 74 65 2e 0a 2a  em for SQLite..*
01c0: 2a 20 54 68 69 73 20 73 79 73 74 65 6d 20 69 73  * This system is
01d0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
01e0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
01f0: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
0200: 69 64 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6f  ided.** by the o
0210: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0220: 2d 20 76 61 6e 69 6c 6c 61 20 6d 61 6c 6c 6f 63  - vanilla malloc
0230: 28 29 2c 20 72 65 61 6c 6c 6f 63 28 29 20 61 6e  (), realloc() an
0240: 64 20 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  d free()..**.** 
0250: 54 68 69 73 20 73 79 73 74 65 6d 20 64 69 66 66  This system diff
0260: 65 72 65 6e 74 69 61 74 65 73 20 62 65 74 77 65  erentiates betwe
0270: 65 6e 20 72 65 71 75 65 73 74 73 20 66 6f 72 20  en requests for 
0280: 22 73 6d 61 6c 6c 22 20 61 6c 6c 6f 63 61 74 69  "small" allocati
0290: 6f 6e 73 20 0a 2a 2a 20 28 62 79 20 64 65 66 61  ons .** (by defa
02a0: 75 6c 74 20 74 68 6f 73 65 20 6f 66 20 31 32 38  ult those of 128
02b0: 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 29 20   bytes or less) 
02c0: 61 6e 64 20 22 6c 61 72 67 65 22 20 61 6c 6c 6f  and "large" allo
02d0: 63 61 74 69 6f 6e 73 20 28 61 6c 6c 0a 2a 2a 20  cations (all.** 
02e0: 6f 74 68 65 72 73 29 2e 20 54 68 65 20 32 35 36  others). The 256
02f0: 20 62 79 74 65 20 74 68 72 65 73 68 68 6f 6c 64   byte threshhold
0300: 20 69 73 20 63 6f 6e 66 69 67 75 72 61 62 6c 65   is configurable
0310: 20 61 74 20 72 75 6e 74 69 6d 65 2e 0a 2a 2a 0a   at runtime..**.
0320: 2a 2a 20 41 6c 6c 20 72 65 71 75 65 73 74 73 20  ** All requests 
0330: 66 6f 72 20 6c 61 72 67 65 20 61 6c 6c 6f 63 61  for large alloca
0340: 74 69 6f 6e 73 20 61 72 65 20 70 61 73 73 65 64  tions are passed
0350: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
0360: 0a 2a 2a 20 64 65 66 61 75 6c 74 20 73 79 73 74  .** default syst
0370: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  em..**.** Reques
0380: 74 73 20 66 6f 72 20 73 6d 61 6c 6c 20 61 6c 6c  ts for small all
0390: 6f 63 61 74 69 6f 6e 73 20 61 72 65 20 6d 65 74  ocations are met
03a0: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   by allocating s
03b0: 70 61 63 65 20 77 69 74 68 69 6e 0a 2a 2a 20 6f  pace within.** o
03c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6c 61 72 67 65  ne or more large
03d0: 72 20 22 63 68 75 6e 6b 73 22 20 6f 66 20 6d 65  r "chunks" of me
03e0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
03f0: 6f 6d 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  om the default.*
0400: 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
0410: 69 6f 6e 20 73 79 73 74 65 6d 2e 20 43 68 75 6e  ion system. Chun
0420: 6b 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65  ks of memory are
0430: 20 75 73 75 61 6c 6c 79 20 36 34 4b 42 20 6f 72   usually 64KB or
0440: 20 0a 2a 2a 20 6c 61 72 67 65 72 2e 20 54 68 65   .** larger. The
0450: 20 61 6c 67 6f 72 69 74 68 6d 20 75 73 65 64 20   algorithm used 
0460: 74 6f 20 6d 61 6e 61 67 65 20 73 70 61 63 65 20  to manage space 
0470: 77 69 74 68 69 6e 20 65 61 63 68 20 63 68 75 6e  within each chun
0480: 6b 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65  k is.** the same
0490: 20 61 73 20 74 68 61 74 20 75 73 65 64 20 62 79   as that used by
04a0: 20 6d 65 6d 35 2e 63 2e 20 0a 2a 2a 0a 2a 2a 20   mem5.c. .**.** 
04b0: 54 68 69 73 20 73 74 72 61 74 65 67 79 20 69 73  This strategy is
04c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 72 65   designed to pre
04d0: 76 65 6e 74 20 74 68 65 20 64 65 66 61 75 6c 74  vent the default
04e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
04f0: 6f 6e 0a 2a 2a 20 73 79 73 74 65 6d 20 28 75 73  on.** system (us
0500: 75 61 6c 6c 79 20 74 68 65 20 73 79 73 74 65 6d  ually the system
0510: 20 6d 61 6c 6c 6f 63 29 20 66 72 6f 6d 20 73 75   malloc) from su
0520: 66 66 65 72 69 6e 67 20 66 72 6f 6d 20 68 65 61  ffering from hea
0530: 70 20 0a 2a 2a 20 66 72 61 67 6d 65 6e 74 61 74  p .** fragmentat
0540: 69 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73  ion. On some sys
0550: 74 65 6d 73 2c 20 68 65 61 70 20 66 72 61 67 6d  tems, heap fragm
0560: 65 6e 74 61 74 69 6f 6e 20 63 61 6e 20 63 61 75  entation can cau
0570: 73 65 20 61 20 0a 2a 2a 20 73 69 67 6e 69 66 69  se a .** signifi
0580: 63 61 6e 74 20 72 65 61 6c 2d 74 69 6d 65 20 73  cant real-time s
0590: 6c 6f 77 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 24  lowdown..**.** $
05a0: 49 64 3a 20 6d 65 6d 36 2e 63 2c 76 20 31 2e 31  Id: mem6.c,v 1.1
05b0: 30 20 32 30 30 38 2f 30 39 2f 30 32 20 31 37 3a  0 2008/09/02 17:
05c0: 35 32 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37  52:52 danielk197
05d0: 37 20 45 78 70 20 24 0a 2a 2f 0a 0a 23 69 66 64  7 Exp $.*/..#ifd
05e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
05f0: 5f 4d 45 4d 53 59 53 36 0a 0a 23 69 6e 63 6c 75  _MEMSYS6..#inclu
0600: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0610: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
0620: 73 69 7a 65 20 6f 66 20 61 6e 79 20 22 73 6d 61  size of any "sma
0630: 6c 6c 22 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ll" allocation i
0640: 73 20 28 28 31 3c 3c 4c 4f 47 4d 41 58 29 2a 4d  s ((1<<LOGMAX)*M
0650: 65 6d 36 43 68 75 6e 6b 2e 6e 41 74 6f 6d 29 2e  em6Chunk.nAtom).
0660: 0a 2a 2a 20 4d 65 6d 36 43 68 75 6e 6b 2e 6e 41  .** Mem6Chunk.nA
0670: 74 6f 6d 20 69 73 20 61 6c 77 61 79 73 20 61 74  tom is always at
0680: 20 6c 65 61 73 74 20 38 2c 20 73 6f 20 74 68 69   least 8, so thi
0690: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 61 63 74  s is not a pract
06a0: 69 63 61 6c 0a 2a 2a 20 6c 69 6d 69 74 61 74 69  ical.** limitati
06b0: 6f 6e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 4f  on.*/.#define LO
06c0: 47 4d 41 58 20 33 30 0a 0a 2f 2a 0a 2a 2a 20 44  GMAX 30../*.** D
06d0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
06e0: 20 74 68 65 20 22 73 6d 61 6c 6c 22 20 61 6c 6c   the "small" all
06f0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 68 72  ocation size thr
0700: 65 73 68 6f 6c 64 2e 0a 2a 2f 0a 23 64 65 66 69  eshold..*/.#defi
0710: 6e 65 20 53 4d 41 4c 4c 5f 4d 41 4c 4c 4f 43 5f  ne SMALL_MALLOC_
0720: 44 45 46 41 55 4c 54 5f 54 48 52 45 53 48 4f 4c  DEFAULT_THRESHOL
0730: 44 20 32 35 36 0a 0a 2f 2a 0a 2a 2a 20 4d 69 6e  D 256../*.** Min
0740: 69 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 61 20  imum size for a 
0750: 6d 65 6d 6f 72 79 20 63 68 75 6e 6b 2e 0a 2a 2f  memory chunk..*/
0760: 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 43 48 55  .#define MIN_CHU
0770: 4e 4b 53 49 5a 45 20 28 31 3c 3c 31 36 29 0a 0a  NKSIZE (1<<16)..
0780: 23 64 65 66 69 6e 65 20 4c 4f 47 32 5f 4d 49 4e  #define LOG2_MIN
0790: 41 4c 4c 4f 43 20 34 0a 0a 0a 74 79 70 65 64 65  ALLOC 4...typede
07a0: 66 20 73 74 72 75 63 74 20 4d 65 6d 36 43 68 75  f struct Mem6Chu
07b0: 6e 6b 20 4d 65 6d 36 43 68 75 6e 6b 3b 0a 74 79  nk Mem6Chunk;.ty
07c0: 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65 6d  pedef struct Mem
07d0: 36 4c 69 6e 6b 20 4d 65 6d 36 4c 69 6e 6b 3b 0a  6Link Mem6Link;.
07e0: 0a 2f 2a 0a 2a 2a 20 41 20 6d 69 6e 69 6d 75 6d  ./*.** A minimum
07f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 61   allocation is a
0800: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0810: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0820: 63 74 75 72 65 2e 0a 2a 2a 20 4c 61 72 67 65 72  cture..** Larger
0830: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65   allocations are
0840: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   an array of the
0850: 73 65 20 73 74 72 75 63 74 75 72 65 73 20 77 68  se structures wh
0860: 65 72 65 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20  ere the.** size 
0870: 6f 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  of the array is 
0880: 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a 2a 2f  a power of 2..*/
0890: 0a 73 74 72 75 63 74 20 4d 65 6d 36 4c 69 6e 6b  .struct Mem6Link
08a0: 20 7b 0a 20 20 69 6e 74 20 6e 65 78 74 3b 20 20   {.  int next;  
08b0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
08c0: 20 6e 65 78 74 20 66 72 65 65 20 63 68 75 6e 6b   next free chunk
08d0: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 76 3b 20   */.  int prev; 
08e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
08f0: 66 20 70 72 65 76 69 6f 75 73 20 66 72 65 65 20  f previous free 
0900: 63 68 75 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  chunk */.};../*.
0910: 2a 2a 20 4d 61 73 6b 73 20 75 73 65 64 20 66 6f  ** Masks used fo
0920: 72 20 6d 65 6d 35 2e 61 43 74 72 6c 5b 5d 20 65  r mem5.aCtrl[] e
0930: 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66  lements..*/.#def
0940: 69 6e 65 20 43 54 52 4c 5f 4c 4f 47 53 49 5a 45  ine CTRL_LOGSIZE
0950: 20 20 30 78 31 66 20 20 20 20 2f 2a 20 4c 6f 67    0x1f    /* Log
0960: 32 20 53 69 7a 65 20 6f 66 20 74 68 69 73 20 62  2 Size of this b
0970: 6c 6f 63 6b 20 72 65 6c 61 74 69 76 65 20 74 6f  lock relative to
0980: 20 50 4f 57 32 5f 4d 49 4e 20 2a 2f 0a 23 64 65   POW2_MIN */.#de
0990: 66 69 6e 65 20 43 54 52 4c 5f 46 52 45 45 20 20  fine CTRL_FREE  
09a0: 20 20 20 30 78 32 30 20 20 20 20 2f 2a 20 54 72     0x20    /* Tr
09b0: 75 65 20 69 66 20 6e 6f 74 20 63 68 65 63 6b 65  ue if not checke
09c0: 64 20 6f 75 74 20 2a 2f 0a 0a 73 74 72 75 63 74  d out */..struct
09d0: 20 4d 65 6d 36 43 68 75 6e 6b 20 7b 0a 20 20 4d   Mem6Chunk {.  M
09e0: 65 6d 36 43 68 75 6e 6b 20 2a 70 4e 65 78 74 3b  em6Chunk *pNext;
09f0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 69 73 74  ..  /*.  ** List
0a00: 73 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 73  s of free blocks
0a10: 20 6f 66 20 76 61 72 69 6f 75 73 20 73 69 7a 65   of various size
0a20: 73 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 61 69  s..  */.  int ai
0a30: 46 72 65 65 6c 69 73 74 5b 4c 4f 47 4d 41 58 2b  Freelist[LOGMAX+
0a40: 31 5d 3b 0a 0a 20 20 69 6e 74 20 6e 43 68 65 63  1];..  int nChec
0a50: 6b 65 64 4f 75 74 3b 20 2f 2a 20 4e 75 6d 62 65  kedOut; /* Numbe
0a60: 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 6f  r of currently o
0a70: 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63  utstanding alloc
0a80: 61 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 0a  ations */..  /*.
0a90: 20 20 2a 2a 20 53 70 61 63 65 20 66 6f 72 20 74    ** Space for t
0aa0: 72 61 63 6b 69 6e 67 20 77 68 69 63 68 20 62 6c  racking which bl
0ab0: 6f 63 6b 73 20 61 72 65 20 63 68 65 63 6b 65 64  ocks are checked
0ac0: 20 6f 75 74 20 61 6e 64 20 74 68 65 20 73 69 7a   out and the siz
0ad0: 65 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 62  e.  ** of each b
0ae0: 6c 6f 63 6b 2e 20 4f 6e 65 20 62 79 74 65 20 70  lock. One byte p
0af0: 65 72 20 62 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  er block..  */. 
0b00: 20 75 38 20 2a 61 43 74 72 6c 3b 0a 0a 20 20 2f   u8 *aCtrl;..  /
0b10: 2a 0a 20 20 2a 2a 20 4d 65 6d 6f 72 79 20 61 76  *.  ** Memory av
0b20: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
0b30: 63 61 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 6e  cation.  */.  in
0b40: 74 20 6e 41 74 6f 6d 3b 20 20 20 20 20 20 20 2f  t nAtom;       /
0b50: 2a 20 53 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  * Smallest possi
0b60: 62 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ble allocation i
0b70: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
0b80: 20 6e 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a   nBlock;      /*
0b90: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 41 74 6f 6d   Number of nAtom
0ba0: 20 73 69 7a 65 64 20 62 6c 6f 63 6b 73 20 69 6e   sized blocks in
0bb0: 20 7a 50 6f 6f 6c 20 2a 2f 0a 20 20 75 38 20 2a   zPool */.  u8 *
0bc0: 7a 50 6f 6f 6c 3b 20 20 20 20 20 20 20 2f 2a 20  zPool;       /* 
0bd0: 50 6f 69 6e 74 65 72 20 74 6f 20 6d 65 6d 6f 72  Pointer to memor
0be0: 79 20 63 68 75 6e 6b 20 66 72 6f 6d 20 77 68 69  y chunk from whi
0bf0: 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ch allocations a
0c00: 72 65 20 6d 61 64 65 20 2a 2f 0a 7d 3b 0a 0a 23  re made */.};..#
0c10: 64 65 66 69 6e 65 20 4d 45 4d 36 4c 49 4e 4b 28  define MEM6LINK(
0c20: 69 64 78 29 20 28 28 4d 65 6d 36 4c 69 6e 6b 20  idx) ((Mem6Link 
0c30: 2a 29 28 26 70 43 68 75 6e 6b 2d 3e 7a 50 6f 6f  *)(&pChunk->zPoo
0c40: 6c 5b 28 69 64 78 29 2a 70 43 68 75 6e 6b 2d 3e  l[(idx)*pChunk->
0c50: 6e 41 74 6f 6d 5d 29 29 0a 0a 73 74 61 74 69 63  nAtom]))..static
0c60: 20 53 51 4c 49 54 45 5f 57 53 44 20 73 74 72 75   SQLITE_WSD stru
0c70: 63 74 20 4d 65 6d 36 47 6c 6f 62 61 6c 20 7b 0a  ct Mem6Global {.
0c80: 20 20 69 6e 74 20 6e 4d 69 6e 41 6c 6c 6f 63 3b    int nMinAlloc;
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6c 6c    /* Minimum all
0cb0: 6f 77 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  owed allocation 
0cc0: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  size */.  int nT
0cd0: 68 72 65 73 68 6f 6c 64 3b 20 20 20 20 20 20 20  hreshold;       
0ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0cf0: 6f 63 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ocs larger than 
0d00: 74 68 69 73 20 67 6f 20 74 6f 20 6d 61 6c 6c 6f  this go to mallo
0d10: 63 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  c() */.  int nLo
0d20: 67 54 68 72 65 73 68 6f 6c 64 3b 20 20 20 20 20  gThreshold;     
0d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 32           /* log2
0d40: 20 6f 66 20 28 6e 54 68 72 65 73 68 6f 6c 64 2f   of (nThreshold/
0d50: 6e 4d 69 6e 41 6c 6c 6f 63 29 20 2a 2f 0a 20 20  nMinAlloc) */.  
0d60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
0d70: 75 74 65 78 3b 0a 20 20 4d 65 6d 36 43 68 75 6e  utex;.  Mem6Chun
0d80: 6b 20 2a 70 43 68 75 6e 6b 3b 20 20 20 20 20 20  k *pChunk;      
0d90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
0da0: 79 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  y linked list of
0db0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 63 68 75 6e   all memory chun
0dc0: 6b 73 20 2a 2f 0a 7d 20 6d 65 6d 36 20 3d 20 7b  ks */.} mem6 = {
0dd0: 20 34 38 36 34 32 37 39 31 20 7d 3b 0a 0a 23 64   48642791 };..#d
0de0: 65 66 69 6e 65 20 6d 65 6d 36 20 47 4c 4f 42 41  efine mem6 GLOBA
0df0: 4c 28 73 74 72 75 63 74 20 4d 65 6d 36 47 6c 6f  L(struct Mem6Glo
0e00: 62 61 6c 2c 20 6d 65 6d 36 29 0a 0a 2f 2a 0a 2a  bal, mem6)../*.*
0e10: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 63 68 75  * Unlink the chu
0e20: 6e 6b 20 61 74 20 70 43 68 75 6e 6b 2d 3e 61 50  nk at pChunk->aP
0e30: 6f 6f 6c 5b 69 5d 20 66 72 6f 6d 20 6c 69 73 74  ool[i] from list
0e40: 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
0e50: 0a 2a 2a 20 6f 6e 2e 20 20 49 74 20 73 68 6f 75  .** on.  It shou
0e60: 6c 64 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 70  ld be found on p
0e70: 43 68 75 6e 6b 2d 3e 61 69 46 72 65 65 6c 69 73  Chunk->aiFreelis
0e80: 74 5b 69 4c 6f 67 73 69 7a 65 5d 2e 0a 2a 2f 0a  t[iLogsize]..*/.
0e90: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 73  static void mems
0ea0: 79 73 36 55 6e 6c 69 6e 6b 28 4d 65 6d 36 43 68  ys6Unlink(Mem6Ch
0eb0: 75 6e 6b 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74  unk *pChunk, int
0ec0: 20 69 2c 20 69 6e 74 20 69 4c 6f 67 73 69 7a 65   i, int iLogsize
0ed0: 29 7b 0a 20 20 69 6e 74 20 6e 65 78 74 2c 20 70  ){.  int next, p
0ee0: 72 65 76 3b 0a 20 20 61 73 73 65 72 74 28 20 69  rev;.  assert( i
0ef0: 3e 3d 30 20 26 26 20 69 3c 70 43 68 75 6e 6b 2d  >=0 && i<pChunk-
0f00: 3e 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 61 73 73  >nBlock );.  ass
0f10: 65 72 74 28 20 69 4c 6f 67 73 69 7a 65 3e 3d 30  ert( iLogsize>=0
0f20: 20 26 26 20 69 4c 6f 67 73 69 7a 65 3c 3d 6d 65   && iLogsize<=me
0f30: 6d 36 2e 6e 4c 6f 67 54 68 72 65 73 68 6f 6c 64  m6.nLogThreshold
0f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
0f50: 43 68 75 6e 6b 2d 3e 61 43 74 72 6c 5b 69 5d 20  Chunk->aCtrl[i] 
0f60: 26 20 43 54 52 4c 5f 4c 4f 47 53 49 5a 45 29 3d  & CTRL_LOGSIZE)=
0f70: 3d 69 4c 6f 67 73 69 7a 65 20 29 3b 0a 0a 20 20  =iLogsize );..  
0f80: 6e 65 78 74 20 3d 20 4d 45 4d 36 4c 49 4e 4b 28  next = MEM6LINK(
0f90: 69 29 2d 3e 6e 65 78 74 3b 0a 20 20 70 72 65 76  i)->next;.  prev
0fa0: 20 3d 20 4d 45 4d 36 4c 49 4e 4b 28 69 29 2d 3e   = MEM6LINK(i)->
0fb0: 70 72 65 76 3b 0a 20 20 69 66 28 20 70 72 65 76  prev;.  if( prev
0fc0: 3c 30 20 29 7b 0a 20 20 20 20 70 43 68 75 6e 6b  <0 ){.    pChunk
0fd0: 2d 3e 61 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f  ->aiFreelist[iLo
0fe0: 67 73 69 7a 65 5d 20 3d 20 6e 65 78 74 3b 0a 20  gsize] = next;. 
0ff0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 45 4d 36   }else{.    MEM6
1000: 4c 49 4e 4b 28 70 72 65 76 29 2d 3e 6e 65 78 74  LINK(prev)->next
1010: 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69   = next;.  }.  i
1020: 66 28 20 6e 65 78 74 3e 3d 30 20 29 7b 0a 20 20  f( next>=0 ){.  
1030: 20 20 4d 45 4d 36 4c 49 4e 4b 28 6e 65 78 74 29    MEM6LINK(next)
1040: 2d 3e 70 72 65 76 20 3d 20 70 72 65 76 3b 0a 20  ->prev = prev;. 
1050: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b   }.}../*.** Link
1060: 20 74 68 65 20 63 68 75 6e 6b 20 61 74 20 6d 65   the chunk at me
1070: 6d 35 2e 61 50 6f 6f 6c 5b 69 5d 20 73 6f 20 74  m5.aPool[i] so t
1080: 68 61 74 20 69 73 20 6f 6e 20 74 68 65 20 69 4c  hat is on the iL
1090: 6f 67 73 69 7a 65 0a 2a 2a 20 66 72 65 65 20 6c  ogsize.** free l
10a0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
10b0: 6f 69 64 20 6d 65 6d 73 79 73 36 4c 69 6e 6b 28  oid memsys6Link(
10c0: 4d 65 6d 36 43 68 75 6e 6b 20 2a 70 43 68 75 6e  Mem6Chunk *pChun
10d0: 6b 2c 20 69 6e 74 20 69 2c 20 69 6e 74 20 69 4c  k, int i, int iL
10e0: 6f 67 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 78  ogsize){.  int x
10f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;.  assert( i>=0
1100: 20 26 26 20 69 3c 70 43 68 75 6e 6b 2d 3e 6e 42   && i<pChunk->nB
1110: 6c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74  lock );.  assert
1120: 28 20 69 4c 6f 67 73 69 7a 65 3e 3d 30 20 26 26  ( iLogsize>=0 &&
1130: 20 69 4c 6f 67 73 69 7a 65 3c 3d 6d 65 6d 36 2e   iLogsize<=mem6.
1140: 6e 4c 6f 67 54 68 72 65 73 68 6f 6c 64 20 29 3b  nLogThreshold );
1150: 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 68 75  .  assert( (pChu
1160: 6e 6b 2d 3e 61 43 74 72 6c 5b 69 5d 20 26 20 43  nk->aCtrl[i] & C
1170: 54 52 4c 5f 4c 4f 47 53 49 5a 45 29 3d 3d 69 4c  TRL_LOGSIZE)==iL
1180: 6f 67 73 69 7a 65 20 29 3b 0a 0a 20 20 78 20 3d  ogsize );..  x =
1190: 20 4d 45 4d 36 4c 49 4e 4b 28 69 29 2d 3e 6e 65   MEM6LINK(i)->ne
11a0: 78 74 20 3d 20 70 43 68 75 6e 6b 2d 3e 61 69 46  xt = pChunk->aiF
11b0: 72 65 65 6c 69 73 74 5b 69 4c 6f 67 73 69 7a 65  reelist[iLogsize
11c0: 5d 3b 0a 20 20 4d 45 4d 36 4c 49 4e 4b 28 69 29  ];.  MEM6LINK(i)
11d0: 2d 3e 70 72 65 76 20 3d 20 2d 31 3b 0a 20 20 69  ->prev = -1;.  i
11e0: 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 61  f( x>=0 ){.    a
11f0: 73 73 65 72 74 28 20 78 3c 70 43 68 75 6e 6b 2d  ssert( x<pChunk-
1200: 3e 6e 42 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 4d  >nBlock );.    M
1210: 45 4d 36 4c 49 4e 4b 28 78 29 2d 3e 70 72 65 76  EM6LINK(x)->prev
1220: 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 43 68 75   = i;.  }.  pChu
1230: 6e 6b 2d 3e 61 69 46 72 65 65 6c 69 73 74 5b 69  nk->aiFreelist[i
1240: 4c 6f 67 73 69 7a 65 5d 20 3d 20 69 3b 0a 7d 0a  Logsize] = i;.}.
1250: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
1260: 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f 6e 20   first entry on 
1270: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 4c 6f  the freelist iLo
1280: 67 73 69 7a 65 2e 20 20 55 6e 6c 69 6e 6b 20 74  gsize.  Unlink t
1290: 68 61 74 0a 2a 2a 20 65 6e 74 72 79 20 61 6e 64  hat.** entry and
12a0: 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65   return its inde
12b0: 78 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  x. .*/.static in
12c0: 74 20 6d 65 6d 73 79 73 36 55 6e 6c 69 6e 6b 46  t memsys6UnlinkF
12d0: 69 72 73 74 28 4d 65 6d 36 43 68 75 6e 6b 20 2a  irst(Mem6Chunk *
12e0: 70 43 68 75 6e 6b 2c 20 69 6e 74 20 69 4c 6f 67  pChunk, int iLog
12f0: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  size){.  int i;.
1300: 20 20 69 6e 74 20 69 46 69 72 73 74 3b 0a 0a 20    int iFirst;.. 
1310: 20 61 73 73 65 72 74 28 20 69 4c 6f 67 73 69 7a   assert( iLogsiz
1320: 65 3e 3d 30 20 26 26 20 69 4c 6f 67 73 69 7a 65  e>=0 && iLogsize
1330: 3c 3d 6d 65 6d 36 2e 6e 4c 6f 67 54 68 72 65 73  <=mem6.nLogThres
1340: 68 6f 6c 64 20 29 3b 0a 20 20 69 20 3d 20 69 46  hold );.  i = iF
1350: 69 72 73 74 20 3d 20 70 43 68 75 6e 6b 2d 3e 61  irst = pChunk->a
1360: 69 46 72 65 65 6c 69 73 74 5b 69 4c 6f 67 73 69  iFreelist[iLogsi
1370: 7a 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ze];.  assert( i
1380: 46 69 72 73 74 3e 3d 30 20 29 3b 0a 20 20 6d 65  First>=0 );.  me
1390: 6d 73 79 73 36 55 6e 6c 69 6e 6b 28 70 43 68 75  msys6Unlink(pChu
13a0: 6e 6b 2c 20 69 46 69 72 73 74 2c 20 69 4c 6f 67  nk, iFirst, iLog
13b0: 73 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  size);.  return 
13c0: 69 46 69 72 73 74 3b 0a 7d 0a 0a 73 74 61 74 69  iFirst;.}..stati
13d0: 63 20 69 6e 74 20 72 6f 75 6e 64 75 70 4c 6f 67  c int roundupLog
13e0: 32 28 69 6e 74 20 6e 29 7b 0a 20 20 73 74 61 74  2(int n){.  stat
13f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 4c 6f  ic const char Lo
1400: 67 54 61 62 6c 65 32 35 36 5b 32 35 36 5d 20 3d  gTable256[256] =
1410: 20 7b 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   {.    0,       
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1450: 31 20 2a 2f 0a 20 20 20 20 31 2c 20 20 20 20 20  1 */.    1,     
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1490: 2a 20 32 20 2a 2f 0a 20 20 20 20 32 2c 20 32 2c  * 2 */.    2, 2,
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 2f 2a 20 33 2e 2e 34 20 2a 2f 0a 20 20 20 20   /* 3..4 */.    
14e0: 33 2c 20 33 2c 20 33 2c 20 33 2c 20 20 20 20 20  3, 3, 3, 3,     
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 2f 2a 20 35 2e 2e 38 20 2a 2f        /* 5..8 */
1520: 0a 20 20 20 20 34 2c 20 34 2c 20 34 2c 20 34 2c  .    4, 4, 4, 4,
1530: 20 34 2c 20 34 2c 20 34 2c 20 34 2c 20 20 20 20   4, 4, 4, 4,    
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 39 2e             /* 9.
1560: 2e 31 36 20 2a 2f 0a 20 20 20 20 35 2c 20 35 2c  .16 */.    5, 5,
1570: 20 35 2c 20 35 2c 20 35 2c 20 35 2c 20 35 2c 20   5, 5, 5, 5, 5, 
1580: 35 2c 20 35 2c 20 35 2c 20 35 2c 20 35 2c 20 35  5, 5, 5, 5, 5, 5
1590: 2c 20 35 2c 20 35 2c 20 35 2c 20 20 20 20 20 20  , 5, 5, 5,      
15a0: 20 2f 2a 20 31 37 2e 2e 33 32 20 2a 2f 0a 20 20   /* 17..32 */.  
15b0: 20 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20 36 2c    6, 6, 6, 6, 6,
15c0: 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20   6, 6, 6, 6, 6, 
15d0: 36 2c 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20 36  6, 6, 6, 6, 6, 6
15e0: 2c 0a 20 20 20 20 36 2c 20 36 2c 20 36 2c 20 36  ,.    6, 6, 6, 6
15f0: 2c 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20 36 2c  , 6, 6, 6, 6, 6,
1600: 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20 36 2c 20   6, 6, 6, 6, 6, 
1610: 36 2c 20 36 2c 20 20 20 20 20 20 20 2f 2a 20 33  6, 6,       /* 3
1620: 33 2e 2e 36 34 20 2a 2f 0a 20 20 20 20 37 2c 20  3..64 */.    7, 
1630: 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37  7, 7, 7, 7, 7, 7
1640: 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c  , 7, 7, 7, 7, 7,
1650: 20 37 2c 20 37 2c 20 37 2c 20 37 2c 0a 20 20 20   7, 7, 7, 7,.   
1660: 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20   7, 7, 7, 7, 7, 
1670: 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37  7, 7, 7, 7, 7, 7
1680: 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c  , 7, 7, 7, 7, 7,
1690: 0a 20 20 20 20 37 2c 20 37 2c 20 37 2c 20 37 2c  .    7, 7, 7, 7,
16a0: 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20   7, 7, 7, 7, 7, 
16b0: 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37  7, 7, 7, 7, 7, 7
16c0: 2c 20 37 2c 0a 20 20 20 20 37 2c 20 37 2c 20 37  , 7,.    7, 7, 7
16d0: 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c  , 7, 7, 7, 7, 7,
16e0: 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20 37 2c 20   7, 7, 7, 7, 7, 
16f0: 37 2c 20 37 2c 20 37 2c 20 20 20 20 20 20 20 2f  7, 7, 7,       /
1700: 2a 20 36 35 2e 2e 31 32 38 20 2a 2f 0a 20 20 20  * 65..128 */.   
1710: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20   8, 8, 8, 8, 8, 
1720: 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38  8, 8, 8, 8, 8, 8
1730: 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c  , 8, 8, 8, 8, 8,
1740: 0a 20 20 20 20 38 2c 20 38 2c 20 38 2c 20 38 2c  .    8, 8, 8, 8,
1750: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20   8, 8, 8, 8, 8, 
1760: 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38  8, 8, 8, 8, 8, 8
1770: 2c 20 38 2c 0a 20 20 20 20 38 2c 20 38 2c 20 38  , 8,.    8, 8, 8
1780: 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c  , 8, 8, 8, 8, 8,
1790: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20   8, 8, 8, 8, 8, 
17a0: 38 2c 20 38 2c 20 38 2c 0a 20 20 20 20 38 2c 20  8, 8, 8,.    8, 
17b0: 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38  8, 8, 8, 8, 8, 8
17c0: 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c  , 8, 8, 8, 8, 8,
17d0: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 0a 20 20 20   8, 8, 8, 8,.   
17e0: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20   8, 8, 8, 8, 8, 
17f0: 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38  8, 8, 8, 8, 8, 8
1800: 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c  , 8, 8, 8, 8, 8,
1810: 0a 20 20 20 20 38 2c 20 38 2c 20 38 2c 20 38 2c  .    8, 8, 8, 8,
1820: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20   8, 8, 8, 8, 8, 
1830: 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38  8, 8, 8, 8, 8, 8
1840: 2c 20 38 2c 0a 20 20 20 20 38 2c 20 38 2c 20 38  , 8,.    8, 8, 8
1850: 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c  , 8, 8, 8, 8, 8,
1860: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20   8, 8, 8, 8, 8, 
1870: 38 2c 20 38 2c 20 38 2c 0a 20 20 20 20 38 2c 20  8, 8, 8,.    8, 
1880: 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38  8, 8, 8, 8, 8, 8
1890: 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 38 2c  , 8, 8, 8, 8, 8,
18a0: 20 38 2c 20 38 2c 20 38 2c 20 38 2c 20 20 20 20   8, 8, 8, 8,    
18b0: 20 20 20 2f 2a 20 31 32 39 2e 2e 32 35 36 20 2a     /* 129..256 *
18c0: 2f 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65 72 74  /.  };..  assert
18d0: 28 6e 3c 3d 28 31 3c 3c 31 36 29 20 26 26 20 6e  (n<=(1<<16) && n
18e0: 3e 30 29 3b 0a 20 20 69 66 28 20 6e 3c 3d 32 35  >0);.  if( n<=25
18f0: 36 20 29 20 72 65 74 75 72 6e 20 4c 6f 67 54 61  6 ) return LogTa
1900: 62 6c 65 32 35 36 5b 6e 2d 31 5d 3b 0a 20 20 72  ble256[n-1];.  r
1910: 65 74 75 72 6e 20 4c 6f 67 54 61 62 6c 65 32 35  eturn LogTable25
1920: 36 5b 28 6e 3e 3e 38 29 20 2d 20 28 28 6e 26 30  6[(n>>8) - ((n&0
1930: 78 46 46 29 3f 30 3a 31 29 5d 20 2b 20 38 3b 0a  xFF)?0:1)] + 8;.
1940: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1950: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62  e and return a b
1960: 6c 6f 63 6b 20 6f 66 20 28 70 43 68 75 6e 6b 2d  lock of (pChunk-
1970: 3e 6e 41 74 6f 6d 20 3c 3c 20 69 4c 6f 67 73 69  >nAtom << iLogsi
1980: 7a 65 29 20 62 79 74 65 73 20 66 72 6f 6d 20 63  ze) bytes from c
1990: 68 75 6e 6b 0a 2a 2a 20 70 43 68 75 6e 6b 2e 20  hunk.** pChunk. 
19a0: 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  If the allocatio
19b0: 6e 20 72 65 71 75 65 73 74 20 63 61 6e 6e 6f 74  n request cannot
19c0: 20 62 65 20 73 61 74 69 73 66 69 65 64 2c 20 72   be satisfied, r
19d0: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
19e0: 69 63 20 76 6f 69 64 20 2a 63 68 75 6e 6b 4d 61  ic void *chunkMa
19f0: 6c 6c 6f 63 28 4d 65 6d 36 43 68 75 6e 6b 20 2a  lloc(Mem6Chunk *
1a00: 70 43 68 75 6e 6b 2c 20 69 6e 74 20 69 4c 6f 67  pChunk, int iLog
1a10: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  size){.  int i; 
1a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1a30: 65 78 20 6f 66 20 61 20 6d 65 6d 35 2e 61 50 6f  ex of a mem5.aPo
1a40: 6f 6c 5b 5d 20 73 6c 6f 74 20 2a 2f 0a 20 20 69  ol[] slot */.  i
1a50: 6e 74 20 69 42 69 6e 3b 20 20 20 20 20 20 20 20  nt iBin;        
1a60: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 6d 65  /* Index into me
1a70: 6d 35 2e 61 69 46 72 65 65 6c 69 73 74 5b 5d 20  m5.aiFreelist[] 
1a80: 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  */..  /* Make su
1a90: 72 65 20 6d 65 6d 35 2e 61 69 46 72 65 65 6c 69  re mem5.aiFreeli
1aa0: 73 74 5b 69 4c 6f 67 73 69 7a 65 5d 20 63 6f 6e  st[iLogsize] con
1ab0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
1ac0: 6e 65 20 66 72 65 65 0a 20 20 2a 2a 20 62 6c 6f  ne free.  ** blo
1ad0: 63 6b 2e 20 20 49 66 20 6e 6f 74 2c 20 74 68 65  ck.  If not, the
1ae0: 6e 20 73 70 6c 69 74 20 61 20 62 6c 6f 63 6b 20  n split a block 
1af0: 6f 66 20 74 68 65 20 6e 65 78 74 20 6c 61 72 67  of the next larg
1b00: 65 72 20 70 6f 77 65 72 20 6f 66 0a 20 20 2a 2a  er power of.  **
1b10: 20 74 77 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f   two in order to
1b20: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 72   create a new fr
1b30: 65 65 20 62 6c 6f 63 6b 20 6f 66 20 73 69 7a 65  ee block of size
1b40: 20 69 4c 6f 67 73 69 7a 65 2e 0a 20 20 2a 2f 0a   iLogsize..  */.
1b50: 20 20 66 6f 72 28 69 42 69 6e 3d 69 4c 6f 67 73    for(iBin=iLogs
1b60: 69 7a 65 3b 20 70 43 68 75 6e 6b 2d 3e 61 69 46  ize; pChunk->aiF
1b70: 72 65 65 6c 69 73 74 5b 69 42 69 6e 5d 3c 30 20  reelist[iBin]<0 
1b80: 26 26 20 69 42 69 6e 3c 3d 6d 65 6d 36 2e 6e 4c  && iBin<=mem6.nL
1b90: 6f 67 54 68 72 65 73 68 6f 6c 64 3b 20 69 42 69  ogThreshold; iBi
1ba0: 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 69 42 69  n++){}.  if( iBi
1bb0: 6e 3e 6d 65 6d 36 2e 6e 4c 6f 67 54 68 72 65 73  n>mem6.nLogThres
1bc0: 68 6f 6c 64 20 29 20 72 65 74 75 72 6e 20 30 3b  hold ) return 0;
1bd0: 0a 20 20 69 20 3d 20 6d 65 6d 73 79 73 36 55 6e  .  i = memsys6Un
1be0: 6c 69 6e 6b 46 69 72 73 74 28 70 43 68 75 6e 6b  linkFirst(pChunk
1bf0: 2c 20 69 42 69 6e 29 3b 0a 20 20 77 68 69 6c 65  , iBin);.  while
1c00: 28 20 69 42 69 6e 3e 69 4c 6f 67 73 69 7a 65 20  ( iBin>iLogsize 
1c10: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  ){.    int newSi
1c20: 7a 65 3b 0a 20 20 20 20 69 42 69 6e 2d 2d 3b 0a  ze;.    iBin--;.
1c30: 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 31 20      newSize = 1 
1c40: 3c 3c 20 69 42 69 6e 3b 0a 20 20 20 20 70 43 68  << iBin;.    pCh
1c50: 75 6e 6b 2d 3e 61 43 74 72 6c 5b 69 2b 6e 65 77  unk->aCtrl[i+new
1c60: 53 69 7a 65 5d 20 3d 20 43 54 52 4c 5f 46 52 45  Size] = CTRL_FRE
1c70: 45 20 7c 20 69 42 69 6e 3b 0a 20 20 20 20 6d 65  E | iBin;.    me
1c80: 6d 73 79 73 36 4c 69 6e 6b 28 70 43 68 75 6e 6b  msys6Link(pChunk
1c90: 2c 20 69 2b 6e 65 77 53 69 7a 65 2c 20 69 42 69  , i+newSize, iBi
1ca0: 6e 29 3b 0a 20 20 7d 0a 20 20 70 43 68 75 6e 6b  n);.  }.  pChunk
1cb0: 2d 3e 61 43 74 72 6c 5b 69 5d 20 3d 20 69 4c 6f  ->aCtrl[i] = iLo
1cc0: 67 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 52 65 74  gsize;..  /* Ret
1cd0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1ce0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
1cf0: 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 70 43 68 75  emory. */.  pChu
1d00: 6e 6b 2d 3e 6e 43 68 65 63 6b 65 64 4f 75 74 2b  nk->nCheckedOut+
1d10: 2b 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  +;.  return (voi
1d20: 64 2a 29 26 70 43 68 75 6e 6b 2d 3e 7a 50 6f 6f  d*)&pChunk->zPoo
1d30: 6c 5b 69 2a 70 43 68 75 6e 6b 2d 3e 6e 41 74 6f  l[i*pChunk->nAto
1d40: 6d 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  m];.}../*.** Fre
1d50: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
1d60: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
1d70: 2c 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61  , which is guara
1d80: 6e 74 65 65 64 20 74 6f 20 62 65 20 6e 6f 6e 2d  nteed to be non-
1d90: 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 61 20 70 61  zero.** and a pa
1da0: 72 74 20 6f 66 20 63 68 75 6e 6b 20 6f 62 6a 65  rt of chunk obje
1db0: 63 74 20 70 43 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  ct pChunk..*/.st
1dc0: 61 74 69 63 20 76 6f 69 64 20 63 68 75 6e 6b 46  atic void chunkF
1dd0: 72 65 65 28 4d 65 6d 36 43 68 75 6e 6b 20 2a 70  ree(Mem6Chunk *p
1de0: 43 68 75 6e 6b 2c 20 76 6f 69 64 20 2a 70 4f 6c  Chunk, void *pOl
1df0: 64 29 7b 0a 20 20 75 33 32 20 73 69 7a 65 2c 20  d){.  u32 size, 
1e00: 69 4c 6f 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20  iLogsize;.  int 
1e10: 69 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  iBlock;         
1e20: 20 20 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 69      ..  /* Set i
1e30: 42 6c 6f 63 6b 20 74 6f 20 74 68 65 20 69 6e 64  Block to the ind
1e40: 65 78 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ex of the block 
1e50: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 4f  pointed to by pO
1e60: 6c 64 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ld in .  ** the 
1e70: 61 72 72 61 79 20 6f 66 20 70 43 68 75 6e 6b 2d  array of pChunk-
1e80: 3e 6e 41 74 6f 6d 20 62 79 74 65 20 62 6c 6f 63  >nAtom byte bloc
1e90: 6b 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ks pointed to by
1ea0: 20 70 43 68 75 6e 6b 2d 3e 7a 50 6f 6f 6c 2e 0a   pChunk->zPool..
1eb0: 20 20 2a 2f 0a 20 20 69 42 6c 6f 63 6b 20 3d 20    */.  iBlock = 
1ec0: 28 28 75 38 20 2a 29 70 4f 6c 64 2d 70 43 68 75  ((u8 *)pOld-pChu
1ed0: 6e 6b 2d 3e 7a 50 6f 6f 6c 29 2f 70 43 68 75 6e  nk->zPool)/pChun
1ee0: 6b 2d 3e 6e 41 74 6f 6d 3b 0a 0a 20 20 2f 2a 20  k->nAtom;..  /* 
1ef0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
1f00: 6f 69 6e 74 65 72 20 70 4f 6c 64 20 70 6f 69 6e  ointer pOld poin
1f10: 74 73 20 74 6f 20 61 20 76 61 6c 69 64 2c 20 6e  ts to a valid, n
1f20: 6f 6e 2d 66 72 65 65 20 62 6c 6f 63 6b 2e 20 2a  on-free block. *
1f30: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 42 6c 6f  /.  assert( iBlo
1f40: 63 6b 3e 3d 30 20 26 26 20 69 42 6c 6f 63 6b 3c  ck>=0 && iBlock<
1f50: 70 43 68 75 6e 6b 2d 3e 6e 42 6c 6f 63 6b 20 29  pChunk->nBlock )
1f60: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 75 38  ;.  assert( ((u8
1f70: 20 2a 29 70 4f 6c 64 2d 70 43 68 75 6e 6b 2d 3e   *)pOld-pChunk->
1f80: 7a 50 6f 6f 6c 29 25 70 43 68 75 6e 6b 2d 3e 6e  zPool)%pChunk->n
1f90: 41 74 6f 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Atom==0 );.  ass
1fa0: 65 72 74 28 20 28 70 43 68 75 6e 6b 2d 3e 61 43  ert( (pChunk->aC
1fb0: 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 26 20 43 54  trl[iBlock] & CT
1fc0: 52 4c 5f 46 52 45 45 29 3d 3d 30 20 29 3b 0a 0a  RL_FREE)==0 );..
1fd0: 20 20 69 4c 6f 67 73 69 7a 65 20 3d 20 70 43 68    iLogsize = pCh
1fe0: 75 6e 6b 2d 3e 61 43 74 72 6c 5b 69 42 6c 6f 63  unk->aCtrl[iBloc
1ff0: 6b 5d 20 26 20 43 54 52 4c 5f 4c 4f 47 53 49 5a  k] & CTRL_LOGSIZ
2000: 45 3b 0a 20 20 73 69 7a 65 20 3d 20 31 3c 3c 69  E;.  size = 1<<i
2010: 4c 6f 67 73 69 7a 65 3b 0a 20 20 61 73 73 65 72  Logsize;.  asser
2020: 74 28 20 69 42 6c 6f 63 6b 2b 73 69 7a 65 2d 31  t( iBlock+size-1
2030: 3c 70 43 68 75 6e 6b 2d 3e 6e 42 6c 6f 63 6b 20  <pChunk->nBlock 
2040: 29 3b 0a 0a 20 20 70 43 68 75 6e 6b 2d 3e 61 43  );..  pChunk->aC
2050: 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20 7c 3d 20 43  trl[iBlock] |= C
2060: 54 52 4c 5f 46 52 45 45 3b 0a 20 20 70 43 68 75  TRL_FREE;.  pChu
2070: 6e 6b 2d 3e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b  nk->aCtrl[iBlock
2080: 2b 73 69 7a 65 2d 31 5d 20 7c 3d 20 43 54 52 4c  +size-1] |= CTRL
2090: 5f 46 52 45 45 3b 0a 0a 20 20 70 43 68 75 6e 6b  _FREE;..  pChunk
20a0: 2d 3e 61 43 74 72 6c 5b 69 42 6c 6f 63 6b 5d 20  ->aCtrl[iBlock] 
20b0: 3d 20 43 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c  = CTRL_FREE | iL
20c0: 6f 67 73 69 7a 65 3b 0a 20 20 77 68 69 6c 65 28  ogsize;.  while(
20d0: 20 69 4c 6f 67 73 69 7a 65 3c 6d 65 6d 36 2e 6e   iLogsize<mem6.n
20e0: 4c 6f 67 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a  LogThreshold ){.
20f0: 20 20 20 20 69 6e 74 20 69 42 75 64 64 79 3b 0a      int iBuddy;.
2100: 20 20 20 20 69 66 28 20 28 69 42 6c 6f 63 6b 3e      if( (iBlock>
2110: 3e 69 4c 6f 67 73 69 7a 65 29 20 26 20 31 20 29  >iLogsize) & 1 )
2120: 7b 0a 20 20 20 20 20 20 69 42 75 64 64 79 20 3d  {.      iBuddy =
2130: 20 69 42 6c 6f 63 6b 20 2d 20 73 69 7a 65 3b 0a   iBlock - size;.
2140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2150: 20 69 42 75 64 64 79 20 3d 20 69 42 6c 6f 63 6b   iBuddy = iBlock
2160: 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20   + size;.    }. 
2170: 20 20 20 61 73 73 65 72 74 28 20 69 42 75 64 64     assert( iBudd
2180: 79 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y>=0 );.    if( 
2190: 28 69 42 75 64 64 79 2b 28 31 3c 3c 69 4c 6f 67  (iBuddy+(1<<iLog
21a0: 73 69 7a 65 29 29 3e 70 43 68 75 6e 6b 2d 3e 6e  size))>pChunk->n
21b0: 42 6c 6f 63 6b 20 29 20 62 72 65 61 6b 3b 0a 20  Block ) break;. 
21c0: 20 20 20 69 66 28 20 70 43 68 75 6e 6b 2d 3e 61     if( pChunk->a
21d0: 43 74 72 6c 5b 69 42 75 64 64 79 5d 21 3d 28 43  Ctrl[iBuddy]!=(C
21e0: 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c 6f 67 73  TRL_FREE | iLogs
21f0: 69 7a 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ize) ) break;.  
2200: 20 20 6d 65 6d 73 79 73 36 55 6e 6c 69 6e 6b 28    memsys6Unlink(
2210: 70 43 68 75 6e 6b 2c 20 69 42 75 64 64 79 2c 20  pChunk, iBuddy, 
2220: 69 4c 6f 67 73 69 7a 65 29 3b 0a 20 20 20 20 69  iLogsize);.    i
2230: 4c 6f 67 73 69 7a 65 2b 2b 3b 0a 20 20 20 20 69  Logsize++;.    i
2240: 66 28 20 69 42 75 64 64 79 3c 69 42 6c 6f 63 6b  f( iBuddy<iBlock
2250: 20 29 7b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b   ){.      pChunk
2260: 2d 3e 61 43 74 72 6c 5b 69 42 75 64 64 79 5d 20  ->aCtrl[iBuddy] 
2270: 3d 20 43 54 52 4c 5f 46 52 45 45 20 7c 20 69 4c  = CTRL_FREE | iL
2280: 6f 67 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  ogsize;.      pC
2290: 68 75 6e 6b 2d 3e 61 43 74 72 6c 5b 69 42 6c 6f  hunk->aCtrl[iBlo
22a0: 63 6b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ck] = 0;.      i
22b0: 42 6c 6f 63 6b 20 3d 20 69 42 75 64 64 79 3b 0a  Block = iBuddy;.
22c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d0: 20 70 43 68 75 6e 6b 2d 3e 61 43 74 72 6c 5b 69   pChunk->aCtrl[i
22e0: 42 6c 6f 63 6b 5d 20 3d 20 43 54 52 4c 5f 46 52  Block] = CTRL_FR
22f0: 45 45 20 7c 20 69 4c 6f 67 73 69 7a 65 3b 0a 20  EE | iLogsize;. 
2300: 20 20 20 20 20 70 43 68 75 6e 6b 2d 3e 61 43 74       pChunk->aCt
2310: 72 6c 5b 69 42 75 64 64 79 5d 20 3d 20 30 3b 0a  rl[iBuddy] = 0;.
2320: 20 20 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 2a      }.    size *
2330: 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 43 68 75 6e  = 2;.  }.  pChun
2340: 6b 2d 3e 6e 43 68 65 63 6b 65 64 4f 75 74 2d 2d  k->nCheckedOut--
2350: 3b 0a 20 20 6d 65 6d 73 79 73 36 4c 69 6e 6b 28  ;.  memsys6Link(
2360: 70 43 68 75 6e 6b 2c 20 69 42 6c 6f 63 6b 2c 20  pChunk, iBlock, 
2370: 69 4c 6f 67 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  iLogsize);.}../*
2380: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
2390: 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
23a0: 65 20 62 6c 6f 63 6b 20 70 6f 69 6e 74 65 64 20  e block pointed 
23b0: 74 6f 20 62 79 20 70 2c 20 77 68 69 63 68 20 69  to by p, which i
23c0: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
23d0: 74 6f 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  to have been all
23e0: 6f 63 61 74 65 64 20 66 72 6f 6d 20 63 68 75 6e  ocated from chun
23f0: 6b 20 70 43 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61  k pChunk..*/.sta
2400: 74 69 63 20 69 6e 74 20 63 68 75 6e 6b 53 69 7a  tic int chunkSiz
2410: 65 28 4d 65 6d 36 43 68 75 6e 6b 20 2a 70 43 68  e(Mem6Chunk *pCh
2420: 75 6e 6b 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  unk, void *p){. 
2430: 20 69 6e 74 20 69 53 69 7a 65 20 3d 20 30 3b 0a   int iSize = 0;.
2440: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
2450: 6e 74 20 69 20 3d 20 28 28 75 38 20 2a 29 70 2d  nt i = ((u8 *)p-
2460: 70 43 68 75 6e 6b 2d 3e 7a 50 6f 6f 6c 29 2f 70  pChunk->zPool)/p
2470: 43 68 75 6e 6b 2d 3e 6e 41 74 6f 6d 3b 0a 20 20  Chunk->nAtom;.  
2480: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2490: 26 20 69 3c 70 43 68 75 6e 6b 2d 3e 6e 42 6c 6f  & i<pChunk->nBlo
24a0: 63 6b 20 29 3b 0a 20 20 20 20 69 53 69 7a 65 20  ck );.    iSize 
24b0: 3d 20 70 43 68 75 6e 6b 2d 3e 6e 41 74 6f 6d 20  = pChunk->nAtom 
24c0: 2a 20 28 31 20 3c 3c 20 28 70 43 68 75 6e 6b 2d  * (1 << (pChunk-
24d0: 3e 61 43 74 72 6c 5b 69 5d 26 43 54 52 4c 5f 4c  >aCtrl[i]&CTRL_L
24e0: 4f 47 53 49 5a 45 29 29 3b 0a 20 20 7d 0a 20 20  OGSIZE));.  }.  
24f0: 72 65 74 75 72 6e 20 69 53 69 7a 65 3b 0a 7d 0a  return iSize;.}.
2500: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2510: 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ue if there are 
2520: 63 75 72 72 65 6e 74 6c 79 20 6e 6f 20 6f 75 74  currently no out
2530: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
2540: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2550: 69 6e 74 20 63 68 75 6e 6b 49 73 45 6d 70 74 79  int chunkIsEmpty
2560: 28 4d 65 6d 36 43 68 75 6e 6b 20 2a 70 43 68 75  (Mem6Chunk *pChu
2570: 6e 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  nk){.  return (p
2580: 43 68 75 6e 6b 2d 3e 6e 43 68 65 63 6b 65 64 4f  Chunk->nCheckedO
2590: 75 74 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ut==0);.}../*.**
25a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
25b0: 62 75 66 66 65 72 20 7a 43 68 75 6e 6b 2c 20 77  buffer zChunk, w
25c0: 68 69 63 68 20 69 73 20 6e 43 68 75 6e 6b 20 62  hich is nChunk b
25d0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 73  ytes in size, as
25e0: 0a 2a 2a 20 61 6e 20 4d 65 6d 36 43 68 75 6e 6b  .** an Mem6Chunk
25f0: 20 6f 62 6a 65 63 74 2e 20 52 65 74 75 72 6e 20   object. Return 
2600: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 7a 43  a copy of the zC
2610: 68 75 6e 6b 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  hunk pointer..*/
2620: 0a 73 74 61 74 69 63 20 4d 65 6d 36 43 68 75 6e  .static Mem6Chun
2630: 6b 20 2a 63 68 75 6e 6b 49 6e 69 74 28 75 38 20  k *chunkInit(u8 
2640: 2a 7a 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *zChunk, int nCh
2650: 75 6e 6b 2c 20 69 6e 74 20 6e 4d 69 6e 41 6c 6c  unk, int nMinAll
2660: 6f 63 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  oc){.  int ii;. 
2670: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
2680: 4d 65 6d 36 43 68 75 6e 6b 20 2a 70 43 68 75 6e  Mem6Chunk *pChun
2690: 6b 20 3d 20 28 4d 65 6d 36 43 68 75 6e 6b 20 2a  k = (Mem6Chunk *
26a0: 29 7a 43 68 75 6e 6b 3b 0a 0a 20 20 61 73 73 65  )zChunk;..  asse
26b0: 72 74 28 20 6e 43 68 75 6e 6b 3e 73 69 7a 65 6f  rt( nChunk>sizeo
26c0: 66 28 4d 65 6d 36 43 68 75 6e 6b 29 20 29 3b 0a  f(Mem6Chunk) );.
26d0: 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 41 6c    assert( nMinAl
26e0: 6c 6f 63 3e 73 69 7a 65 6f 66 28 4d 65 6d 36 4c  loc>sizeof(Mem6L
26f0: 69 6e 6b 29 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  ink) );..  memse
2700: 74 28 70 43 68 75 6e 6b 2c 20 30 2c 20 73 69 7a  t(pChunk, 0, siz
2710: 65 6f 66 28 4d 65 6d 36 43 68 75 6e 6b 29 29 3b  eof(Mem6Chunk));
2720: 0a 20 20 70 43 68 75 6e 6b 2d 3e 6e 41 74 6f 6d  .  pChunk->nAtom
2730: 20 3d 20 6e 4d 69 6e 41 6c 6c 6f 63 3b 0a 20 20   = nMinAlloc;.  
2740: 70 43 68 75 6e 6b 2d 3e 6e 42 6c 6f 63 6b 20 3d  pChunk->nBlock =
2750: 20 28 28 6e 43 68 75 6e 6b 2d 73 69 7a 65 6f 66   ((nChunk-sizeof
2760: 28 4d 65 6d 36 43 68 75 6e 6b 29 29 20 2f 20 28  (Mem6Chunk)) / (
2770: 70 43 68 75 6e 6b 2d 3e 6e 41 74 6f 6d 2b 73 69  pChunk->nAtom+si
2780: 7a 65 6f 66 28 75 38 29 29 29 3b 0a 0a 20 20 70  zeof(u8)));..  p
2790: 43 68 75 6e 6b 2d 3e 7a 50 6f 6f 6c 20 3d 20 28  Chunk->zPool = (
27a0: 75 38 20 2a 29 26 70 43 68 75 6e 6b 5b 31 5d 3b  u8 *)&pChunk[1];
27b0: 0a 20 20 70 43 68 75 6e 6b 2d 3e 61 43 74 72 6c  .  pChunk->aCtrl
27c0: 20 3d 20 26 70 43 68 75 6e 6b 2d 3e 7a 50 6f 6f   = &pChunk->zPoo
27d0: 6c 5b 70 43 68 75 6e 6b 2d 3e 6e 42 6c 6f 63 6b  l[pChunk->nBlock
27e0: 2a 70 43 68 75 6e 6b 2d 3e 6e 41 74 6f 6d 5d 3b  *pChunk->nAtom];
27f0: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
2800: 3c 3d 6d 65 6d 36 2e 6e 4c 6f 67 54 68 72 65 73  <=mem6.nLogThres
2810: 68 6f 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  hold; ii++){.   
2820: 20 70 43 68 75 6e 6b 2d 3e 61 69 46 72 65 65 6c   pChunk->aiFreel
2830: 69 73 74 5b 69 69 5d 20 3d 20 2d 31 3b 0a 20 20  ist[ii] = -1;.  
2840: 7d 0a 0a 20 20 69 4f 66 66 73 65 74 20 3d 20 30  }..  iOffset = 0
2850: 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 65 6d 36 2e  ;.  for(ii=mem6.
2860: 6e 4c 6f 67 54 68 72 65 73 68 6f 6c 64 3b 20 69  nLogThreshold; i
2870: 69 3e 3d 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20  i>=0; ii--){.   
2880: 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 28 31   int nAlloc = (1
2890: 3c 3c 69 69 29 3b 0a 20 20 20 20 77 68 69 6c 65  <<ii);.    while
28a0: 28 20 28 69 4f 66 66 73 65 74 2b 6e 41 6c 6c 6f  ( (iOffset+nAllo
28b0: 63 29 3c 3d 70 43 68 75 6e 6b 2d 3e 6e 42 6c 6f  c)<=pChunk->nBlo
28c0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 70 43 68 75  ck ){.      pChu
28d0: 6e 6b 2d 3e 61 43 74 72 6c 5b 69 4f 66 66 73 65  nk->aCtrl[iOffse
28e0: 74 5d 20 3d 20 69 69 20 7c 20 43 54 52 4c 5f 46  t] = ii | CTRL_F
28f0: 52 45 45 3b 0a 20 20 20 20 20 20 6d 65 6d 73 79  REE;.      memsy
2900: 73 36 4c 69 6e 6b 28 70 43 68 75 6e 6b 2c 20 69  s6Link(pChunk, i
2910: 4f 66 66 73 65 74 2c 20 69 69 29 3b 0a 20 20 20  Offset, ii);.   
2920: 20 20 20 69 4f 66 66 73 65 74 20 2b 3d 20 6e 41     iOffset += nA
2930: 6c 6c 6f 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lloc;.    }.  }.
2940: 0a 20 20 72 65 74 75 72 6e 20 70 43 68 75 6e 6b  .  return pChunk
2950: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.}...static voi
2960: 64 20 6d 65 6d 36 45 6e 74 65 72 28 76 6f 69 64  d mem6Enter(void
2970: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
2980: 65 78 5f 65 6e 74 65 72 28 6d 65 6d 36 2e 6d 75  ex_enter(mem6.mu
2990: 74 65 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  tex);.}..static 
29a0: 76 6f 69 64 20 6d 65 6d 36 4c 65 61 76 65 28 76  void mem6Leave(v
29b0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
29c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 65 6d 36  mutex_leave(mem6
29d0: 2e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .mutex);.}../*.*
29e0: 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 6e  * Based on the n
29f0: 75 6d 62 65 72 20 61 6e 64 20 73 69 7a 65 20 6f  umber and size o
2a00: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
2a10: 61 6c 6c 6f 63 61 74 65 64 20 63 68 75 6e 6b 73  allocated chunks
2a20: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
2a30: 73 69 7a 65 20 6f 66 20 74 68 65 20 6e 65 78 74  size of the next
2a40: 20 63 68 75 6e 6b 20 74 6f 20 61 6c 6c 6f 63 61   chunk to alloca
2a50: 74 65 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f  te, in bytes..*/
2a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 78 74  .static int next
2a70: 43 68 75 6e 6b 53 69 7a 65 28 76 6f 69 64 29 7b  ChunkSize(void){
2a80: 0a 20 20 69 6e 74 20 69 54 6f 74 61 6c 20 3d 20  .  int iTotal = 
2a90: 4d 49 4e 5f 43 48 55 4e 4b 53 49 5a 45 3b 0a 20  MIN_CHUNKSIZE;. 
2aa0: 20 4d 65 6d 36 43 68 75 6e 6b 20 2a 70 3b 0a 20   Mem6Chunk *p;. 
2ab0: 20 66 6f 72 28 70 3d 6d 65 6d 36 2e 70 43 68 75   for(p=mem6.pChu
2ac0: 6e 6b 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nk; p; p=p->pNex
2ad0: 74 29 7b 0a 20 20 20 20 69 54 6f 74 61 6c 20 3d  t){.    iTotal =
2ae0: 20 69 54 6f 74 61 6c 2a 32 3b 0a 20 20 7d 0a 20   iTotal*2;.  }. 
2af0: 20 72 65 74 75 72 6e 20 69 54 6f 74 61 6c 3b 0a   return iTotal;.
2b00: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2b10: 72 65 65 43 68 75 6e 6b 28 4d 65 6d 36 43 68 75  reeChunk(Mem6Chu
2b20: 6e 6b 20 2a 70 43 68 75 6e 6b 29 7b 0a 20 20 4d  nk *pChunk){.  M
2b30: 65 6d 36 43 68 75 6e 6b 20 2a 2a 70 70 20 3d 20  em6Chunk **pp = 
2b40: 26 6d 65 6d 36 2e 70 43 68 75 6e 6b 3b 0a 20 20  &mem6.pChunk;.  
2b50: 66 6f 72 28 20 70 70 3d 26 6d 65 6d 36 2e 70 43  for( pp=&mem6.pC
2b60: 68 75 6e 6b 3b 20 2a 70 70 21 3d 70 43 68 75 6e  hunk; *pp!=pChun
2b70: 6b 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  k; pp = &(*pp)->
2b80: 70 4e 65 78 74 20 29 3b 0a 20 20 2a 70 70 20 3d  pNext );.  *pp =
2b90: 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20   (*pp)->pNext;. 
2ba0: 20 66 72 65 65 28 70 43 68 75 6e 6b 29 3b 0a 7d   free(pChunk);.}
2bb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d  ..static void *m
2bc0: 65 6d 73 79 73 36 4d 61 6c 6c 6f 63 28 69 6e 74  emsys6Malloc(int
2bd0: 20 6e 42 79 74 65 29 7b 0a 20 20 4d 65 6d 36 43   nByte){.  Mem6C
2be0: 68 75 6e 6b 20 2a 70 43 68 75 6e 6b 3b 0a 20 20  hunk *pChunk;.  
2bf0: 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 69  void *p = 0;.  i
2c00: 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 6e 42 79 74  nt nTotal = nByt
2c10: 65 2b 38 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  e+8;.  int iOffs
2c20: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  et = 0;..  if( n
2c30: 54 6f 74 61 6c 3e 6d 65 6d 36 2e 6e 54 68 72 65  Total>mem6.nThre
2c40: 73 68 6f 6c 64 20 29 7b 0a 20 20 20 20 70 20 3d  shold ){.    p =
2c50: 20 6d 61 6c 6c 6f 63 28 6e 54 6f 74 61 6c 29 3b   malloc(nTotal);
2c60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
2c70: 74 20 69 4c 6f 67 73 69 7a 65 20 3d 20 30 3b 0a  t iLogsize = 0;.
2c80: 20 20 20 20 69 66 28 20 6e 54 6f 74 61 6c 3e 28      if( nTotal>(
2c90: 31 3c 3c 4c 4f 47 32 5f 4d 49 4e 41 4c 4c 4f 43  1<<LOG2_MINALLOC
2ca0: 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 67 73  ) ){.      iLogs
2cb0: 69 7a 65 20 3d 20 72 6f 75 6e 64 75 70 4c 6f 67  ize = roundupLog
2cc0: 32 28 6e 54 6f 74 61 6c 29 20 2d 20 4c 4f 47 32  2(nTotal) - LOG2
2cd0: 5f 4d 49 4e 41 4c 4c 4f 43 3b 0a 20 20 20 20 7d  _MINALLOC;.    }
2ce0: 0a 20 20 20 20 6d 65 6d 36 45 6e 74 65 72 28 29  .    mem6Enter()
2cf0: 3b 0a 20 20 20 20 66 6f 72 28 70 43 68 75 6e 6b  ;.    for(pChunk
2d00: 3d 6d 65 6d 36 2e 70 43 68 75 6e 6b 3b 20 70 43  =mem6.pChunk; pC
2d10: 68 75 6e 6b 3b 20 70 43 68 75 6e 6b 3d 70 43 68  hunk; pChunk=pCh
2d20: 75 6e 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  unk->pNext){.   
2d30: 20 20 20 70 20 3d 20 63 68 75 6e 6b 4d 61 6c 6c     p = chunkMall
2d40: 6f 63 28 70 43 68 75 6e 6b 2c 20 69 4c 6f 67 73  oc(pChunk, iLogs
2d50: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
2d60: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  p ){.        bre
2d70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2d80: 7d 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b 0a  }.    if( !p ){.
2d90: 20 20 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20        int iSize 
2da0: 3d 20 6e 65 78 74 43 68 75 6e 6b 53 69 7a 65 28  = nextChunkSize(
2db0: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 6d 61 6c  );.      p = mal
2dc0: 6c 6f 63 28 69 53 69 7a 65 29 3b 0a 20 20 20 20  loc(iSize);.    
2dd0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
2de0: 20 20 20 70 43 68 75 6e 6b 20 3d 20 63 68 75 6e     pChunk = chun
2df0: 6b 49 6e 69 74 28 28 75 38 20 2a 29 70 2c 20 69  kInit((u8 *)p, i
2e00: 53 69 7a 65 2c 20 6d 65 6d 36 2e 6e 4d 69 6e 41  Size, mem6.nMinA
2e10: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
2e20: 43 68 75 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 6d  Chunk->pNext = m
2e30: 65 6d 36 2e 70 43 68 75 6e 6b 3b 0a 20 20 20 20  em6.pChunk;.    
2e40: 20 20 20 20 6d 65 6d 36 2e 70 43 68 75 6e 6b 20      mem6.pChunk 
2e50: 3d 20 70 43 68 75 6e 6b 3b 0a 20 20 20 20 20 20  = pChunk;.      
2e60: 20 20 70 20 3d 20 63 68 75 6e 6b 4d 61 6c 6c 6f    p = chunkMallo
2e70: 63 28 70 43 68 75 6e 6b 2c 20 69 4c 6f 67 73 69  c(pChunk, iLogsi
2e80: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ze);.        ass
2e90: 65 72 74 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ert(p);.      }.
2ea0: 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 73 65      }.    iOffse
2eb0: 74 20 3d 20 28 28 75 38 2a 29 70 20 2d 20 28 75  t = ((u8*)p - (u
2ec0: 38 2a 29 70 43 68 75 6e 6b 29 3b 0a 20 20 20 20  8*)pChunk);.    
2ed0: 6d 65 6d 36 4c 65 61 76 65 28 29 3b 0a 20 20 7d  mem6Leave();.  }
2ee0: 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
2ef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2f00: 20 20 28 28 75 33 32 20 2a 29 70 29 5b 30 5d 20    ((u32 *)p)[0] 
2f10: 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 28 28 75  = iOffset;.  ((u
2f20: 33 32 20 2a 29 70 29 5b 31 5d 20 3d 20 6e 42 79  32 *)p)[1] = nBy
2f30: 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 26 28 28  te;.  return &((
2f40: 75 33 32 20 2a 29 70 29 5b 32 5d 3b 0a 7d 0a 0a  u32 *)p)[2];.}..
2f50: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 73 79  static int memsy
2f60: 73 36 53 69 7a 65 28 76 6f 69 64 20 2a 70 50 72  s6Size(void *pPr
2f70: 69 6f 72 29 7b 0a 20 20 69 66 28 20 70 50 72 69  ior){.  if( pPri
2f80: 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  or==0 ) return 0
2f90: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 33 32  ;.  return ((u32
2fa0: 2a 29 70 50 72 69 6f 72 29 5b 2d 31 5d 3b 0a 7d  *)pPrior)[-1];.}
2fb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  ..static void me
2fc0: 6d 73 79 73 36 46 72 65 65 28 76 6f 69 64 20 2a  msys6Free(void *
2fd0: 70 50 72 69 6f 72 29 7b 0a 20 20 69 6e 74 20 69  pPrior){.  int i
2fe0: 53 6c 6f 74 3b 0a 20 20 76 6f 69 64 20 2a 70 20  Slot;.  void *p 
2ff0: 3d 20 26 28 28 75 33 32 20 2a 29 70 50 72 69 6f  = &((u32 *)pPrio
3000: 72 29 5b 2d 32 5d 3b 0a 20 20 69 53 6c 6f 74 20  r)[-2];.  iSlot 
3010: 3d 20 28 28 75 33 32 20 2a 29 70 29 5b 30 5d 3b  = ((u32 *)p)[0];
3020: 0a 20 20 69 66 28 20 69 53 6c 6f 74 20 29 7b 0a  .  if( iSlot ){.
3030: 20 20 20 20 4d 65 6d 36 43 68 75 6e 6b 20 2a 70      Mem6Chunk *p
3040: 43 68 75 6e 6b 3b 0a 20 20 20 20 6d 65 6d 36 45  Chunk;.    mem6E
3050: 6e 74 65 72 28 29 3b 0a 20 20 20 20 70 43 68 75  nter();.    pChu
3060: 6e 6b 20 3d 20 28 4d 65 6d 36 43 68 75 6e 6b 20  nk = (Mem6Chunk 
3070: 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b 2d 31  *)(&((u8 *)p)[-1
3080: 20 2a 20 69 53 6c 6f 74 5d 29 3b 0a 20 20 20 20   * iSlot]);.    
3090: 63 68 75 6e 6b 46 72 65 65 28 70 43 68 75 6e 6b  chunkFree(pChunk
30a0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 63 68  , p);.    if( ch
30b0: 75 6e 6b 49 73 45 6d 70 74 79 28 70 43 68 75 6e  unkIsEmpty(pChun
30c0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  k) ){.      free
30d0: 43 68 75 6e 6b 28 70 43 68 75 6e 6b 29 3b 0a 20  Chunk(pChunk);. 
30e0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 36 4c 65 61     }.    mem6Lea
30f0: 76 65 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ve();.  }else{. 
3100: 20 20 20 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a     free(p);.  }.
3110: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
3120: 6d 65 6d 73 79 73 36 52 65 61 6c 6c 6f 63 28 76  memsys6Realloc(v
3130: 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  oid *p, int nByt
3140: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 32 3b 0a  e){.  void *p2;.
3150: 0a 20 20 69 66 28 20 70 20 26 26 20 6e 42 79 74  .  if( p && nByt
3160: 65 3c 3d 6d 65 6d 73 79 73 36 53 69 7a 65 28 70  e<=memsys6Size(p
3170: 29 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 70 3b  ) ){.    p2 = p;
3180: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 32  .  }else{.    p2
3190: 20 3d 20 6d 65 6d 73 79 73 36 4d 61 6c 6c 6f 63   = memsys6Malloc
31a0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
31b0: 20 70 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20   p && p2 ){.    
31c0: 20 20 6d 65 6d 63 70 79 28 70 32 2c 20 70 2c 20    memcpy(p2, p, 
31d0: 6d 65 6d 73 79 73 36 53 69 7a 65 28 70 29 29 3b  memsys6Size(p));
31e0: 0a 20 20 20 20 20 20 6d 65 6d 73 79 73 36 46 72  .      memsys6Fr
31f0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(p);.    }.  }
3200: 0a 0a 20 20 72 65 74 75 72 6e 20 70 32 3b 0a 7d  ..  return p2;.}
3210: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  ..static int mem
3220: 73 79 73 36 52 6f 75 6e 64 75 70 28 69 6e 74 20  sys6Roundup(int 
3230: 6e 29 7b 0a 20 20 69 66 28 20 6e 3e 6d 65 6d 36  n){.  if( n>mem6
3240: 2e 6e 54 68 72 65 73 68 6f 6c 64 20 29 7b 0a 20  .nThreshold ){. 
3250: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d     return n;.  }
3260: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
3270: 20 28 31 3c 3c 72 6f 75 6e 64 75 70 4c 6f 67 32   (1<<roundupLog2
3280: 28 6e 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  (n));.  }.}..sta
3290: 74 69 63 20 69 6e 74 20 6d 65 6d 73 79 73 36 49  tic int memsys6I
32a0: 6e 69 74 28 76 6f 69 64 20 2a 70 43 74 78 29 7b  nit(void *pCtx){
32b0: 0a 20 20 75 38 20 62 4d 65 6d 73 74 61 74 20 3d  .  u8 bMemstat =
32c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32d0: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 3b 0a 20  nfig.bMemstat;. 
32e0: 20 6d 65 6d 36 2e 6e 4d 69 6e 41 6c 6c 6f 63 20   mem6.nMinAlloc 
32f0: 3d 20 28 31 20 3c 3c 20 4c 4f 47 32 5f 4d 49 4e  = (1 << LOG2_MIN
3300: 41 4c 4c 4f 43 29 3b 0a 20 20 6d 65 6d 36 2e 70  ALLOC);.  mem6.p
3310: 43 68 75 6e 6b 20 3d 20 30 3b 0a 20 20 6d 65 6d  Chunk = 0;.  mem
3320: 36 2e 6e 54 68 72 65 73 68 6f 6c 64 20 3d 20 73  6.nThreshold = s
3330: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3340: 69 67 2e 6e 53 6d 61 6c 6c 3b 0a 20 20 69 66 28  ig.nSmall;.  if(
3350: 20 6d 65 6d 36 2e 6e 54 68 72 65 73 68 6f 6c 64   mem6.nThreshold
3360: 3c 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 36 2e  <=0 ){.    mem6.
3370: 6e 54 68 72 65 73 68 6f 6c 64 20 3d 20 53 4d 41  nThreshold = SMA
3380: 4c 4c 5f 4d 41 4c 4c 4f 43 5f 44 45 46 41 55 4c  LL_MALLOC_DEFAUL
3390: 54 5f 54 48 52 45 53 48 4f 4c 44 3b 0a 20 20 7d  T_THRESHOLD;.  }
33a0: 0a 20 20 6d 65 6d 36 2e 6e 4c 6f 67 54 68 72 65  .  mem6.nLogThre
33b0: 73 68 6f 6c 64 20 3d 20 72 6f 75 6e 64 75 70 4c  shold = roundupL
33c0: 6f 67 32 28 6d 65 6d 36 2e 6e 54 68 72 65 73 68  og2(mem6.nThresh
33d0: 6f 6c 64 29 20 2d 20 4c 4f 47 32 5f 4d 49 4e 41  old) - LOG2_MINA
33e0: 4c 4c 4f 43 3b 0a 20 20 69 66 28 20 21 62 4d 65  LLOC;.  if( !bMe
33f0: 6d 73 74 61 74 20 29 7b 0a 20 20 20 20 6d 65 6d  mstat ){.    mem
3400: 36 2e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  6.mutex = sqlite
3410: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
3420: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
3430: 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  MEM);.  }.  retu
3440: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
3460: 73 79 73 36 53 68 75 74 64 6f 77 6e 28 76 6f 69  sys6Shutdown(voi
3470: 64 20 2a 70 43 74 78 29 7b 0a 20 20 6d 65 6d 73  d *pCtx){.  mems
3480: 65 74 28 26 6d 65 6d 36 2c 20 30 2c 20 73 69 7a  et(&mem6, 0, siz
3490: 65 6f 66 28 6d 65 6d 36 29 29 3b 0a 7d 0a 0a 2f  eof(mem6));.}../
34a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34b0: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 72 6f  e is the only ro
34c0: 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69  utine in this fi
34d0: 6c 65 20 77 69 74 68 20 65 78 74 65 72 6e 61 6c  le with external
34e0: 20 0a 2a 2a 20 6c 69 6e 6b 61 67 65 2e 20 49 74   .** linkage. It
34f0: 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
3500: 65 72 20 74 6f 20 61 20 73 74 61 74 69 63 20 73  er to a static s
3510: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3520: 64 73 0a 2a 2a 20 73 74 72 75 63 74 20 70 6f 70  ds.** struct pop
3530: 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
3540: 6d 65 6d 73 79 73 36 20 6d 65 74 68 6f 64 73 2e  memsys6 methods.
3550: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
3560: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
3570: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
3580: 79 73 36 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  ys6(void){.  sta
3590: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
35a0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 6d 65  3_mem_methods me
35b0: 6d 73 79 73 36 4d 65 74 68 6f 64 73 20 3d 20 7b  msys6Methods = {
35c0: 0a 20 20 20 20 20 6d 65 6d 73 79 73 36 4d 61 6c  .     memsys6Mal
35d0: 6c 6f 63 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73  loc,.     memsys
35e0: 36 46 72 65 65 2c 0a 20 20 20 20 20 6d 65 6d 73  6Free,.     mems
35f0: 79 73 36 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20  ys6Realloc,.    
3600: 20 6d 65 6d 73 79 73 36 53 69 7a 65 2c 0a 20 20   memsys6Size,.  
3610: 20 20 20 6d 65 6d 73 79 73 36 52 6f 75 6e 64 75     memsys6Roundu
3620: 70 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73 36 49  p,.     memsys6I
3630: 6e 69 74 2c 0a 20 20 20 20 20 6d 65 6d 73 79 73  nit,.     memsys
3640: 36 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 20  6Shutdown,.     
3650: 30 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20  0.  };.  return 
3660: 26 6d 65 6d 73 79 73 36 4d 65 74 68 6f 64 73 3b  &memsys6Methods;
3670: 0a 7d 0a 0a 23 65 6e 64 69 66 0a                 .}..#endif.