第40章 ビンの初期化

ビンの初期化は malloc_init_state() 関数で行われます。

以下がソースとなりますね。

malloc.c(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/malloc/malloc.c). 

1800 /*
1801    Initialize a malloc_state struct.
1802
1803    This is called from ptmalloc_init () or from _int_new_arena ()
1804    when creating a new arena.
1805  */
1806
1807 static void
1808 malloc_init_state (mstate av)
1809 {
1810   int i;
1811   mbinptr bin;
1812
1813   /* Establish circular links for normal bins */
1814   for (i = 1; i < NBINS; ++i)
1815     {
1816       bin = bin_at (av, i);
1817       bin->fd = bin->bk = bin;
1818     }
1819
1820 #if MORECORE_CONTIGUOUS
1821   if (av != &main_arena)
1822 #endif
1823   set_noncontiguous (av);
1824   if (av == &main_arena)
1825     set_max_fast (DEFAULT_MXFAST);
1826   atomic_store_relaxed (&av->have_fastchunks, false);
1827
1828   av->top = initial_top (av);
1829 }

コメントに書いてますが ptmalloc_init() または _int_new_arena() をコールする際に使用されるらしいです。

bin_at() 関数からビンを指すポンターを取得して、そこから fd と bk ポインターを初期化しています。

Copyright 2018-2019, by Masaki Komatsu