カテゴリ: プログラミング

kzk さんに教えてもらったネタ

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6336770

Javaは新しいプロセス作るときに、ファイルディスクリプタを全部閉じようとするけども、実装がバグっているのでデッドロックが起きる可能性があるそうだ。

てきとうに見つけたクロスリファレンスサイトから引用すると
http://www.jiema.org/xref/openjdk/jdk7/jdk/src/solaris/native/java/lang/UNIXProcess_md.c#293

fork-and-exec処理の時のディスクリプタ全クローズ処理で、よりにもよってopendir()。ここでmalloc()が発生。あぼーん。

なんで、UNIX系OSってcloseall()システムコールがないんだろうね。困ったもんだ


追記: Linux限定の話でいうと /proc/{pid}/statusのFDSizeフィールドがmax fdを表しているので、3からFDSizeまでcloseしていけば、OKなんじゃないかという気がしてきた。誰か検証プリーズ

追記2: ついでにRubyの実装をちらりと見たけど、NOFILEまでしかクローズしていないから最大ファイルディスクリプタが動的なシステムだとリークしているっぽい。今度、akrさんあたりに真相を聞いてみよう。

追記3: glibc malloc はpthread_atfork()を使って、fork前後でmutexを取っているので、forkとexecの間でmalloc()呼んでも平気。これはtcmallocのような外部mallocを使った場合のみに問題になりそう

追記4: いくつかのページで sysconf(_SC_OPEN_MAX)を薦めているところがあったけど、これ、Linuxではうまくいかない。getrlimit()で現在のlimitを取っているだけなので、ファイルを開いた後で最大値を下げられたら、ちゃんとハンドリングできない。まあ、普通の人はそんな事しない。という指摘は正しいと思います

追記5: forkとexecの間はasync signal safeしかダメって話は以前にも書いたので、そっちも見てね
http://mkosaki.blog46.fc2.com/blog-entry-886.html

追記6: kzkさんに指摘されて気づいたけど、これが記念すべき1000エントリ目かー。妙に感慨深いな

追記7: kzkさんの関連エントリも参照のこと。
http://kzk9.net/blog/2009/09/deadlock_on_process_builder.html

http://sourceforge.net/projects/stapgames/

とりあえず、OSが最新でないと全然実用にならないことが分かった。
うちはCentOSで5.0からyumで5.2相当までアップしているような環境なんだけど
うちの環境のstapは

・println()関数がない。ので動かないスクリプト多数
・%演算子の扱いがおかしい get_cycles() % 7 が常に0を返す。なんだそりゃ!
どうも桁数が大きいときの処理がバグっているらしく、 (get_cycles() & 0xff) % 7 とかすると
ちゃんと動く。
テトリスとで四角ブロックしか落ちてこないので何事かと思ったよ

という感じ。
SystemTapが環境依存が激しいのはこれに限ったことではないのだけれど、うーん、厳しいなぁー

Matz を説得する方法のスライドがすばらしい件

http://d.hatena.ne.jp/tokuhirom/20080629/1214717545


からリンクされている、akrさんの資料がすばらしい。
なんで直接リンクせずにこっちに貼るかというと、文中の

「貴様の問題などどうでもいい」


がいい味だしてるから

まあ、のっけから泣き言なんである。
最近Vistaなパソコンをかったので、IE拡張系のブラウザが手になじまなくなり、
Firefoxに本格的に移行をもくろんでいる。

んで、ブックマークもGoogle bookmarkに移行して、全マシンで共有やー。
と思っていたのだが、FirefoxのGoogle bookmark用プラグイン(GMark)がいまいち
ごきげんじゃない。

どうダメかってーと、下図のように、Googleさんが勝手に作るラベル「最近最も使用した」が「最近」と「最も使用した」の2つに分割されてしまうのだ。
ああ、キモチワルイ。

6b8a8356.jpg




そのうち、時間を取って追求する・・・・・かも

http://shinh.skr.jp/m/?date=20071124

_ これ考えたヤツキチガイだよなぁ…
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/7_Lexical_Conventions.html#section-7.9

return 1


return
1
の意味が違うんだよね。



いやまったく

javascriptの自動セミコロン挿入則はどうみても、ユーザの要求をはるかに超えたオーバーキルな仕様で、だれもうれしくないにも関わらず、パーサ作るの大変だわ、規格のエンハンスの足を引っ張りまくるわでとんでもないんだよね。

いったい誰が規格にねじこんだんだか。
・・・いや規格エンハンスの苦労については、最近の事情は知らないけど

↑このページのトップヘ