特に問題意識を持っているわけではないけど、がんばって作ってみた。半月以上かかった。
mruby-io-copy_streamとは、mrubyでCRubyでいうIO.copy_stream
が使えるようになるライブラリです。
IO.copy_stream
は、ようはcat
コマンドみたいなやつ。
ちょっとread
して、ちょっとwrite
するので、巨大なIOでも一定のメモリで扱うことができる。
一度 mruby-ioにPRを送ってみたこともあるんだけど、以下の理由から止めた。
- Rubyで書くなら普通にread/writeループでいいよね感があった。
- このメソッドに求められる要件としては、やはり速度だと思う。(IO操作のほうが重いとは思うけど)
- ということは、pread(2)やsendfile(2)を使いたい。
- ということは、autoconf等を使いたい。
- Cで書くと500行と大きめ。
- ここまでくると、PRを送られてもmergeしにくいだろうと予想。
- mrubyとしては、機能が細かく別れてプラガブルになっていたほうが、アプリケーションに無駄な機能を乗せずに済む(と思う)。
というわけで、ほぼほぼCRubyの移植として作った。 特にsendfile(2)を使えるのが面白いところだと思う。
また、特定のライブラリに依存しないように作った。
IOライブラリは最低限read
とwrite
メソッドがあればいい。
fileno
メソッドがあれば、fdを使ってシステムコールを呼ぶようにした。
これにより、mruby-ioはもちろん、mruby-tiny-ioでも、mruby-stringioでも、とにかく引数にオブジェクトを使えば、組み合わせることができるように工夫してみた。
よければ使ってみてください。