マルチスレッドなFFIの実装

マルチスレッドでOCamlからCを呼ぶ場合、または CからOCamlにコールバックする場合、

  • C側からOCaml のデータを触るとき
  • C側からOCaml のコードを呼ぶとき

は、その部分を

  (OCamlを触らないコード) 
  leave_blocking_section();
  (OCamlを触るコード)
  enter_blocking_section();
  (OCamlを触らないコード) 

のように配置する*1
2本目のスレッドがOCaml側にやってきたときは、leave_blocking_sectionでコンテキストスイッチまで待たされることになる。


注意camlspotterさんの記事 等も参考にすること。
実際にFFIでCのコードに入った直後は他のOCamlスレッドがブロックされているので、enter_blocking_section() して、 fopen などブロックする関数を呼び、そのあと leave_blocking_section() することになる。

*1:一見逆のように見えるがOCaml側からみてブロックする部分とはOCamlのヒープを絶対触らない部分なのでこれで正しい