咳といいます。

> 本質的には削除が正しいと思うんですが、ひとつ疑問があります。
>
> 実は手元にかなり確実に Errno::EADDRINUSE が起きる環境があります。
> http://www.rubyist.net/~akr/ab/netbsd-2.0/ruby-trunk/
>
> しかし、その環境では
>
> % ruby -rsocket -e '100.times { TCPServer.new(8473).close }'
>
> というのは問題なく終了するのです。
> もちろん、8473 が他で使われていない場合ですが。
>
> つまり、閉じてすぐ作るぶんには問題ないわけで、本当は閉じていないのが問
> 題なんではないかと疑っています。
>
> 調べてみると、
>
> class TestDRbReusePort < TestDRbAry
>   def setup
>     sleep 1.2
>     @ext = DRbService.ext_service('ut_port.rb')
>     @there = @ext.front
>   end
> end
>
> というところの sleep 1.2 を消すと、手元の Debian でも確実に EADDRINUSE
> になります。
>
> そこで確認したいのですが、ここはソケットを閉じた後に次のテストを行う仕
> 掛けになっているんでしょうか?
>
> sleep のところをみると、なっていない気がするのですが。

ソケットを閉じるのは子プロセスの方なのですが、「死んでよ」とRMIでお願いして
死んでもらってます。子プロセスは「死んでよ」の返事を書いてから死ななくては
ならないので、返事を書く寸前にスレッド生成して1秒後に自殺をはじめます。

それで、子プロセスが終了しきる前に同じポート番号で新しいプロセスを起動して
しまうとこのような現象になります。

ですからsleepを止めると確実に起こせるのだと思います。