BoehmGC - Понимание распределителя памяти GC_malloc - PullRequest
1 голос
/ 07 сентября 2011

Я ломаю голову в понимании схемы распределения BoehmGC - GC_malloc.Я не понимаю, как он распределяет память, не видел ни одного malloc или mmap, который GC_malloc внутренне вызывает.

Может ли кто-нибудь помочь мне?Любые ссылки или фрагмент кода будут очень полезны.

Огромное спасибо заранее. Исходный код Boehm GC

 enter code here
 254 /* Allocate lb bytes of composite (pointerful) data */
 255 #ifdef THREAD_LOCAL_ALLOC
 256   void * GC_core_malloc(size_t lb)
 257 #else
 258   void * GC_malloc(size_t lb)
 259 #endif
 260 {
 261     void *op;
 262     void **opp;
 263     size_t lg;
 264     DCL_LOCK_STATE;
 265 
 266     if(SMALL_OBJ(lb)) {
 267         lg = GC_size_map[lb];
 268         opp = (void **)&(GC_objfreelist[lg]);
 269         LOCK();
 270         if( EXPECT((op = *opp) == 0, 0) ) {
 271             UNLOCK();
 272             return(GENERAL_MALLOC((word)lb, NORMAL));
 273         }
 274         /* See above comment on signals.        */
 275         GC_ASSERT(0 == obj_link(op)
 276                   || (word)obj_link(op)
 277                         <= (word)GC_greatest_plausible_heap_addr
 278                      && (word)obj_link(op)
 279                         >= (word)GC_least_plausible_heap_addr);
 280         *opp = obj_link(op);
 281         obj_link(op) = 0;
 282         GC_bytes_allocd += GRANULES_TO_BYTES(lg);
 283         UNLOCK();
 284         return op;
 285    } else {
 286        return(GENERAL_MALLOC(lb, NORMAL));
 287    }
 288 }

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Посмотрите на файл os_deps.c, в котором (большинство) из OS-зависимых функций реализованы.

mmap может использоваться Boehm-GC, если он настроен на это. (См. Различные функции GC_unix_get_mem(bytes).)

Если mmap не используется, используется другой (пустой) распределитель sbrk.

0 голосов
/ 07 сентября 2011

Есть две возможности:

  • Возвращает указатель, заданный GENERAL_MALLOC (два возврата)
  • устанавливает op = *opp (строка с EXPECT), а затем возвращает op. Я скажу, что второе - это повторно использовать освобожденные блоки.

Для второго случая: посмотрите на значение opp перед if:

opp = (void **)&(GC_objfreelist[lg]);

В opp есть указатель на «свободный» список объектов.

if, вероятно, проверяет, есть ли какой-либо блок в этом списке. Если нет (== 0), тогда используется GENERAL_MALLOC.

...