diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-30 00:33:05 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-30 00:33:05 +0000 |
commit | 0cebfad20ab9eb694eeb95f083635127cfbf35f9 (patch) | |
tree | 702a719d30aede3531ae8f7b37d5438ca8bceea6 /thread.c | |
parent | f3ef9346d1da0a4fdc1162e6c0832a38a7ea9f81 (diff) |
* thread.c (rb_thread_select): rewrite by using
rb_thread_fd_select(). old one is EINTR unsafe.
Patch by Eric Wong. [Bug #5229] [ruby-core:39102]
* test/-ext-/old_thread_select/test_old_thread_select.rb:
a testcase for rb_thread_select().
* ext/-test-/old_thread_select/old_thread_select.c: ditto.
* ext/-test-/old_thread_select/depend: ditto.
* ext/-test-/old_thread_select/extconf.rb: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33117 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 45 |
1 files changed, 26 insertions, 19 deletions
@@ -2686,29 +2686,36 @@ int rb_thread_select(int max, fd_set * read, fd_set * write, fd_set * except, struct timeval *timeout) { - if (!read && !write && !except) { - if (!timeout) { - rb_thread_sleep_forever(); - return 0; - } - rb_thread_wait_for(*timeout); - return 0; + rb_fdset_t fdsets[3] = { 0 }; + rb_fdset_t *rfds = NULL; + rb_fdset_t *wfds = NULL; + rb_fdset_t *efds = NULL; + int retval; + + if (read) { + rfds = &fdsets[0]; + rb_fd_copy(rfds, read, max); + } + if (write) { + wfds = &fdsets[1]; + rb_fd_copy(wfds, write, max); + } + if (except) { + efds = &fdsets[2]; + rb_fd_copy(efds, except, max); } - else { - int lerrno = errno; - int result; - BLOCKING_REGION({ - result = select(max, read, write, except, timeout); - if (result < 0) - lerrno = errno; - }, ubf_select, GET_THREAD()); - errno = lerrno; + retval = rb_thread_fd_select(max, rfds, efds, wfds, timeout); - return result; - } -} + if (rfds) + rb_fd_term(rfds); + if (wfds) + rb_fd_term(wfds); + if (efds) + rb_fd_term(efds); + return retval; +} int rb_thread_fd_select(int max, rb_fdset_t * read, rb_fdset_t * write, rb_fdset_t * except, |