From: "authorNari (Narihiro Nakamura)" Date: 2012-09-15T13:12:04+09:00 Subject: [ruby-dev:46140] [ruby-trunk - Bug #6441] IO.pipe on ENFILE Issue #6441 has been updated by authorNari (Narihiro Nakamura). すみません、この問題をよく理解できてないので何点か質問させてください。 GC側をどのように直せばいいかいまいちわかっておらず、悩んでいます…。 naruse (Yui NARUSE) wrote: > 今の Ruby は open(2) などで、errno=ENFILE が発生した場合、 > すなわち fd を使いきっている場合には、rb_gc() を呼び、IO オブジェクトを GC して、 > fd が解放されないか試み、それでもダメだったら諦めるとしています。 > > しかし、IO.pipe の場合はこれに失敗することがあります。 失敗する、というのは「fd の解放を試み、ダメなら諦める」ということが IO.pipeでできないことがある、ということでしょうか? > これは、lazy sweep が上記の目的のため T_FILE の場合は直ちに sweep することにしている所、 > pipe の場合はその例外にあたらないからです。 その例外というのはpipeで作られるfdがT_FILEのオブジェクトにわりあてられ てないとかそういう話なのでしょうか。 また再現コードなどがあればいただけると嬉しいです。 ---------------------------------------- Bug #6441: IO.pipe on ENFILE https://bugs.ruby-lang.org/issues/6441#change-29318 Author: naruse (Yui NARUSE) Status: Assigned Priority: Normal Assignee: authorNari (Narihiro Nakamura) Category: Target version: ruby -v: ruby 2.0.0dev (2012-05-16 trunk 35659) [x86_64-netbsd6.99.5] 今の Ruby は open(2) などで、errno=ENFILE が発生した場合、 すなわち fd を使いきっている場合には、rb_gc() を呼び、IO オブジェクトを GC して、 fd が解放されないか試み、それでもダメだったら諦めるとしています。 しかし、IO.pipe の場合はこれに失敗することがあります。 これは、lazy sweep が上記の目的のため T_FILE の場合は直ちに sweep することにしている所、 pipe の場合はその例外にあたらないからです。 -- http://bugs.ruby-lang.org/