読者です 読者をやめる 読者になる 読者になる

RubyPico開発日記2 - SimpleHttpServerを2回起動するとserver.rb:50 bind (RuntimeError)

こんな感じ。

f:id:tuto0621:20160731154021p:plain

おそらく一度ソケットで確保したアドレスがプログラム終了後にcloseされずに確保しっぱなしになっているようだ。RubyPico自体を終了させると解放される。

CRubyはプロセスとして起動する場合が多いのでWebサーバーを止めたいときはそのプロセスを停止してしまえばよい、OSが安全に後始末してくれる。ところがiOSのアプリは子プロセスが作れない(forkできない)ので、RubyPicoは別スレッドでmrubyを動かしているのでプログラム終了時にこちらでなんとかしないといけない。プログラム終了後にはmrb_close()が呼ばれるのでそのタイミングで未解放のソケットがあればcloseする、例えばGC時に後始末関数を呼ぶような仕組みがいいのだろうか。

RubyにはFinalizerがあったがgrepした感じmrubyにはない。なのでRubyPicoのImageクラスのようにcloseされていなかったら解放時にcloseを呼ぶようなライブラリを用意するのがいいのかしら?

もしくはiOS用に用意されたCocoaHTTPServerというのがあるのでこいつをRubyPico用にバインドするのもいいかもしれない。でも、低レイヤのソケットライブラリが用意されているとどうやってHTTPが動いているのかを勉強するのにいいんだよなぁ、実際mruby-simplehttpserverはたった180行のRubyスクリプト書かれていて、私自身Webサーバがどうやって動いているのか理解するのにとても役立った。runとか関数の内容をRubyPico上でオーバーライドすれば簡単に挙動を変えて確かめられるしね。(ここがRubyのすごいところだと思う)