[ruby-dev:24208] Re: ruby/tk で、Tk.after の後もコールバックが解放されない

From: Hidetoshi NAGAI <nagai@...>
Date: 2004-09-03 02:31:32 UTC
List: ruby-dev #24208
永井@知能.九工大です.

From: H.Yamamoto <ocean@m2.ccsnet.ne.jp>
Subject: [ruby-dev:24207] ruby/tk で、Tk.after の後もコールバックが解放されない
Date: Fri, 3 Sep 2004 10:23:40 +0900
Message-ID: <20040903102338.006E04A0.ocean@m2.ccsnet.ne.jp>
> tcl/tk を参考に下のようなコードを書いたのですが、Proc の数と 
> TkCore::INTERP.tk_cmd_tbl のサイズが際限なく大きくなることに気づきました。

確かにそうですね.ご指摘,ありがとうございます.
ソースを見ると,手がけようとしてそのまま忘れていたらしき形跡が
ありますね.(^_^;
添付のパッチで OK ではないかと思います.

===================================================================
RCS file: /var/cvs/src/ruby/ext/tk/lib/tk.rb,v
retrieving revision 1.102.2.16
diff -u -r1.102.2.16 tk.rb
--- ext/tk/lib/tk.rb    19 Aug 2004 07:41:53 -0000      1.102.2.16
+++ ext/tk/lib/tk.rb    3 Sep 2004 02:26:48 -0000
@@ -1191,8 +1191,14 @@
   end
 
   def after(ms, cmd=Proc.new)
+    crit_bup = Thread.critical
+    Thread.critical = true
+
     myid = _curr_cmd_id
-    cmdid = install_cmd(cmd)
+    cmdid = install_cmd(proc{ret = cmd.call;uninstall_cmd(myid); ret})
+
+    Thread.critical = crit_bup
+
     tk_call_without_enc("after",ms,cmdid)  # return id
 #    return
 #    if false #defined? Thread
@@ -1209,8 +1215,14 @@
   end
 
   def after_idle(cmd=Proc.new)
+    crit_bup = Thread.critical
+    Thread.critical = true
+
     myid = _curr_cmd_id
-    cmdid = install_cmd(cmd)
+    cmdid = install_cmd(proc{ret = cmd.call;uninstall_cmd(myid); ret})
+
+    Thread.critical = crit_bup
+
     tk_call_without_enc('after','idle',cmdid)
   end
 

-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai@ai.kyutech.ac.jp

In This Thread