mruby の GCを読んでみた メモ書き_001
mruby の 勉強のために mruby の ソースコードを読んでみることにしてみました。
下記には、mruby の関数を読んだ際のメモ書きが記載されています。
下記のソースコードは2012年10月31日現在のものになります。
ブログに書かれている内容とブログを確認された方のコードに差異があるかもしれませんがご了承ください。
またメモ書きとして残しておりますが、私自身の推測が間違っている可能性もありますのでご了承ください。
gc.c
void*
mrb_realloc(mrb_state *mrb, void *p, size_t len)
{
void *p2;
p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
if (!p2 && len > 0 && mrb->heaps) {
mrb_garbage_collect(mrb);
p2 = (mrb->allocf)(mrb, p, len, mrb->ud);
}
return p2;
}
mrbから関数ポインタで allocf を呼び出し、ポインタのp2に格納している。
→なぜ、関数ポインタを使っているのか?
p2 が 0 か false かつ len が 0 より大きい、かつヒープが 0以外であるならば、
ガベージコレクションを行い、allocfを呼び出す。
そして p2 を返す。
→ allocf と mrb_garbage_collect が何を行っているか、しっかりと確認を行う。
void*
mrb_malloc(mrb_state *mrb, size_t len)
{
return mrb_realloc(mrb, 0, len);
}
mrb_realloc を呼び出しているだけ、 mrb_realloc の第二引数の void *p に 0 を渡しているので、この挙動を確認する。
→ allocf 側で確認
void*
mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)
{
void *p = NULL;
size_t size;
if (nelem <= SIZE_MAX / len) {
size = nelem * len;
p = mrb_realloc(mrb, 0, size);
if (p && size > 0)
memset(p, 0, size);
}
return p;
}
mrb_calloc の 第二引数の nelem が SIZE_MAX / len 以下の場合に
→ SIZE_MAX の定数値を確認
size に nelem * len を代入
p に mrb_realloc を代入
p が 0以外かtrue かつ size が 0 より 大きければ memset を呼び出す。
pの結果を返す。
void*
mrb_free(mrb_state *mrb, void *p)
{
return (mrb->allocf)(mrb, p, 0, mrb->ud);
}
allocf(mrb, p, 0, mrb->ud) で メモリを解放できるのだろう?
→free なので名前としては上の動きをしていると予想。