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

ruby-changes:16022

From: yugui <ko1@a...>
Date: Sun, 23 May 2010 21:18:39 +0900 (JST)
Subject: [ruby-changes:16022] Ruby:r27971 (ruby_1_9_2): merges r27690 and r27903 from trunk into ruby_1_9_2.

yugui	2010-05-23 21:18:20 +0900 (Sun, 23 May 2010)

  New Revision: 27971

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27971

  Log:
    merges r27690 and r27903 from trunk into ruby_1_9_2.
    --
    * lib/net/imap.rb (disconnect): terminates @receiver_thread even if
      @sock.shutdown raises an exception.  [ruby-dev:34881]
    --
    * lib/net/imap.rb (disconnect): closes the socket of a Net::IMAP
      object only when it is not closed.  [ruby-dev:41350]

  Modified files:
    branches/ruby_1_9_2/ChangeLog
    branches/ruby_1_9_2/lib/net/imap.rb
    branches/ruby_1_9_2/test/net/imap/test_imap.rb

Index: ruby_1_9_2/ChangeLog
===================================================================
--- ruby_1_9_2/ChangeLog	(revision 27970)
+++ ruby_1_9_2/ChangeLog	(revision 27971)
@@ -1,3 +1,13 @@
+Wed May 19 23:19:30 2010  Shugo Maeda  <shugo@r...>
+
+	* lib/net/imap.rb (disconnect): closes the socket of a Net::IMAP
+	  object only when it is not closed.  [ruby-dev:41350]
+
+Sun May  9 08:24:24 2010  Shugo Maeda  <shugo@r...>
+
+	* lib/net/imap.rb (disconnect): terminates @receiver_thread even if
+	  @sock.shutdown raises an exception.  [ruby-dev:34881]
+
 Sun May 16 22:17:35 2010  Yusuke Endoh  <mame@t...>
 
 	* eval.c (setup_exception): let SystemStackError#backtrace return an
Index: ruby_1_9_2/lib/net/imap.rb
===================================================================
--- ruby_1_9_2/lib/net/imap.rb	(revision 27970)
+++ ruby_1_9_2/lib/net/imap.rb	(revision 27971)
@@ -307,9 +307,16 @@
         end
       rescue Errno::ENOTCONN
         # ignore `Errno::ENOTCONN: Socket is not connected' on some platforms.
+      rescue Exception => e
+        @receiver_thread.raise(e)
       end
       @receiver_thread.join
-      @sock.close
+      synchronize do
+        unless @sock.closed?
+          @sock.close 
+        end
+      end
+      raise e if e
     end
 
     # Returns true if disconnected from the server.
@@ -1012,7 +1019,10 @@
 
       @client_thread = Thread.current
       @receiver_thread = Thread.start {
-        receive_responses
+        begin
+          receive_responses
+        rescue Exception
+        end
       }
     end
 
Index: ruby_1_9_2/test/net/imap/test_imap.rb
===================================================================
--- ruby_1_9_2/test/net/imap/test_imap.rb	(revision 27970)
+++ ruby_1_9_2/test/net/imap/test_imap.rb	(revision 27971)
@@ -315,6 +315,43 @@
     end
   end
 
+  def test_exception_during_shutdown
+    server = TCPServer.new(0)
+    port = server.addr[1]
+    Thread.start do
+      begin
+        sock = server.accept
+        begin
+          sock.print("* OK test server\r\n")
+          sock.gets
+          sock.print("* BYE terminating connection\r\n")
+          sock.print("RUBY0001 OK LOGOUT completed\r\n")
+        ensure
+          sock.close
+        end
+      rescue
+      end
+    end
+    begin
+      begin
+        imap = Net::IMAP.new("localhost", :port => port)
+        imap.instance_eval do
+          def @sock.shutdown(*args)
+            super
+            raise "error"
+          end
+        end
+        imap.logout
+      ensure
+        assert_raise(RuntimeError) do
+          imap.disconnect
+        end
+      end
+    ensure
+      server.close
+    end
+  end
+
   private
 
   def imaps_test

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

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