diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-04 10:02:06 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-04 10:02:06 +0000 |
commit | c06da4735da0e2285c1e3e52202b7090b3f43b1b (patch) | |
tree | 9620b63cc51f9262752534746d42bd2d55af4f32 /thread.c | |
parent | 2a989121db8f80aceeadb5d403af79d4b30e1bb8 (diff) |
* thread.c (rb_wait_for_single_fd): Fix wrong return value.
* test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb
(TestWaitForSingleFD#test_wait_for_closed_pipe): test for it.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31429 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 34 |
1 files changed, 25 insertions, 9 deletions
@@ -2714,6 +2714,13 @@ rb_thread_fd_select(int max, rb_fdset_t * read, rb_fdset_t * write, rb_fdset_t * #endif #ifdef USE_POLL + + +/* The same with linux kernel. TODO: make platform independent definition. */ +#define POLLIN_SET (POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP | POLLERR) +#define POLLOUT_SET (POLLWRBAND | POLLWRNORM | POLLOUT | POLLERR) +#define POLLEX_SET (POLLPRI) + /* * returns a mask of events */ @@ -2736,15 +2743,6 @@ retry: if (result < 0) lerrno = errno; }, ubf_select, GET_THREAD()); - if (result > 0) { - if (fds.revents & POLLNVAL) { - errno = EBADF; - return -1; - } - result = (int)(fds.revents & fds.events); - return result == 0 ? events : result; - } - if (result < 0) { errno = lerrno; switch (errno) { @@ -2759,8 +2757,26 @@ retry: } goto retry; } + return -1; } + if (fds.revents & POLLNVAL) { + errno = EBADF; + return -1; + } + + /* + * POLLIN, POLLOUT have a different meanings from select(2)'s read/write bit. + * Therefore we need fix it up. + */ + result = 0; + if (fds.revents & POLLIN_SET) + result |= RB_WAITFD_IN; + if (fds.revents & POLLOUT_SET) + result |= RB_WAITFD_OUT; + if (fds.revents & POLLEX_SET) + result |= RB_WAITFD_PRI; + return result; } #else /* ! USE_POLL - implement rb_io_poll_fd() using select() */ |