From: nobu.nokada@... Date: 2002-04-18T19:43:27+09:00 Subject: Re: resolv.rb Bug Hi, At Thu, 18 Apr 2002 15:12:08 +0900, Tanaka Akira wrote: > > I guess unused Sockets should be closed. > > Since a DNS object uses a socket for all requests by multiplexing, the > patch causes the problem from second request as: (snip) > It is a bug that DNS class have no `close' method, of course. Oops, it's certainly necessary. Additional patch to [ruby-talk:38537]. --- resolv.rb~ Thu Apr 18 19:40:14 2002 +++ resolv.rb Thu Apr 18 19:41:29 2002 @@ -348,4 +348,14 @@ class Resolv DNSThreadGroup = ThreadGroup.new + def self.open(*args) + dns = new(*args) + return dns unless block_given? + begin + yield dns + ensure + dns.close + end + end + def initialize(config="/etc/resolv.conf") @mutex = Mutex.new @@ -370,4 +380,14 @@ class Resolv end + def close + @mutex.synchronize { + if @initialized + @requester.close if @requester + @requester = nil + @initialized = false + end + } + end + def getaddress(name) each_address(name) {|address| return address} @@ -448,5 +468,5 @@ class Resolv } ensure - @requester.delete(q).each {|s| s.close} + @requester.delete(q) end end @@ -501,4 +521,10 @@ class Resolv end + def close + senders = @senders.value + @senders.clear + senders.each {|s| s.close} + end + class Sender def initialize(msg, data, sock, queue) @@ -515,5 +541,6 @@ class Resolv def close - @sock.close + @sock.close if @sock + @sock = nil end end -- Nobu Nakada