本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/ca7c25dab3c279ba4e2b |
はじめに
本記事の趣旨は「01 概要」に記しているが、
要は 13年前(=2008年) に K&R をマネて実装した「自作メモリアロケータ」の振り返りである.
本項では次の (7) のうち、「メモリ獲得」処理について記す.
(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする
詳細
(7) について
(7) 以後、ユーザはアクセッサを介してメモリプールからメモリ獲得・解放をする
main.c
下記🛑の i は、獲得したいメモリサイズである ... ?ん、メモリプールの 4096 を超えているぞ...
int
main()
{
略
#if 1
instance = Mman_new_inst(&req);
for(j = 0; j < 500; j++)
{
for(i = 0; i < 1000; i++)
{
buf[i] = instance->alloc(0,i); // 🛑メモリ獲得処理. 第1引数「0」は自身の id である
}
for(i = 0; i < 1000; i++) /* alloc よりも小さい値にするとメモリリークが確認出来る */
{
instance->free(0, buf[i]);
}
}
memman.c
上記 🛑 の free の実体が下記 Mman_alloc である.
書籍「K&R」の free をマネた部分である.
void
Mman_free(int id, void * ptr)
{
mman_t * p = mman_get_rsrc(id);
Mmc_free(id, ptr, p->functor_free);
}
memman_core.c
以下は、上記 🤹 の Mma_free に進むと、下記 mmc_free()
に繋がる.
mmc_free()
の 第3引数が free() へのポインタである.
排他制御が必要だが、実装