観察日記 2010-05-14

間が開きましたがぼくは元気です。今回はスレッドネタとWindowsでのデバッグと、ライブラリデザインの相談風景(ext/etc?)です。RubyではWindows愛にあふれた方の参加を待っています!とかそんな

Thread#priority

いやー、本当にスレッドって素晴らしいですね。

[ruby-core:29586] 3 行で……
{util_mput} [ruby-core:29586] [Bug #1169] Thread#priority still doesn't work http://mla.n-z.jp/?ruby-core=29586
1.9 では Thread#priroity は効力を発揮しない場合がある、という仕様になりました
と偉い人からコメントがあれば納得するのかな
笹田さんにそう書いてもらえばいいのかな
Thread#priority を deprecated 宣言しませんか
Java だと「効くことがあるよ」って表現なんだけどそれだと弱いすかね
それでいいと思う
プラットフォームによっては無視されるよ、って rdoc に書いたのに
そうしたつもりだったんだけど
「バグ」が残っていると主張されるので
実行中のスレッドによってタイマースレッドの間隔を変えるかあ
10msってどこからきてるんだっけ
しらない
タイマースレッドの間隔が気になることがありましたか
いや、Thread#priority を実現するのに、タイマースレッドの間隔を可変にすればいいんじゃないかと
calebさんがそんなことを
10ms は勘
書いてあるような気がする
Linux の time quantum が 10ms じゃないですか

スレッドの優先度とLinux

[[http://tinyurl.com/yyvtxv2:title=[ruby-dev:33124] Thread#priority= does not work]]
どんな話だったか自分でも覚えてない
Thread#priorityはOSがper-thread priorityをサポートしている場合のみサポート(Windows, Mac, Linux, SolarisはOKで他はしらない)でいい気もする
どうせOS毎にスレッドスケジューラの実装・ポリシがバラバラなのにpriorityだけ頑張っても報われない気がする
直感で書いているのでウソかもしれない
Linux はサポートしてるけど、特権がないと設定できないので事実上使えないという結論だった気がします
JDKと同じく下げる方向だけ意味があって、上げる方の設定は無視すれば?
Javaで許されてるのだから、それなりに実績があるのだろう
結局,Java の priority も有名無実な気が
そこは否定しないが・・ > Javaのpriorityも有名無実
> 00:17 kosaki > JDKと同じく下げる方向だけ意味があって、上げる方の設定は無視すれば?
は,意味があるのかと
下げることはできるんだっけ
pthread_setschedparam()では下げる方向も無理
あれはRTしか考えていない
じゃあ何で下げるの?
Linuxはsetpriority(PRIO_PROCESS)に仕様バグがあって、1スレッドにしか効かないという、既知の障害というか仕様があって、JDKはそれをつかっている
わらった
へーー
一応、何回か実体にあわせて、PRIO_THREADに名前変えようと提案されている。数字さえ変えなければABIは崩れないので
stopper は?
setthreadpriority とかじゃなくて PRIO_THREAD なんだ
って、ああ setpriority の引数か
そうそう
PRIO_THREAD に変えればいいじゃないの
ABI は崩れないけどソースレベルの互換性は崩れるか
stopperはJDKという認識。PRIO_PROCESSを名前のとおり動くようにすると、あの人は動かなくなるので
PRIO_PROCESS はそのままにして
glibc方面からは、お願いだから直してくれと泣き疲れているバグでもある
PRIO_PROCESS_TRUELY とか
おー
setpriorityはPOSIXで定義されているのでポータビリティーや、POSIX準拠テスト等々のユーザランドの手間を考えると
PRIO_PROCESS_TRUELY は一部を解決するが一部を解決できない
あれ、オレこの話むかし、ささださんとした気がしてきたよ
覚えてない...
もし、本当に必要なのだったら、cgroupのgroup schedulerを拡張して
プロセス優先度からの相対優先度を指定するインターフェースを新設することも難しくはない
まあ、反対の山を考えるとユースケースが明確じゃないならやりたくないオシゴトではある
現状が POSIX に違反しているということなのではないのかな
しかし、ぼくの manpage には setpriority にバグがあるとか書いてないな
2008-05-29 の GETPRIORITY(2)
うん、いろいろあってmanへの追記は見送った覚えがある
...
しかしそういうことなら、Process.setpriority を使うのよ caleb くん、と返事してあげるとか
面白いな
えー
それはOSを修正したら動かなくなるので・・・
というか、個人的に出来れば修正したいと思っている案件の1つで・・
しかもLinuxだけだよ
まさに bad knowhow

プロセス相対スレッド優先度 for C & Linux

プロセス相対スレッド優先度は需要はあるだろうか?
やってみてるけどうまくできないな
あ、あれ・・・
どきどき
うまくいかないというのが
スレッドの中で Process.setpriority を呼ぶと
メインスレッドで sleep 1 してるのが 1 秒で戻ってこない
違う問題っぽいが自分でテストプロを書く気にはなれない
http://www.atdot.net/sp/readonly/1ch81l
一応動いてはいるのかな
なんで優先度5と10で200倍も違いが出るのだろう
1.25^5≒3 なので3倍程度と予想したのだが
...
おかしい。自分でいっといて、setpriorityのテストプロがつくれない
アホかオレはすごく馬鹿なチョンボしてた
paste>
{ko1_ndk} http://www.atdot.net/sp/readonly/2lj81l_kosaki
{kosaki} % gcc *.c -lpthread; time taskset -c 0 ./a.out
{kosaki} gcc *.c -lpthread; time taskset -c 0 ./a.out
{kosaki} 277610929 92309894 3.007380
{kosaki} taskset -c 0 ./a.out 0.99s user 0.01s system 98% cpu 1.009 total
と、想定通り3倍になったので満足
おお、C だ
tasksetを忘れていて、別々のCPUで動いていたので優先度が無視されていた。あたりまえだwwww
はっ
物理的にCPUが2つあれば、優先度関係なくCPU100%占有できるにきまっとるwww
とゆーわけで、Linuxでは1.25 ^ nice は憶えておくとつかでがあるよ。というお話でした
Ruby で再現出来ないので使い出がない
それはRubyの問題です。うぇっうぇっ

Debugging Ruby

定期的に出る話題、Rubyはポータブルなのでそれ故の悩みが結構ある。

Ruby会議でライブデバックでデバック風景をサブスクリーンに映し続ける とかどうだろう
プライベートがいろいろ垂れ流されそうで嫌だ
IO#reopenが違うのかと思ったがそれも基本的には同じだなあ。
デバックノウハウの拡散が急務
伝家の printf が
Windows使いだとcprintfが割といける
今回みたいにstdoutをredirectしてるときは特に
fprintf(stderr,__FILE__":%d:\n",__LINE__);
初めてcprintf知った!
mswinでは VCExpress /debugexe ruby hoge.rb と printfデバックは半々ぐらい・・・ gdbぐらい使いこなせればVCExpress側に倒れるんだろうか
(c)printfが100%だな。
printfデバック最強伝説
...
昨日の夜のネタだけど、デバッグ風景を見たい人はいる(俺だけど)
一部でスッゲー盛り上がると思うけど。
make -> 実行 -> しばらく停止 -> 1行変更 -> make -> 実行 -> ...
面白くないよ!
nmake した rubyVisual Studio のデバッガでデバッグする方法が知りたい
いくらでも方法はあるな。
マジすか
昨夜もちらっと出てたけど、... /debugexe 実行ファイル名 引数... とか
メモメモ
スクリプトにいったん停止を仕込んどいた上で、あとからIDE起動してプロセスにアタッチとか
SIGSEGVハンドラを殺しといてクラッシュしたら自動的に「あなた、今日はデバッグにする? それともMSに報告する?」とOSに言わせるとか
まあいろいろです。
!
メソッド
うちの環境だと「今日はVS6にする? VS.NET2003にする? VS2005にする?」とか無駄に細かく聞かれる。
どれでもいいよ!
VS2008もあった
よくできてるなぁ
Windows は僕には難しすぎると思っていたけど、教えてもらえば何のことはないな
debugexe とな
単にIDE起動してからexeを食わせることもできたようなきもするんだけど、なんか最近その手順が見当たらない。
devenv にコマンドライン引数を与えられる、という概念を最初から排除していたなぁ
おー
めんどくさいから俺はそっちはあんまりやらんけど。
...
コマンド ラインが無効です。不明なスイッチ: -help
どっから出てきたんだ-help
devenv --help とやってみた
またそんなありえないものを。
でも必要な情報が結果として得られる気も。
ちなみにそこでの正解は devenv /?
そうですね
{ko1_ndk} コマンド ラインからデバッガをアタッチするには、次を使用してください:
{ko1_ndk} VsJITDebugger.exe -p
devenv /debugexe ls とやっても gdb --args 相当じゃなかった
pid調べてそのコマンド実行してIDE起動させるなら
単にIDE起動してプロセスアタッチした方がいいじゃん
と思っている。
嘘,相当か
しかし,知らなかった
もう WindowsRuby も怖くない!
ほう
俺は結構怖いので
むらけんさんに助けてもらおう。
(当社比です

Ruby本体向けシステム依存ライブラリ

背景として、今まで使っていたdlがffiに依存する方向となっているため、外部ライブラリに依存しない何かが欲しいと。

rubygems/config_file.rbが未だにWin32APIを使ってるんだが
ext/tmpdirか何かにまとめたい
(config_file.rb で使われている) SHGetFolderPathってtmpdirなの?
今のtmpdirも含めた何かに
ext/win32でもなんでも
「何か」のほうが重要だったか
LoadError が起きない形になるといいなぁ
すべてのプラットフォームで定義する?
でもtmpdirくらいならまだしも、SHGetFolderPathはかなりWindowsべったりな気がする
全てで定義するか、あるいは require を RUBY_PLATFORM で制約するか
Win32.special_directory(type)というのを考えていたので
type = {local_appdata,common_appdata,windows,system,profile,personal}
LoadError で rubygems という方向な気がするので、LoadError はなるべく出さないほうが。
それはいえるな
一番簡単なのは最初からWin32 moduleを作ってしまう
/.../ =~ RUBY_PLATFORM のかわりに defined? Win32 か。
今からそういうモジュールの追加が認められるかだな
そういうモジュールを返す隠しメソッドとか
とりあえず RUBY_PLATFORM でいいんじゃないの
requireを分けるのはいいけど
機能自体をどこにおくか
SHGetFolderPath が何をするものなのか分かっていない
特定用途向けディレクトリのパス名を返す
RbConfig を連想する
近いけど実行時にシステムに問い合せる
Unix だと相当するものは何かあるかなぁ
pathconf?
ちゃうな
apr-config
autoconfのsysconfdirとかlocalstatedirとか
POSIXにconfstr() というものがあるようだ
あぁそれっぽい
機能が違うような
違うのはそうだろうが、実行時に OS に問い合わせをするという意味で
... etc というのはどうか?
ext/etcに突っ込む?
そういう意味
悪くない気がする
etc も LoadError が起きがちだし
(非 Unix で)
今etcができない環境ってなにがあったっけ
Unix 以外ではできないんじゃないの?
mswinはできるよ
おぉ
win32.cでgetlogin()を定義してるから
デスクトップのパスとかユーザごとのパスを取得ならxdg-user-dirコマンドというのもあるけど。
symbianができないかもしれないな
Unix だとデスクトップはレイヤがずっとあがっちゃうので難しい...
しかしまあetc.soはいい場所だな、うん。
Etc.system_tmpdirとかEtc.special_directoryとか?
その場合Windows以外では何を返すか
けっけっけ、お前らも苦しめぃ
/dev/null
rbconfig.rbをロードしてlocalstatedirでも返すか
system_tmpdir は Dir.tmpdir みたいな感じじゃないの
まんまそれ。
/dev/null/hogeはできないじゃん
system_tmpdirはそのために作ったやつだからいいんだけど
profileとpersonalはHOMEだろうな
そういう悩みが出てくるような奴は、まずプリミティブとして Etc.SHGetFolderPath とか、Etc.confstr とか
g> confstr posix
{ko1_ndk} google web bot: confstr(3C) - http://docs.hp.com/ja/B2355-60104-06/confstr.3C.html (and 81 hits)
Etc::XXX なモジュールに分ける手もあるか
CSIDL_*はそれぞれメソッドでほしい気はするな。機械的に。
でもまあ悩ましい。
Etc::Win32.local_appdata
とかなんだろうか。
rbconfigと合わせたい気もする
Etc.localstatedir
profileとpersonalはDir.homedirでいいのか
じゃないDir.home
とりあえず etc の説明を「OS に問い合わせを行います」などと書き直すのはどうか
たしかに/etcとは限らないな
すでに NIS とかもあるし
docに移そうか
etc.txt ?
と.ja
消すのがさっぱりしている気がするが...
内容が rdoc になっていることを確認した後で
indented-text
というかrdocのrdocはどこだ
rdoc (tool) と rdoc (document) に別の用語が欲しいと思うことはある
RDoc?
最近、あいまいでなければ rdoc (document) は単に document と書くことにしている。
{n0kada} /* The etc module provides access to information from the /etc/passwd and
{n0kada} * /etc/group files on Linux and Unix systems.
これはヒドイ
etc.txt の Available only on UNIX platforms. というのも
それは手元ではもう消した
まぁ誰もまじめに見てないからなぁ
rdoc-mode.elが貧弱すぎて泣ける
いやrdoc-font-lock-keywords使ってねーぞ
使ってるはずだな
RDocでメソッドってどう書くんだろう
RDにしてしまいたい