著作一覧 |
1.8.7-p299にしたらvrswinのmakeが失敗した。
1.9対応の定義が有効になって1.8では未定義の定数(RUBY_UBF_IO 多分、unblock functionの頭語で、グローバルロックを解除可能な待ち状態に入る場合に指定する)を参照したからだ。
とりあえずその定数を&& !defindしてしのいだ。
が、HAVE_NATIVETHREADでは1.8と1.9が区別できないので、RUBY_UBF_IOを見たほうが意図的にも良さそうに思う。
diff -u -p swin.c~ swin.c *** swin.c~ Sat Feb 07 23:52:50 2009 --- swin.c Sat Jun 26 22:35:02 2010 *************** swin_call_threadblocking(DWORD chk_th, i *** 1000,1006 **** } va_end(args); ! #ifdef HAVE_NATIVETHREAD if(chk_th!=GetCurrentThreadId()){ // another thread from current r = (DWORD)rb_thread_blocking_region((VALUE(*)())Swin_WinAPI_Call, &calldata,RUBY_UBF_IO,0); --- 1000,1006 ---- } va_end(args); ! #if defined(RUBY_UBF_IO) if(chk_th!=GetCurrentThreadId()){ // another thread from current r = (DWORD)rb_thread_blocking_region((VALUE(*)())Swin_WinAPI_Call, &calldata,RUBY_UBF_IO,0);
追記:今まで気づかなかったのはASRに含めていたSwinが1.9対応前のバージョンだったからでした。
追記2:Ruby-1.8のHAVE_NATIVETHREADの役割は、GCやシグナル、tkutilなどで、クロススレッド呼び出しの判定をする必要性からのようで、Ruby-1.9のように積極的なジャイアントロック外しのためではありません。
ジェズイットを見習え |