週刊mosh - MinGW32ビルド復活 / Scatter/Gather I/O

あまり進捗なし。

MinGW32ビルド復活

非同期I/O導入の余波でMinGW32でビルド出来なくなっていたのを復活させました。単に定義をコピペしただけで、定義はMinGW64(を拝借したlibuv)から。
libuvのWindows対応はMSの人が書いてるので(過去にあったMSがNode.jsの開発をサポート - http://www.publickey1.jp/blog/11/nodejswindows_azure.html - の記事がそれ)、それなりに参考になる。

Scatter/Gather I/O

いま非同期I/Oは一般的な非同期I/O APIにあわせてリファクタリングをしているところ。従来はRead/Writeリクエストを発行するのは完全にシステム任せで、ユーザプログラムは流れてくるバッファをひたすら処理するスタイルでした。それを、他の常識的なライブラリにあわせて、Read/Writeリクエストに単にcallbackをつけるだけに。
この変更と一緒に、そろそろScatter/Gather I/Oを統合しようと思ったんですが、なんとWindowsにはreadv/writevに相当するうまい操作が無い(Socketには有るがHANDLE一般でない - ReadFileScatterのようなAPIはページ単位のI/Oしか無い)等地味な違いに泣く。
あと難しいのは、GCとの連携を真面目にやらないといけない点。今まではシステムに渡すバッファは参照をシステム側で保持できたけれど、リクエストの発行をユーザ任せにすることでこのへんもまじめに考察する必要が出てきてしまった。。
従来の仕組みでは、システムはin-flightなリクエストを有限個に制限することができた。リクエスト発行をユーザ任せにする場合は、システム側が保持しなければならないIn-flightリクエストの数が無制限になるので、リクエストをリストで管理するなど工夫する必要が出てくる。(Win32の場合はOVERLAPPED構造体をGC見えの領域に確保して関連情報をそこに入れている。つまり、"リクエスト権"にあたるオブジェクトを都度ユーザ見えに確保させている。)