From: nobu.nokada@... Date: 2002-04-18T14:56:29+09:00 Subject: Re: resolv.rb Bug Hi, At Thu, 18 Apr 2002 13:55:29 +0900, Tanaka Akira wrote: > It's because each DNS object have a socket file descriptor and a > thread. The file descriptor is required for communication to DNS > server. The thread is required for async communication. > Unfortunately the object is not GCed because it is refered from the > thread. I guess unused Sockets should be closed. Index: resolv.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/resolv.rb,v retrieving revision 1.10 diff -u -2 -p -r1.10 resolv.rb --- resolv.rb 2002/03/22 05:15:44 1.10 +++ resolv.rb 2002/04/18 05:54:39 @@ -445,5 +445,5 @@ class Resolv } ensure - @requester.delete(q) + @requester.delete(q).each {|s| s.close} end end @@ -486,17 +486,21 @@ class Resolv def delete(arg) + del = [] case arg when Sender - @senders.delete_if {|k, s| s == arg } + @senders.delete_if {|k, s| s == arg or next; del << s; true } when Queue - @senders.delete_if {|k, s| s.queue == arg } + @senders.delete_if {|k, s| s.queue == arg or next; del << s; true } else raise ArgumentError.new("neither Sender or Queue: #{arg}") end + del end class Sender - def initialize(data, queue) + def initialize(msg, data, sock, queue) + @msg = msg @data = data + @sock = sock @queue = queue end @@ -506,4 +510,8 @@ class Resolv @queue.push([msg, @data]) end + + def close + @sock.close + end end @@ -547,7 +555,5 @@ class Resolv class Sender < Requester::Sender def initialize(msg, data, sock, host, port, queue) - super(data, queue) - @msg = msg - @sock = sock + super(msg, data, sock, queue) @host = host @port = port @@ -599,10 +605,4 @@ class Resolv class Sender < Requester::Sender - def initialize(msg, data, sock, queue) - super(data, queue) - @msg = msg - @sock = sock - end - def send @sock.send(@msg, 0) @@ -652,10 +652,4 @@ class Resolv class Sender < Requester::Sender - def initialize(msg, data, sock, queue) - super(data, queue) - @msg = msg - @sock = sock - end - def send @sock.print(@msg) -- Nobu Nakada