(Bu özet içinde kontroller açıklanmamıştır ve bazı durumlar kısalık için atlanmıştır)
__libc_malloc, tcache'den bir parça almaya çalışır, eğer alamazsa _int_malloc çağrılır.
_int_malloc :
Eğer arena yoksa oluşturmaya çalışır.
Doğru boyutta herhangi bir hızlı bin parçası varsa, onu kullanır.
Tcache'i diğer hızlı parçalarla doldurur.
Doğru boyutta herhangi bir küçük bin parçası varsa, onu kullanır.
Tcache'i o boyuttaki diğer parçalarla doldurur.
İstenen boyut küçük binler için değilse, hızlı binleri sıralanmamış bin içine birleştirir.
Sıralanmamış bin kontrol edilir, yeterli alana sahip ilk parça kullanılır.
Bulunan parça daha büyükse, bir kısmını döndürmek için böler ve hatırlatmayı sıralanmamış bin'e ekler.
Eğer bir parça istenen boyutla aynı boyuttaysa, onu döndürmek yerine tcache'i doldurmak için kullanır (tcache dolana kadar, sonra bir sonraki parçayı döndürür).
Kontrol edilen her küçük boyuttaki parça için, onu ilgili küçük veya büyük bin'e koyar.
İstenen boyuttaki büyük bin'i kontrol eder.
İstenen boyuttan daha büyük olan ilk parçadan başlayarak bakar, eğer bulunursa onu döndürür ve hatırlatmaları küçük bin'e ekler.
Sonuna kadar sonraki indekslerden büyük bin'leri kontrol eder.
Sonraki daha büyük indeksten herhangi bir parçayı kontrol eder, bulunan ilk parçayı istenen boyut için kullanmak üzere böler ve hatırlatmayı sıralanmamış bin'e ekler.
Önceki bin'lerde hiçbir şey bulunamazsa, üst parçadan bir parça alır.
Eğer üst parça yeterince büyük değilse, sysmalloc ile büyütür.
__libc_malloc
malloc fonksiyonu aslında __libc_malloc'ı çağırır. Bu fonksiyon, istenen boyutta herhangi bir mevcut parça olup olmadığını görmek için tcache'i kontrol eder. Eğer varsa onu kullanır, yoksa tek bir iş parçacığı olup olmadığını kontrol eder ve bu durumda ana arenada _int_malloc'ı çağırır, eğer değilse iş parçacığının arenasında _int_malloc'ı çağırır.
__libc_malloc kodu
```c // From https://github.com/bminor/glibc/blob/master/malloc/malloc.c
victim = _int_malloc (ar_ptr, bytes); /* Retry with another arena only if we were able to find a usable arena before. */ if (!victim && ar_ptr != NULL) { LIBC_PROBE (memory_malloc_retry, 1, bytes); ar_ptr = arena_get_retry (ar_ptr, bytes); victim = _int_malloc (ar_ptr, bytes); }
if (ar_ptr != NULL) __libc_lock_unlock (ar_ptr->mutex);
</details>
Dikkat edin ki, döndürülen işaretçiyi her zaman `tag_new_usable` ile etiketleyecektir, koddan:
```c
void *tag_new_usable (void *ptr)
Allocate a new random color and use it to color the user region of
a chunk; this may include data from the subsequent chunk's header
if tagging is sufficiently fine grained. Returns PTR suitably
recolored for accessing the memory there.
_int_malloc
Bu, diğer kutuları ve üst parçayı kullanarak bellek ayıran işlevdir.
Başlangıç
İlk olarak bazı değişkenler tanımlanır ve istenen bellek alanının gerçek boyutunu almak için işlem yapılır:
Fast Bin
Eğer gereken boyut Fast Bins boyutları içindeyse, hızlı binlerden bir parça kullanmayı deneyin. Temelde, boyuta dayanarak, geçerli parçaların bulunması gereken hızlı bin indeksini bulacak ve eğer varsa, bunlardan birini döndürecektir.
Ayrıca, eğer tcache etkinse, o boyuttaki tcache binini hızlı binlerle dolduracaktır.
Bu işlemleri gerçekleştirirken, burada bazı güvenlik kontrolleri yapılır:
Eğer parça hizalanmamışsa: malloc(): unaligned fastbin chunk detected 2
Eğer ileri parça hizalanmamışsa: malloc(): unaligned fastbin chunk detected
Eğer döndürülen parçanın boyutu hızlı bin içindeki indeksinden dolayı doğru değilse: malloc(): memory corruption (fast)
Tcache'i doldurmak için kullanılan herhangi bir parça hizalanmamışsa: malloc(): unaligned fastbin chunk detected 3
malloc_consolidate
Eğer küçük bir parça değilse, büyük bir parçadır ve bu durumda malloc_consolidate bellek parçalanmasını önlemek için çağrılır.
Sıralanmamış kutu
Kullanmak için potansiyel geçerli bir parça bulmak üzere sıralanmamış kutuyu kontrol etme zamanı.
Başlangıç
Bu, bk yönünde sıralanmamış kutuyu geçerek sona (arena yapısı) ulaşana kadar devam eden büyük bir döngü ile başlar: while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))
Ayrıca, her yeni parça değerlendirildiğinde bazı güvenlik kontrolleri yapılır:
Eğer parça boyutu garipse (çok küçük veya çok büyük): malloc(): invalid size (unsorted)
Eğer bir sonraki parça boyutu garipse (çok küçük veya çok büyük): malloc(): invalid next size (unsorted)
Eğer bir sonraki parça tarafından belirtilen önceki boyut, parçanın boyutundan farklıysa: malloc(): mismatching next->prev_size (unsorted)
Eğer victim->bck->fd == victim değilse veya victim->fd == av (arena) değilse: malloc(): unsorted double linked list corrupted
Her zaman sonuncusunu kontrol ettiğimiz için, fd her zaman arena yapısına işaret etmelidir.
Eğer bir sonraki parça, öncekinin kullanımda olduğunu belirtmiyorsa: malloc(): invalid next->prev_inuse (unsorted)
Eğer bu başarılı olduysa, parçayı döndür ve iş bitti, değilse, fonksiyonu çalıştırmaya devam et...
eğer eşit boyut
İstenen boyut tam olarak parçanın boyutuna eşitse, parçayı kutudan çıkarmaya devam et:
Eğer tcache dolu değilse, onu tcache'e ekle ve kullanılabilecek bir tcache parçası olduğunu belirtmeye devam et
Eğer tcache doluysa, sadece onu kullan ve geri döndür
_int_malloc sınırları
Bu noktada, kullanılabilecek bir parça tcache'de saklandıysa ve sınır aşıldıysa, sadece bir tcache parçası döndür.
Ayrıca, MAX_ITERS aşıldıysa, döngüden çık ve farklı bir şekilde bir parça al (top parça).
return_cached ayarlandıysa, daha büyük aramaları önlemek için sadece tcache'den bir parça döndür.
Eğer bir parça bunun için uygun bulunamazsa, devam et
Büyük Kutular (bir sonraki daha büyük)
Eğer tam büyük kutuda kullanılabilecek bir parça yoksa, hemen daha büyük olanla başlayarak tüm bir sonraki büyük kutular arasında döngüye girin ve bir tane bulunana kadar devam edin (varsa).
Bölünmüş parçanın hatırlatıcısı sıralanmamış kutuya eklenir, last_reminder güncellenir ve aynı güvenlik kontrolü gerçekleştirilir:
bck->fd-> bk != bck: malloc(): bozulmuş sıralanmamış parçalar2
sysmalloc
sysmalloc başlangıcı
Eğer arena null ise veya istenen boyut çok büyükse (ve izin verilen mmaps kalmışsa) sysmalloc_mmap kullanarak alan ayır ve bunu döndür.
sysmalloc ana arena değil
Öncelikle bu yığın için önceki yığını genişletmeye çalışacaktır. Eğer bu mümkün değilse, yeni bir yığın ayırmayı deneyip, onu kullanabilmek için işaretçileri güncellemeye çalışacaktır.
Son olarak, bu işe yaramazsa, sysmalloc_mmap çağırmayı deneyin.
sysmalloc ana alanı önceki hata 1
Eğer önceki dönen MORECORE_FAILURE ise, sysmalloc_mmap_fallback kullanarak bellek tahsis etmeyi tekrar deneyin.