From bbffb26a9d93aaf252cdf218595bd5000ad3d985 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Tue, 8 Jun 2010 07:50:07 +0000 Subject: merge revision(s) 27688: * lib/net/imap.rb: backported exception handling from trunk. [ruby-core:29745] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@28218 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/net/imap.rb | 35 ++++++++++++++++++++++++++++------- version.h | 2 +- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index f537887fea..60be46242e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Jun 8 16:51:48 2010 Shugo Maeda + + * lib/net/imap.rb: backported exception handling from trunk. + [ruby-core:29745] + Tue Jun 8 16:42:48 2010 Nobuyoshi Nakada * ext/bigdecimal/bigdecimal.c (VpAlloc): ensure buf does not get diff --git a/lib/net/imap.rb b/lib/net/imap.rb index 662d152207..97b960a0c2 100644 --- a/lib/net/imap.rb +++ b/lib/net/imap.rb @@ -913,6 +913,7 @@ module Net @continuation_request = nil @logout_command_tag = nil @debug_output_bol = true + @exception = nil @greeting = get_response if @greeting.name == "BYE" @@ -928,14 +929,24 @@ module Net def receive_responses while true + synchronize do + @exception = nil + end begin resp = get_response - rescue Exception - @sock.close - @client_thread.raise($!) + rescue Exception => e + synchronize do + @sock.close unless @sock.closed? + @exception = e + end + break + end + unless resp + synchronize do + @exception = EOFError.new("end of file reached") + end break end - break unless resp begin synchronize do case resp @@ -953,7 +964,9 @@ module Net end if resp.name == "BYE" && @logout_command_tag.nil? @sock.close - raise ByeResponseError, resp.raw_data + @exception = ByeResponseError.new(resp.raw_data) + @response_arrival.broadcast + return end when ContinuationRequest @continuation_request = resp @@ -963,14 +976,21 @@ module Net handler.call(resp) end end - rescue Exception - @client_thread.raise($!) + rescue Exception => e + @exception = e + synchronize do + @response_arrival.broadcast + end end end + synchronize do + @response_arrival.broadcast + end end def get_tagged_response(tag) until @tagged_responses.key?(tag) + raise @exception if @exception @response_arrival.wait end return pick_up_tagged_response(tag) @@ -1103,6 +1123,7 @@ module Net while @continuation_request.nil? && !@tagged_responses.key?(Thread.current[:net_imap_tag]) @response_arrival.wait + raise @exception if @exception end if @continuation_request.nil? pick_up_tagged_response(Thread.current[:net_imap_tag]) diff --git a/version.h b/version.h index 3de10a07d8..de7c6e2825 100644 --- a/version.h +++ b/version.h @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2010-06-08" #define RUBY_VERSION_CODE 187 #define RUBY_RELEASE_CODE 20100608 -#define RUBY_PATCHLEVEL 282 +#define RUBY_PATCHLEVEL 283 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 -- cgit v1.2.3