PSMの複数mmapの実装

現状

現時点での実装はmmapが呼ばれたらftruncate(size)するだけなので1つの領域を確保することしかできない。この場合とても簡単で

  • プログラマ側が確保サイズの同意をとれば、ライブラリは何も考えなくていい。
  • 管理領域もまったく共有する必要はない。

目標

ところが複数のメモリ領域で管理を行うには次のような問題が生じる。

  • ファイルディスクリプタの「どこからどこまで」が操作対象のmmap領域かを知らないといけない。
    • しかも解放する時には割り振ったアドレスしか渡されないので、これをプロセス間で共通化する必要がある。(結局!)
    • やっぱりそうなってくるとみんなが好き勝手にmmapするんじゃなくて一人呼んだらみんな呼ぶ仕組みがあるべき。
      • でもやっぱりそれは面倒だから親がmmap/mallocしておけばcloneするときにうまく処理する程度でいいか。
      • あれ、そうしたら新たに起動した方のプロセスでそのアドレスが有効な保証ってあるの?
      • 多分スタックのサイズ次第。mainループの方が普通は大きいと思うけど…
  • なので管理領域を共有する必要がある。

さしあたっての実装

というわけでとりあえずこんな感じで。

  • 親だけが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を先頭にしてずるずるとつなげるべきか?混乱してきた。