[#44904] [ruby-trunk - Bug #5688][Open] Solaris10 で spawn を繰り返すとメモリリークする — okkez _ <redmine@...>

14 messages 2011/11/29

[ruby-dev:44840] [ruby-trunk - Bug #5524] IO.wait_for_single_fd(closed fd) sticks on other than Linux

From: Motohiro KOSAKI <kosaki.motohiro@...>
Date: 2011-11-08 16:40:10 UTC
List: ruby-dev #44840
Issue #5524 has been updated by Motohiro KOSAKI.


なるせさんのテストプロは selectのmaxfds引数が間違っているので、動かないのは期待通りではないでしょうか。以下の修正をあててFreeBSDで
動かしてもらえませんか

~/projects/test/select_ebadf% diff -u select_badf.c.orig select_badf.c
diff -u select_badf.c.orig select_badf.c
--- select_badf.c.orig	2011-11-08 11:33:44.000000000 -0500
+++ select_badf.c	2011-11-08 11:38:26.000000000 -0500
@@ -3,6 +3,8 @@
 #include <sys/select.h>
 #include <unistd.h>
 
+#define max(x,y) ((x > y) ? x : y)
+
 int
 main(void) {
     int pipes[2];
@@ -18,7 +20,8 @@
     //struct timeval *timeout = NULL;
     //FD_SET(r, &readfds);
     FD_SET(w, &writefds);
-    res = select(1, &readfds, &writefds, &exceptfds, NULL);
+    res = select(max(r,w)+1, &readfds, &writefds, &exceptfds, NULL);
+
     return 0;
 }
 
----------------------------------------
Bug #5524: IO.wait_for_single_fd(closed fd) sticks on other than Linux
http://redmine.ruby-lang.org/issues/5524

Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Motohiro KOSAKI
Category: 
Target version: 
ruby -v: -


r31428 で、test_wait_for_invalid_fd ってテストを追加しており、
IO.wait_for_single_fd(close 済みの fd) が EBADF になることを確認しているのですが、
これ単体で動かすと FreeBSD で戻ってきません。

思うに、このテストって本来ポータブルに刺さる物なんじゃないでしょうか。
test-allだと何かの弾みで通ってしまうだけで。

%  cat poll.c
#include <stdio.h>
#include <stdlib.h>
#include <poll.h>
#include <errno.h>
int
main(void) {
    int pipes[2];
    int res = pipe(pipes);
    if (res != 0) abort();
    int r = pipes[0];
    int w = pipes[1];
    res = close(w);
    if (res != 0) abort();

    struct pollfd fds;
    fds.fd = w;
    fds.events = POLLOUT;
    errno = 0;
    res = poll(&fds, 1, 1000);
    fprintf(stderr, "%d %d %d\n", res, errno, fds.revents);
    return 0;
}

というプログラムではポータブルに POLLVAL が返り、


#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
int
main(void) {
    int pipes[2];
    int res = pipe(pipes);
    if (res != 0) abort();
    int r = pipes[0];
    int w = pipes[1];
    res = close(w);
    if (res != 0) abort();
    fd_set readfds; FD_ZERO(&readfds);
    fd_set writefds; FD_ZERO(&writefds);
    fd_set exceptfds; FD_ZERO(&exceptfds);
    //struct timeval *timeout = NULL;
    //FD_SET(r, &readfds);
    FD_SET(w, &writefds);
    res = select(1, &readfds, &writefds, &exceptfds, NULL);
    return 0;
}

はポータブルにブロックされるあたり、このテストってLinux依存なんじゃ無いかという疑惑を持っているんですがどうでしょう。


-- 
http://redmine.ruby-lang.org

In This Thread