[#7102] Ruby 1.3.4-990611 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.4-990611 is out, check out:

20 messages 1999/06/11

[#7223] Ruby 1.3.4-990625 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.4-990625 is out, check out:

14 messages 1999/06/25
[#7224] -Wl,-rpath on Linux (Re: Ruby 1.3.4-990625) — Ryo HAYASAKA <hayasaka@...21.u-aizu.ac.jp> 1999/06/25

早坂@会津大学です。

[ruby-dev:7134] Re: Ruby 1.3.4-990611

From: matz@... (Yukihiro Matsumoto)
Date: 1999-06-18 07:21:45 UTC
List: ruby-dev #7134
まつもと ゆきひろです

In message "[ruby-dev:7129] Re: Ruby 1.3.4-990611"
    on 99/06/17, Yukihiro Matsumoto <matz@netlab.co.jp> 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;

In This Thread