週刊 Mona - さようなら monapi_cmemoryinfo

Mona の File API など様々な箇所で使われてい共有メモリ APIる monapi_cmemoryinfo を全面的に廃止にした。
理由は

  • 共有メモリの unmap とオブジェクト自身の解放の両方をプログラマが面倒を見なければならずバグの温床になっていた。
  • File Server と一部密結合になっていて(MSG_DISPOSE_HANDLEを自動的に send する)、メッセージキューを圧迫していた

から。


もちろんそういう構造になっていたのには理由があって

  • unmap とオブジェクト自身の解放が別々に行われるケースがまれにあった
  • monapi_cmemoryinfo は C++ API を使えない C API 側に歩み寄る必要があった
  • File Server とのプロトコルがきちんと定まらず、資源解放のポリシーが決まっていなかった

など。


というわけで monapi_cmemoryinfo を置き換えるものとして SharedMemory という C++ のクラスを作り置き換えた。C から File API を使う事は出来なくなった。
そもそも C から直接 Mona の File API を使いたいケースは(いまのところ)まれなので、どうしても使いたい人はアダプタを書くという事で。


典型的なファイル読み込み/書き込みは以下のような感じで。

// 読み込み
intptr_t id = monapi_file_open(path, 0);
scoped_ptr<SharedMemory> ret(monapi_file_read(id, 256));
monapi_file_close(id);

// 書き込み
SharedMemory shm(1);
shm.map();
shm.data()[0] = 1
monapi_file_write(id, shm, 1);
monapi_file_close(id);