観察日記 2010-03-26

miniruby とは

minirubyが壊れているときにencodingのところでこけるのはよくない
実はいままで聞けなかったのだが
minirubyってなんぞ
Rubyをビルドする際にはRubyスクリプトを走らせる部分がいくつかありまして、
例えばextconf.rbとかエンコーディングテーブルの作成とか
しかし、この時点ではrubyはできあがってないわけです。
こういうときのために、とりあえず作るのがminiruby
ビルトインエンコーディングしか入ってなかったり、拡張ライブラリを読めなかったりする
ああ、つまり vm.c とか thread.c あたりにバグを仕込むとエンコーディングテーブルの生成が失敗するという形で露見するわけね

なお、ライブラリを static に持っているので、ファイルサイズは全く mini ではありません。

Mac OS X と非 Unicode

OS X で File.open("\xA4\xA2".force_encoding("euc-jp"), "w") すると
ファイル名が %A4%A2 になるっぽい
1.9.1ではUTF-8に変換してたんだけど、
trunkではそんなことするやつが悪いという方針に変えてる
と、いうのも、その動きはHFS+だけで、Mac OS XからUFSやNFSに書く場合にはエスケープないのだ
ZFSMac OS XのデフォルトFSになった日が来たら、カオスになる

Redmine のチケットフィルタリング

redmine ってフィルタリングしたチケット一覧を URL としてコピペできないもの?
フィルタに名前つければいける
保存しないとダメ?
たぶん

st.c pool allocater

matzが [ruby-core:28859] st.c: pool allocator for tables and entries のレビューワーを募集中のようだ
st.cのst_table_entryはともかく、st_tableを8k個もキャッシュする意味あるかぁ?
8kはもうベンチ対策な気がしますねぇ
このパッチのメリットは
1) OSのmallocと違ってロックをとらないので速い
2) 毎回gcを試みないので速い
3) (OSのmallocが腐っている場合のみ) LIFOなリストを使うことによりcache hotnessを意識したアロケーションパターンになるので速い
だと思っていて
この時期に結構、大胆なパッチだ。
st.c専用対策をいれるよりも、dlmallocあたりを丸ごと抱き込んでしまって、全オブジェクトそっちを使う方がスジが良い気がする
拡張ライブラリがマルチスレッドでRubyのオブジェクト作ったりするとどうなんだっけ
GVLがあるから関係ないのでは
現状st.cはスレッドセーフなので、拡張ライブラリが好き勝手に使っている可能性があるわけですが、
それをいきなりスレッドアンセーフにすると踏んじゃうライブラリがあるんじゃないかなと少し
拡張ライブラリに処理が移るとGVLは来てるわけだが、拡張ライブラリは何でもできるので、
自分でpthreadたたいて、複数の pthread から st_table をいじるとおかしくなりそう
st_tableが公開APIかどうかには議論があるけれど
ああ、なっとく
それなりに速度向上があるならthread unsafeなst_tableを別に抱えるとか、
「st_tableは公開APIではないから、使うやつが悪い(キリッ」と言って捨てるという技がある
じゃあとりあえず否定的なコメント*1 つけとくか

dlmalloc については

その他

そういえば Radium Software Development の過去ログは非常にエキサイティングな記事が大量にあるので、未読な方はぜひ読むといいと思います。%ruby 観察日記なんてドマニアックなネタで喜ぶ人ならばきっと幸せなひとときを送れることでしょう (未読だったら一時くらいじゃ読みきれんが)。

MVM もあるよ

mvmにマージするには面倒だな
あぁ、mvmがあるのか
st.cなんかにstatic変数を増やさないでほしい
mvmは完全に忘れてた すいません
いやもう完全に空気だから

malloc の戻り値

vm_xmalloc()みてて気づいたのだけど、mallocがNULLを返さないLinuxだと、いつgc呼ばれてるの?
NULL返さない?
うん
overcommitがあるから
*BSDもovercommitするってsodaさんがいっていた
LinuxBSDはbrk, mmapは仮想空間を増やすシステムコールであって、物理メモリに余裕があるかはケアしない
仮想空間が空いてないときはエラーになるけどそんな状況みたことねー
brkって何だろう? 名前の由来とか。
break
メモリ確保にbreakとつける命名センスには一言いいたいが
オブジェクトがいっぱいになったときにもGCは走る
オブジェクトが一杯の定義は?
rb_newobj_from_heap()
if ((ruby_gc_stress && !ruby_disable_gc_stress) || !freelist) {
そうか、オブジェクトは何個かいっきにとるから伸びるタイミングで再チェックか
twitterでmatzにゴミコメントを大量に投下してきた