まつもと ゆきひろです

In message "Re: [ruby-dev:39410] #2009 File.open memory leak"
    on Wed, 30 Sep 2009 23:54:20 +0900, とみたまさひろ <tommy / tmtm.org> writes:

|# 英語はダメなので ruby-dev で…
|
|http://redmine.ruby-lang.org/issues/show/2009 の File.open memory leak
|ですが、原因は r21435 の gc.c の次の変更だと思います。

なるほど。

|fptr の free() がなくなったためにメモリリークしてます。
|
|次のようなすれば直りました。

1.9のようにrb_io_fptr_finalize()の最後でfptrをxfree()すれば良
いように思います。

こんなパッチを書いてみました。make testくらいはちゃんと動く
ようです。採用するかどうかは1.8のメンテナーに任せます。

--- a/io.c
+++ b/io.c
@@ -2348,10 +2348,10 @@ rb_io_fptr_finalize(fptr)
     if (fptr->path) {
 	free(fptr->path);
     }
-    if (!fptr->f && !fptr->f2) return;
-    if (fileno(fptr->f) < 3) return;
-
-    rb_io_fptr_cleanup(fptr, Qtrue);
+    if ((fptr->f && fileno(fptr->f) > 2) || fptr->f2) {
+	rb_io_fptr_cleanup(fptr, Qtrue);
+    }
+    xfree(fptr);
 }
 
 VALUE