Hex Artifact Content
Not logged in

Artifact 9c7e6443a2b6529c4317e032f738c905804d7b29:


0000: 23 64 65 66 69 6e 65 09 4a 45 4d 41 4c 4c 4f 43  #define.JEMALLOC
0010: 5f 45 58 54 45 4e 54 5f 43 5f 0a 23 69 6e 63 6c  _EXTENT_C_.#incl
0020: 75 64 65 20 22 6a 65 6d 61 6c 6c 6f 63 2f 69 6e  ude "jemalloc/in
0030: 74 65 72 6e 61 6c 2f 6a 65 6d 61 6c 6c 6f 63 5f  ternal/jemalloc_
0040: 69 6e 74 65 72 6e 61 6c 2e 68 22 0a 0a 2f 2a 2a  internal.h"../**
0050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 4a  ************/..J
00a0: 45 4d 41 4c 4c 4f 43 5f 49 4e 4c 49 4e 45 5f 43  EMALLOC_INLINE_C
00b0: 20 73 69 7a 65 5f 74 0a 65 78 74 65 6e 74 5f 71   size_t.extent_q
00c0: 75 61 6e 74 69 7a 65 28 73 69 7a 65 5f 74 20 73  uantize(size_t s
00d0: 69 7a 65 29 0a 7b 0a 0a 09 2f 2a 0a 09 20 2a 20  ize).{.../*.. * 
00e0: 52 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68  Round down to th
00f0: 65 20 6e 65 61 72 65 73 74 20 63 68 75 6e 6b 20  e nearest chunk 
0100: 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 61 63  size that can ac
0110: 74 75 61 6c 6c 79 20 62 65 20 72 65 71 75 65 73  tually be reques
0120: 74 65 64 0a 09 20 2a 20 64 75 72 69 6e 67 20 6e  ted.. * during n
0130: 6f 72 6d 61 6c 20 68 75 67 65 20 61 6c 6c 6f 63  ormal huge alloc
0140: 61 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 09 72 65 74  ation... */..ret
0150: 75 72 6e 20 28 69 6e 64 65 78 32 73 69 7a 65 28  urn (index2size(
0160: 73 69 7a 65 32 69 6e 64 65 78 28 73 69 7a 65 20  size2index(size 
0170: 2b 20 31 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 4a  + 1) - 1));.}..J
0180: 45 4d 41 4c 4c 4f 43 5f 49 4e 4c 49 4e 45 5f 43  EMALLOC_INLINE_C
0190: 20 69 6e 74 0a 65 78 74 65 6e 74 5f 73 7a 61 64   int.extent_szad
01a0: 5f 63 6f 6d 70 28 63 6f 6e 73 74 20 65 78 74 65  _comp(const exte
01b0: 6e 74 5f 6e 6f 64 65 5f 74 20 2a 61 2c 20 63 6f  nt_node_t *a, co
01c0: 6e 73 74 20 65 78 74 65 6e 74 5f 6e 6f 64 65 5f  nst extent_node_
01d0: 74 20 2a 62 29 0a 7b 0a 09 69 6e 74 20 72 65 74  t *b).{..int ret
01e0: 3b 0a 09 73 69 7a 65 5f 74 20 61 5f 71 73 69 7a  ;..size_t a_qsiz
01f0: 65 20 3d 20 65 78 74 65 6e 74 5f 71 75 61 6e 74  e = extent_quant
0200: 69 7a 65 28 65 78 74 65 6e 74 5f 6e 6f 64 65 5f  ize(extent_node_
0210: 73 69 7a 65 5f 67 65 74 28 61 29 29 3b 0a 09 73  size_get(a));..s
0220: 69 7a 65 5f 74 20 62 5f 71 73 69 7a 65 20 3d 20  ize_t b_qsize = 
0230: 65 78 74 65 6e 74 5f 71 75 61 6e 74 69 7a 65 28  extent_quantize(
0240: 65 78 74 65 6e 74 5f 6e 6f 64 65 5f 73 69 7a 65  extent_node_size
0250: 5f 67 65 74 28 62 29 29 3b 0a 0a 09 2f 2a 0a 09  _get(b));.../*..
0260: 20 2a 20 43 6f 6d 70 61 72 65 20 62 61 73 65 64   * Compare based
0270: 20 6f 6e 20 71 75 61 6e 74 69 7a 65 64 20 73 69   on quantized si
0280: 7a 65 20 72 61 74 68 65 72 20 74 68 61 6e 20 73  ze rather than s
0290: 69 7a 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ize, in order to
02a0: 20 73 6f 72 74 0a 09 20 2a 20 65 71 75 61 6c 6c   sort.. * equall
02b0: 79 20 75 73 65 66 75 6c 20 65 78 74 65 6e 74 73  y useful extents
02c0: 20 6f 6e 6c 79 20 62 79 20 61 64 64 72 65 73 73   only by address
02d0: 2e 0a 09 20 2a 2f 0a 09 72 65 74 20 3d 20 28 61  ... */..ret = (a
02e0: 5f 71 73 69 7a 65 20 3e 20 62 5f 71 73 69 7a 65  _qsize > b_qsize
02f0: 29 20 2d 20 28 61 5f 71 73 69 7a 65 20 3c 20 62  ) - (a_qsize < b
0300: 5f 71 73 69 7a 65 29 3b 0a 09 69 66 20 28 72 65  _qsize);..if (re
0310: 74 20 3d 3d 20 30 29 20 7b 0a 09 09 75 69 6e 74  t == 0) {...uint
0320: 70 74 72 5f 74 20 61 5f 61 64 64 72 20 3d 20 28  ptr_t a_addr = (
0330: 75 69 6e 74 70 74 72 5f 74 29 65 78 74 65 6e 74  uintptr_t)extent
0340: 5f 6e 6f 64 65 5f 61 64 64 72 5f 67 65 74 28 61  _node_addr_get(a
0350: 29 3b 0a 09 09 75 69 6e 74 70 74 72 5f 74 20 62  );...uintptr_t b
0360: 5f 61 64 64 72 20 3d 20 28 75 69 6e 74 70 74 72  _addr = (uintptr
0370: 5f 74 29 65 78 74 65 6e 74 5f 6e 6f 64 65 5f 61  _t)extent_node_a
0380: 64 64 72 5f 67 65 74 28 62 29 3b 0a 0a 09 09 72  ddr_get(b);....r
0390: 65 74 20 3d 20 28 61 5f 61 64 64 72 20 3e 20 62  et = (a_addr > b
03a0: 5f 61 64 64 72 29 20 2d 20 28 61 5f 61 64 64 72  _addr) - (a_addr
03b0: 20 3c 20 62 5f 61 64 64 72 29 3b 0a 09 7d 0a 0a   < b_addr);..}..
03c0: 09 72 65 74 75 72 6e 20 28 72 65 74 29 3b 0a 7d  .return (ret);.}
03d0: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 72 65  ../* Generate re
03e0: 64 2d 62 6c 61 63 6b 20 74 72 65 65 20 66 75 6e  d-black tree fun
03f0: 63 74 69 6f 6e 73 2e 20 2a 2f 0a 72 62 5f 67 65  ctions. */.rb_ge
0400: 6e 28 2c 20 65 78 74 65 6e 74 5f 74 72 65 65 5f  n(, extent_tree_
0410: 73 7a 61 64 5f 2c 20 65 78 74 65 6e 74 5f 74 72  szad_, extent_tr
0420: 65 65 5f 74 2c 20 65 78 74 65 6e 74 5f 6e 6f 64  ee_t, extent_nod
0430: 65 5f 74 2c 20 73 7a 61 64 5f 6c 69 6e 6b 2c 0a  e_t, szad_link,.
0440: 20 20 20 20 65 78 74 65 6e 74 5f 73 7a 61 64 5f      extent_szad_
0450: 63 6f 6d 70 29 0a 0a 4a 45 4d 41 4c 4c 4f 43 5f  comp)..JEMALLOC_
0460: 49 4e 4c 49 4e 45 5f 43 20 69 6e 74 0a 65 78 74  INLINE_C int.ext
0470: 65 6e 74 5f 61 64 5f 63 6f 6d 70 28 63 6f 6e 73  ent_ad_comp(cons
0480: 74 20 65 78 74 65 6e 74 5f 6e 6f 64 65 5f 74 20  t extent_node_t 
0490: 2a 61 2c 20 63 6f 6e 73 74 20 65 78 74 65 6e 74  *a, const extent
04a0: 5f 6e 6f 64 65 5f 74 20 2a 62 29 0a 7b 0a 09 75  _node_t *b).{..u
04b0: 69 6e 74 70 74 72 5f 74 20 61 5f 61 64 64 72 20  intptr_t a_addr 
04c0: 3d 20 28 75 69 6e 74 70 74 72 5f 74 29 65 78 74  = (uintptr_t)ext
04d0: 65 6e 74 5f 6e 6f 64 65 5f 61 64 64 72 5f 67 65  ent_node_addr_ge
04e0: 74 28 61 29 3b 0a 09 75 69 6e 74 70 74 72 5f 74  t(a);..uintptr_t
04f0: 20 62 5f 61 64 64 72 20 3d 20 28 75 69 6e 74 70   b_addr = (uintp
0500: 74 72 5f 74 29 65 78 74 65 6e 74 5f 6e 6f 64 65  tr_t)extent_node
0510: 5f 61 64 64 72 5f 67 65 74 28 62 29 3b 0a 0a 09  _addr_get(b);...
0520: 72 65 74 75 72 6e 20 28 28 61 5f 61 64 64 72 20  return ((a_addr 
0530: 3e 20 62 5f 61 64 64 72 29 20 2d 20 28 61 5f 61  > b_addr) - (a_a
0540: 64 64 72 20 3c 20 62 5f 61 64 64 72 29 29 3b 0a  ddr < b_addr));.
0550: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 72  }../* Generate r
0560: 65 64 2d 62 6c 61 63 6b 20 74 72 65 65 20 66 75  ed-black tree fu
0570: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 72 62 5f 67  nctions. */.rb_g
0580: 65 6e 28 2c 20 65 78 74 65 6e 74 5f 74 72 65 65  en(, extent_tree
0590: 5f 61 64 5f 2c 20 65 78 74 65 6e 74 5f 74 72 65  _ad_, extent_tre
05a0: 65 5f 74 2c 20 65 78 74 65 6e 74 5f 6e 6f 64 65  e_t, extent_node
05b0: 5f 74 2c 20 61 64 5f 6c 69 6e 6b 2c 20 65 78 74  _t, ad_link, ext
05c0: 65 6e 74 5f 61 64 5f 63 6f 6d 70 29 0a           ent_ad_comp).