Project

General

Profile

Feature #4243 ยป 0001-DRb-should-not-forefully-close-connections-on-DRb-st.patch

zimbatm (zimba tm), 01/06/2011 11:12 PM

View differences:

lib/drb/drb.rb
# Stop this server.
def stop_service
DRb.remove_server(self)
if Thread.current['DRb'] && Thread.current['DRb']['server'] == self
Thread.current['DRb']['stop_service'] = true
else
@thread.kill.join
@thread.kill
# Check for foreign sub-threads
f = @grp.list.select{|t| t['DRb'].nil?}
$stderr.puts "DRb unknown threads: #{f.inspect}" if f.any?
# synchronous stop (without current and foreign threads)
while (@grp.list - [Thread.current] - f).size > 0
Thread.pass
end
end
......
end
private
def kill_sub_thread
Thread.new do
grp = ThreadGroup.new
grp.add(Thread.current)
list = @grp.list
while list.size > 0
list.each do |th|
th.kill if th.alive?
end
list = @grp.list
end
end
end
def run
@stop_service = false
Thread.start do
begin
while true
......
end
ensure
@protocol.close if @protocol
kill_sub_thread
@stop_service = true
end
end
end
......
end
client.send_reply(succ, result) rescue nil
ensure
client.close unless succ
if Thread.current['DRb']['stop_service']
Thread.new { stop_service }
if !succ or @stop_service
client.close
break
end
break unless succ
end
end
end
    (1-1/1)