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

mruby-at_exit gem リリース

mrubyでat_exitができるmruby-at_exitを作った。

github.com

at_exitrubyスクリプトが何らかの理由で終了するタイミングで発動するコールバックを登録できるメソッド。

mrubyではmrb_state_atexitというCの関数でmrubyが終わるときをフックする関数を登録することができる。 mrb_state_atexitではmrb_state structのatexit_stackというメンバーに関数ポインタを配列で積んでいる(変わるかもしれないけど……)。

この仕様は結構前からあってドキュメントにもちゃんと書いてある。

mruby/mrbconf.md at master · mruby/mruby · GitHub

仕組みは2014年から出来てる。

Add API `mrb_atexit()`. by take-cheeze · Pull Request #2211 · mruby/mruby · GitHub

動的にメモリを確保する方法と静的にメモリを確保する方法まである。

と、ここまでくれば誰だってKernel.at_exitを実装したくなるが、 このPRはすでに出ており、しかもrejectされている。

Implement `Kernel#at_exit` and `Kernel.at_exit`. by take-cheeze · Pull Request #2363 · mruby/mruby · GitHub

mrubyではgem毎にfialize的に呼べる仕組みがあり、それで十分なので、 Kernel.at_exitの実装に説得力があまりなかったのだろう。

それなら……と言いたいところだが、実は作ってから検索してすでにrejectされていることを知った。。。

作ってしまったものの置き場として、とりあえずgemとして作っておくことにしたのが、 今回のmruby-at_exitというわけです。ふるってご利用ください。