Rubyで書いたDDNSアップデータがエラーを吐くようになった。
原因はniftyのSSLハンドシェークプロトコルが変更されたせいらしいのだが、検証して修正してる暇がない。
で、時々つながらなくなることがありますので、お許しを。>各位
artonさんがswin/vrubyを同梱してくださっている。おいらはちょっと遊べる状態じゃないのがつらいなぁ。
artonさんとにゃすさんからメールを頂いた。要旨は表題の関数がRuby1.9.1 rc1で動かないのでartonさんがパッチを書いてくださったというもの。
去年の7月から放っておいたのがついに発覚。
で、artonさんのとこでは更にSwitchで引数の数を調べなくても良い大変巧妙な方法を書いてくださっている。やっぱすごいな。
で、メールの返信にはインラインアセンブリ使うとx64では大変とか書いたが、そもそもx64ではWin32APIの呼び出し規約は__cdeclになっているので、引数の個数について悩む必要がない。従って32bit版に限って、考えればよいことだったのだ。
ということで、私はアセンブリ言語はほとんど分かりませんから、お二方、よろしくお願いします。x64の方はそのうちやるかもしれません。
結局ResetEventしたりタイムアウト設定したりしなくても、CreateEvent()のbManualResetフラグをfalseにするだけで良いみたい。
インストーラはW2Kに対応していないが、WDKさえ動けば、W2K用のバイナリは簡単に作成、インストールできる。XPかVistaにWDKをインストールして、それのWindows2000のビルド環境から、淺川さんとこのHow to build Dokan libraryの手順に従ってビルド、それをW2Kにコピー、インストールするだけだった。
単にResetEventを追加しただけだと、Windowsが勝手にスケジューリングしてしまい、長時間待たされることがある。WaitForSingleObjectのタイムアウト設定が必要みたい。
WaitForSingleObject(g_DispatchEvent, 100);
0.1秒くらいだとCPU負荷もほぼ0%で具合が良いみたい。
きのうWaitForSingleObject(g_DispatchMutex, INFINITE);をコメントアウトしてしまったが、これはいけない。複数スレッドが同時にアクセスしたら、やばいことになる。で、単に
ResetEvent(g_DispatchEvent);
の追加だけで良いだろう。
わかった。CPU負荷の件はDR_DispatchAndWaitでSetEvent(g_DispatchEvent)したのをDR_Dispatch()でRestEventしていなかったせいだった。
$ diff -u dokan_lib.c.org dokan_lib.c
--- dokan_lib.c.org Tue Sep 16 00:49:13 2008
+++ dokan_lib.c Tue Sep 16 00:39:37 2008
@@ -1787,7 +1787,7 @@
{
while(TRUE) {
WaitForSingleObject(g_DispatchEvent, INFINITE);
- WaitForSingleObject(g_DispatchMutex, INFINITE);
+// WaitForSingleObject(g_DispatchMutex, INFINITE);
fprintf(stderr, "eventloop ");
while(!IsListEmpty(&g_EventQueue)) {
PLIST_ENTRY listEntry = RemoveHeadList(&g_EventQueue);
@@ -1815,6 +1815,7 @@
}
}
}
+ ResetEvent(g_DispatchEvent);
ReleaseMutex(g_DispatchMutex);
}
}
多分これで良いだろう。しばらく様子見て淺川さんにレポートしよう。
swin対応は、ネイティブスレッドを使っているため、イベントループを根本的にいじらなくてはいけないので、そう簡単にはいきそうもない。でも結構用途がありそうなのでやってみたいなぁ。
_ nyasu3w [しかもsshも繋がりません]
_ 雪見酒 [ありゃ、ほんとだ。]