2016-01-14 (木)
コミケ打ち上げ飲み会.浜町のいつもの場所.
最近のやつ. LARGE_BIG_EXTを追加したので,巨大なBignumも送受信できるようになった.
* [Erlang] initial_call
Erlangシェルの i(). でプロセス一覧を表示したとき,initial_callのモジュールを見れば何のプロセスか推測できますが,この文字列どこから取ってきているのか知らなかったので調べた.
最初はprocess_infoで取ってるだけかと思ってたのですが, process_info(Pid, initial_call)
で取ると,proc_libばかりになってしまう.gen_serverとかもここから起動されるので当たり前なのだけど.
proc_libのソースを見ると,プロセス辞書の$initial_callというのを書き込んでいて,それが怪しい.これは,proc_lib:translate_initial_call/1 で取れます.ただし,プロセス辞書に何もなければ proc_lib:init_p/5 を返すので,適当なプロセス渡すと嘘が返ってくる.最初に,process_infoで調べて,proc_lib のプロセスだったら translate_initial_call を呼べということらしい.
Erlangシェルの i(). の実装もまさしくそうなっていた.Erlangシェルの関数何処で定義されてるのか分からずTwitterに書いてたら教えてもらえた.
- https://github.com/erlang/otp/blob/maint/lib/stdlib/src/c.erl#L393
- https://twitter.com/itawasa/status/687450400627101696
c.erl とか i とかgrepで見つけにくい...