mrubyでat_exit
ができるmruby-at_exitを作った。
at_exit
はrubyスクリプトが何らかの理由で終了するタイミングで発動するコールバックを登録できるメソッド。
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されている。
mrubyではgem毎にfialize的に呼べる仕組みがあり、それで十分なので、
Kernel.at_exit
の実装に説得力があまりなかったのだろう。
それなら……と言いたいところだが、実は作ってから検索してすでにrejectされていることを知った。。。
作ってしまったものの置き場として、とりあえずgemとして作っておくことにしたのが、 今回のmruby-at_exitというわけです。ふるってご利用ください。