PSMの複数mmapの実装
現状
現時点での実装はmmapが呼ばれたらftruncate(size)するだけなので1つの領域を確保することしかできない。この場合とても簡単で
- プログラマ側が確保サイズの同意をとれば、ライブラリは何も考えなくていい。
- 管理領域もまったく共有する必要はない。
目標
ところが複数のメモリ領域で管理を行うには次のような問題が生じる。
さしあたっての実装
というわけでとりあえずこんな感じで。
- 親だけがpsm_mmapを呼ぶ。
- 子供はフックされた時点でshmファイルに対してmmapする。
- アドレスはだから共有される。ただし使われてるかのチェックとかシラネ。
- それって再現性の悪いバグとか引き起こしそうだなぁ…
で、必要な管理領域を次のように用意する。
static struct shm_state{ int fd; char str[64]; struct shm_allocation * memtop; } shm_main_state; typedef struct shm_allocation_{ void * addr; size_t size; shm_allocation * next; } shm_allocation; psm_mem_init(){ // 初期化 shm_main_state.memtop = psm_mmap(sizeof(shm_allocation)); shm_main_state.memtop->addr = NULL; }
あれ、これだとmemtopがプロセス間で共有されてないからダメなんじゃ…memtopを先頭にしてずるずるとつなげるべきか?混乱してきた。