mruby-io-copy_streamつくった

github.com

特に問題意識を持っているわけではないけど、がんばって作ってみた。半月以上かかった。

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ライブラリは最低限readwriteメソッドがあればいい。

filenoメソッドがあれば、fdを使ってシステムコールを呼ぶようにした。

これにより、mruby-ioはもちろん、mruby-tiny-ioでも、mruby-stringioでも、とにかく引数にオブジェクトを使えば、組み合わせることができるように工夫してみた。

よければ使ってみてください。