[ruby-dev:46140] [ruby-trunk - Bug #6441] IO.pipe on ENFILE

From: "authorNari (Narihiro Nakamura)" <authorNari@...>
Date: 2012-09-15 04:12:04 UTC
List: ruby-dev #46140
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/

In This Thread