From: matz@... (Yukihiro Matsumoto) Date: 1999-06-18T16:21:45+09:00 Subject: [ruby-dev:7134] Re: Ruby 1.3.4-990611 まつもと ゆきひろです In message "[ruby-dev:7129] Re: Ruby 1.3.4-990611" on 99/06/17, Yukihiro Matsumoto writes: |あ、私の改造が悪影響してますね。戻すようにします。 |ぼーっとしてるのでちょっと時間かかるかも。 |quick hack ではダメでした。 以下のパッチで大丈夫のようです。試してみる人はいますか? --- ext/tcltklib/tcltklib.c 1999/06/09 09:21:36 1.1.1.2.2.5 +++ ext/tcltklib/tcltklib.c 1999/06/18 07:20:53 @@ -45,6 +45,4 @@ /*---- module TclTkLib ----*/ -static VALUE main_thread; - struct invoke_queue { int argc; @@ -56,33 +54,50 @@ struct invoke_queue *next; }; - + static struct invoke_queue *iqueue; +static VALUE main_thread; -/* execute Tk_MainLoop */ -static VALUE -lib_mainloop(self) - VALUE self; +/* Tk_ThreadTimer */ +static Tcl_TimerToken timer_token; + +/* timer callback */ +static void +_timer_for_tcl(clientData) + ClientData clientData; { struct invoke_queue *q, *tmp; VALUE thread; - DUMP1("start Tk_Mainloop"); - while (Tk_GetNumMainWindows() > 0) { - Tcl_DoOneEvent(TCL_DONT_WAIT); - CHECK_INTS; - q = iqueue; - while (q) { - tmp = q; - q = q->next; - if (!tmp->done) { - tmp->done = 1; - tmp->result = ip_invoke_real(tmp->argc, tmp->argv, tmp->obj); - thread = tmp->thread; - tmp = tmp->next; - rb_thread_run(thread); - } + Tk_DeleteTimerHandler(timer_token); + timer_token = Tk_CreateTimerHandler(100, _timer_for_tcl, + (ClientData)0); + + CHECK_INTS; + q = iqueue; + while (q) { + tmp = q; + q = q->next; + if (!tmp->done) { + tmp->done = 1; + tmp->result = ip_invoke_real(tmp->argc, tmp->argv, tmp->obj); + thread = tmp->thread; + tmp = tmp->next; + rb_thread_run(thread); } } + rb_thread_schedule(); +} + +/* execute Tk_MainLoop */ +static VALUE +lib_mainloop(self) + VALUE self; +{ + timer_token = Tk_CreateTimerHandler(100, _timer_for_tcl, + (ClientData)0); + DUMP1("start Tk_Mainloop"); + Tk_MainLoop(); DUMP1("stop Tk_Mainloop"); + Tk_DeleteTimerHandler(timer_token); return Qnil;