Project

General

Profile

Bug #5524

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

Added by naruse (Yui NARUSE) about 8 years ago. Updated about 8 years ago.

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

Associated revisions

Revision 3d855def
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33677 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 33677
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

Revision 33677
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

Revision 33677
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

Revision 33677
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

Revision 33677
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

Revision 33677
Added by naruse (Yui NARUSE) about 8 years ago

FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

History

Updated by kosaki (Motohiro KOSAKI) about 8 years ago

  • ruby -v changed from ruby 2.0.0dev (2011-10-31 trunk 33582) [x86_64-freebsd9.0] to -

小崎です

ええと、なるせさんの論旨がいまいちまだ把握できてない気がするのですが・・・・

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

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

Macとかでも刺さらないです。

% cat poll.c
#include
#include
#include
#include
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 が返り、

POLLVALが返ると思いますが、poll つかうのはLinuxのときだけなんで
今回の件は無関係ではないでしょうか。

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

SUSはEBADFを要求しているのでFreeBSDのバグではないでしょうか?

http://pubs.opengroup.org/onlinepubs/7908799/xsh/select.html

FreeBSDのときだけテストスキップじゃだめ?

Updated by kosaki (Motohiro KOSAKI) about 8 years ago

なるせさんのテストプロは 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
#include

+#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; }

Updated by kosaki (Motohiro KOSAKI) about 8 years ago

  • Status changed from Assigned to Feedback
  • Assignee changed from kosaki (Motohiro KOSAKI) to naruse (Yui NARUSE)

Updated by naruse (Yui NARUSE) about 8 years ago

Motohiro KOSAKI wrote:

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

おぉ、なるほど、確かにそれだと FreeBSD だけ動きません。
FreeBSD 側のバグとして報告しました、当面 FreeBSD だけスキップするようにします。
http://www.freebsd.org/cgi/query-pr.cgi?pr=162379

#5

Updated by naruse (Yui NARUSE) about 8 years ago

  • Status changed from Feedback to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r33677.
Yui, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


FreeBSD 8.2 sticks this [ruby-dev:44726] [Bug #5524]
http://redmine.ruby-lang.org/issues/5524

Also available in: Atom PDF