Project

General

Profile

Actions

Bug #5524

closed

IO.wait_for_single_fd(closed fd) sticks on other than Linux

Added by naruse (Yui NARUSE) over 12 years ago. Updated over 12 years ago.

Status:
Closed
Target version:
-
ruby -v:
-
Backport:
[ruby-dev:44726]

Description

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依存なんじゃ無いかという疑惑を持っているんですがどうでしょう。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0