@@ -228,17 +228,20 @@ def do_select
228228 if ( unused_loop_count > 10 && @@query_hash . empty? && @@observers . empty? )
229229 Dnsruby . log . debug ( "Try stop select loop" )
230230
231+ # We leave the @@wakeup_sockets here, but remove everything else
231232 non_persistent_sockets = @@sockets . select { |s | ! @@socket_is_persistent [ s ] }
232233 non_persistent_sockets . each do |socket |
233- socket . close rescue nil
234- @@sockets . delete ( socket )
234+ if socket != @@wakeup_sockets [ 1 ]
235+ socket . close rescue nil
236+ @@sockets . delete ( socket )
237+ end
235238 end
236239
237- Dnsruby . log . debug ( "Deleted #{ non_persistent_sockets . size } non-persistent sockets," +
238- " #{ @@sockets . count } persistent sockets remain." )
240+ Dnsruby . log . debug ( "Deleted #{ non_persistent_sockets . size - 1 } non-persistent sockets," +
241+ " #{ @@sockets . count - 1 } persistent sockets remain." )
239242 @@socket_hash . clear
240243
241- if @@sockets . empty?
244+ if @@sockets . size == 1
242245 Dnsruby . log . debug ( "Stopping select loop" )
243246 return
244247 end
@@ -251,10 +254,11 @@ def do_select
251254 # Removes closed sockets from @@sockets, and returns an array containing 1
252255 # exception for each closed socket contained in @@socket_hash.
253256 def clean_up_closed_sockets
257+ exceptions = [ ]
254258 @@mutex . synchronize do
255259 closed_sockets_in_hash = @@sockets . select ( &:closed? ) . select { |s | @@socket_hash [ s ] }
256260 @@sockets . delete_if { | socket | socket . closed? }
257- closed_sockets_in_hash . each_with_object ( [ ] ) do |socket , exceptions |
261+ closed_sockets_in_hash . each_with_object ( [ ] ) do |socket , exception |
258262 @@socket_hash [ socket ] . each do | client_id |
259263 exceptions << [ SocketEofResolvError . new ( "TCP socket closed before all answers received" ) , socket , client_id ]
260264 end
0 commit comments