From 3cb57fb1c3c2b25bd94660c099f52489a1564354 Mon Sep 17 00:00:00 2001 From: nagai Date: Thu, 28 Feb 2008 17:27:41 +0000 Subject: * ext/tk/lib/tk.rb: forgot to update RELEASE_DATE * ext/tk/lib/tk.rb, ext/tk/lib/tk/text.rb, ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: remove adhoc check of Ruby's features (use existence of some classes instead of comparing with RUBY_VERSION) * ext/tk/lib/tk/root.rb, ext/tk/lib/tk/autoload.rb: make TkRoot (Tk::Root) unswitchable * ext/tk/lib/multi-tk.rb: partial bug fix (still not work!!) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15634 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/tk/lib/multi-tk.rb | 34 +++++++++++++++++----------- ext/tk/lib/tk.rb | 22 +++++++++++------- ext/tk/lib/tk/autoload.rb | 4 +++- ext/tk/lib/tk/root.rb | 3 +-- ext/tk/lib/tk/text.rb | 4 ++-- ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb | 2 +- 6 files changed, 42 insertions(+), 27 deletions(-) (limited to 'ext/tk') diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb index 7b25c22063..ed936bf1a5 100644 --- a/ext/tk/lib/multi-tk.rb +++ b/ext/tk/lib/multi-tk.rb @@ -695,6 +695,8 @@ class MultiTkIp ###################################### + WITH_RUBY_VM = Object.const_defined?(:VM) && ::VM.class == Class + if self.const_defined? :DEFAULT_MASTER_NAME name = DEFAULT_MASTER_NAME.to_s else @@ -723,9 +725,9 @@ class MultiTkIp fail ArgumentError, "expecting a Hash object for the 2nd argument" end - if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + unless WITH_RUBY_VM @interp = TclTkIp.new(name, _keys2opts(keys)) - else + else ### Ruby 1.9 !!!!!!!!!!! @interp_thread = Thread.new{ Thread.current[:interp] = interp = TclTkIp.new(name, _keys2opts(keys)) #sleep @@ -876,22 +878,26 @@ class MultiTkIp Thread.new{ current = Thread.current loop { - mtx, ret, table, script = @init_ip_env_queue.deq - begin + mtx, cond, ret, table, script = @init_ip_env_queue.deq + begin ret[0] = table.each{|tg, ip| ip._init_ip_env(script) } rescue Exception => e ret[0] = e ensure - mtx.unlock + mtx.synchronize{ cond.signal } end + mtx = cond = ret = table = script = nil # clear variables for GC } } def self.__init_ip_env__(table, script) ret = [] - mtx = Mutex.new.lock - @init_ip_env_queue.enq([mtx, ret, table, script]) - # mtx.lock + mtx = (Thread.current[:MultiTk_ip_Mutex] ||= Mutex.new) + cond = (Thread.current[:MultiTk_ip_CondVar] ||= ConditionVariable.new) + mtx.synchronize{ + @init_ip_env_queue.enq([mtx, cond, ret, table, script]) + cond.wait(mtx) + } if ret[0].kind_of?(Exception) raise ret[0] else @@ -1229,9 +1235,9 @@ class MultiTkIp if safeip == nil # create master-ip - if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + unless WITH_RUBY_VM @interp = TclTkIp.new(name, _keys2opts(tk_opts)) - else + else ### Ruby 1.9 !!!!!!!!!!! @interp_thread = Thread.new{ Thread.current[:interp] = interp = TclTkIp.new(name, _keys2opts(tk_opts)) #sleep @@ -1257,7 +1263,8 @@ class MultiTkIp @safe_base = true @interp, @ip_name = master.__create_safe_slave_obj(safe_opts, name, tk_opts) - @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + # @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + @interp_thread = nil unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!! if safe safe = master.safe_level if safe < master.safe_level @safe_level = [safe] @@ -1266,7 +1273,8 @@ class MultiTkIp end else @interp, @ip_name = master.__create_trusted_slave_obj(name, tk_opts) - @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + # @interp_thread = nil if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + @interp_thread = nil unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!! if safe safe = master.safe_level if safe < master.safe_level @safe_level = [safe] @@ -2377,7 +2385,7 @@ class MultiTkIp def mainloop(check_root = true, restart_on_dead = true) raise SecurityError, "no permission to manipulate" unless self.manipulable? - if RUBY_VERSION < '1.9.0' ### !!!!!!!!!!! + unless WITH_RUBY_VM ### Ruby 1.9 !!!!!!!!!!! return @interp_thread.value if @interp_thread end diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index 007c5bd436..d80271a326 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -1076,11 +1076,16 @@ module TkComm end end + module TkCore include TkComm extend TkComm + WITH_RUBY_VM = Object.const_defined?(:VM) && ::VM.class == Class + WITH_ENCODING = Object.const_defined?(:Encoding) && ::Encoding.class == Class + unless self.const_defined? :RUN_EVENTLOOP_ON_MAIN_THREAD + ### Ruby 1.9 !!!!!!!!!!!!!!!!!!!!!!!!!! RUN_EVENTLOOP_ON_MAIN_THREAD = false end @@ -1101,7 +1106,7 @@ module TkCore opts = '' end - if RUBY_VERSION < '1.9.0' || RUN_EVENTLOOP_ON_MAIN_THREAD ### !!!!!!!!!!! + if !WITH_RUBY_VM || RUN_EVENTLOOP_ON_MAIN_THREAD ### Ruby 1.9 !!!!!!!!!!! INTERP = TclTkIp.new(name, opts) else require 'thread' @@ -1589,8 +1594,8 @@ module TkCore end def mainloop(check_root = true) - if RUBY_VERSION < '1.9.0' || - TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD ### !!!!!!!!!!! + if !TkCore::WITH_RUBY_VM || TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD + ### Ruby 1.9 !!!!!!!!!!! TclTkLib.mainloop(check_root) else begin @@ -1618,8 +1623,8 @@ module TkCore # nil : there is no mainloop # false : mainloop is running on the other thread # ( At then, it is dangerous to call Tk interpreter directly. ) - if RUBY_VERSION < '1.9.0' || - TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD ### !!!!!!!!!!! + if !TkCore::WITH_RUBY_VM || TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD + ### Ruby 1.9 !!!!!!!!!!! TclTkLib.mainloop_thread? else Thread.current == INTERP_THREAD @@ -1859,6 +1864,7 @@ module TkCore end end + module Tk include TkCore extend Tk @@ -1974,7 +1980,7 @@ module Tk end def root - TkRoot.new + Tk::Root.new end def Tk.load_tclscript(file, enc=nil) @@ -2465,7 +2471,7 @@ if (/^(8\.[1-9]|9\.|[1-9][0-9])/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK) end # estimate encoding - if RUBY_VERSION < '1.9.0' + unless TkCore::WITH_ENCODING ### Ruby 1.9 !!!!!!!!!!!! case $KCODE when /^e/i # EUC Tk.encoding = 'euc-jp' @@ -4742,7 +4748,7 @@ TkWidget = TkWindow #Tk.freeze module Tk - RELEASE_DATE = '2007-12-21'.freeze + RELEASE_DATE = '2008-02-29'.freeze autoload :AUTO_PATH, 'tk/variable' autoload :TCL_PACKAGE_PATH, 'tk/variable' diff --git a/ext/tk/lib/tk/autoload.rb b/ext/tk/lib/tk/autoload.rb index bc8274c2e2..f7037b4033 100644 --- a/ext/tk/lib/tk/autoload.rb +++ b/ext/tk/lib/tk/autoload.rb @@ -192,6 +192,8 @@ autoload :TkPackage, 'tk/package' autoload :TkPalette, 'tk/palette' +autoload :TkRoot, 'tk/root' + autoload :TkScrollbox, 'tk/scrollbox' autoload :TkSelection, 'tk/selection' @@ -294,7 +296,7 @@ module Tk :TkRadioButton => 'tk/radiobutton', :TkRadiobutton => 'tk/radiobutton', - :TkRoot => 'tk/root', + # :TkRoot => 'tk/root', :TkScale => 'tk/scale', diff --git a/ext/tk/lib/tk/root.rb b/ext/tk/lib/tk/root.rb index 02e546d86e..4d83282448 100644 --- a/ext/tk/lib/tk/root.rb +++ b/ext/tk/lib/tk/root.rb @@ -86,5 +86,4 @@ class Tk::Root