[前][次][番号順一覧][スレッド一覧]

ruby-changes:2418

From: ko1@a...
Date: 13 Nov 2007 22:04:44 +0900
Subject: [ruby-changes:2418] seki - Ruby:r13909 (ruby_1_8): remove Thread.exclusive

seki	2007-11-13 22:04:30 +0900 (Tue, 13 Nov 2007)

  New Revision: 13909

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/lib/drb/drb.rb
    branches/ruby_1_8/lib/drb/extservm.rb

  Log:
    remove Thread.exclusive

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/drb/extservm.rb?r1=13909&r2=13908
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=13909&r2=13908
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/lib/drb/drb.rb?r1=13909&r2=13908

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 13908)
+++ ruby_1_8/ChangeLog	(revision 13909)
@@ -1,3 +1,9 @@
+Tue Nov 13 22:02:23 2007  Masatoshi SEKI  <m_seki@m...>
+
+	* lib/drb/drb.rb: remove Thread.exclusive.
+
+	* lib/drb/extservm.rb: ditto.
+
 Tue Nov 13 16:33:07 2007  Nobuyoshi Nakada  <nobu@r...>
 
 	* numeric.c (flodivmod): work around for inifinity.
Index: ruby_1_8/lib/drb/extservm.rb
===================================================================
--- ruby_1_8/lib/drb/extservm.rb	(revision 13908)
+++ ruby_1_8/lib/drb/extservm.rb	(revision 13909)
@@ -5,10 +5,12 @@
 
 require 'drb/drb'
 require 'thread'
+require 'monitor'
 
 module DRb
   class ExtServManager
     include DRbUndumped
+    include MonitorMixin
 
     @@command = {}
 
@@ -21,6 +23,8 @@
     end
       
     def initialize
+      super()
+      @cond = new_cond
       @servers = {}
       @waiting = []
       @queue = Queue.new
@@ -30,34 +34,26 @@
     attr_accessor :uri
 
     def service(name)
-      while true
-	server = nil
-	Thread.exclusive do
-	  server = @servers[name] if @servers[name]
-	end
-	return server if server && server.alive?
-	invoke_service(name)
+      synchronize do
+        while true
+          server = @servers[name]
+          return server if server && server.alive?
+          invoke_service(name)
+          @cond.wait
+        end
       end
     end
 
     def regist(name, ro)
-      ary = nil
-      Thread.exclusive do
-	@servers[name] = ro
-	ary = @waiting
-	@waiting = []
+      synchronize do
+        @servers[name] = ro
+        @cond.signal
       end
-      ary.each do |th|
-	begin
-	  th.run
-	rescue ThreadError
-	end
-      end
       self
     end
     
     def unregist(name)
-      Thread.exclusive do
+      synchronize do
 	@servers.delete(name)
       end
     end
@@ -73,16 +69,12 @@
     end
 
     def invoke_service(name)
-      Thread.exclusive do
-        @waiting.push Thread.current
-        @queue.push name
-        Thread.stop
-      end
+      @queue.push(name)
     end
 
     def invoke_service_command(name, command)
       raise "invalid command. name: #{name}" unless command
-      Thread.exclusive do
+      synchronize do
 	return if @servers.include?(name)
 	@servers[name] = false
       end
Index: ruby_1_8/lib/drb/drb.rb
===================================================================
--- ruby_1_8/lib/drb/drb.rb	(revision 13908)
+++ ruby_1_8/lib/drb/drb.rb	(revision 13909)
@@ -578,7 +578,7 @@
       end
       raise(DRbConnError, 'connection closed') if str.nil?
       raise(DRbConnError, 'premature marshal format(can\'t read)') if str.size < sz
-      Thread.exclusive do
+      DRb.mutex.synchronize do
         begin
           save = Thread.current[:drb_untaint]
           Thread.current[:drb_untaint] = []
@@ -1751,10 +1751,16 @@
   end
   module_function :install_acl
 
+  @mutex = Mutex.new
+  def mutex
+    @mutex
+  end
+  module_function :mutex
+
   @server = {}
   def regist_server(server)
     @server[server.uri] = server
-    Thread.exclusive do
+    mutex.synchronize do
       @primary_server = server unless @primary_server
     end
   end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧]