mirror of
https://github.com/ruby/ruby.git
synced 2025-08-24 21:44:30 +02:00
* 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
This commit is contained in:
parent
f3ef9346d1
commit
0cebfad20a
6 changed files with 167 additions and 20 deletions
56
ext/-test-/old_thread_select/old_thread_select.c
Normal file
56
ext/-test-/old_thread_select/old_thread_select.c
Normal file
|
@ -0,0 +1,56 @@
|
|||
/* test case for deprecated C API */
|
||||
#include "ruby/ruby.h"
|
||||
#include "ruby/io.h"
|
||||
|
||||
static fd_set * array2fdset(fd_set *fds, VALUE ary, int *max)
|
||||
{
|
||||
long i;
|
||||
|
||||
if (NIL_P(ary))
|
||||
return NULL;
|
||||
|
||||
FD_ZERO(fds);
|
||||
Check_Type(ary, T_ARRAY);
|
||||
for (i = 0; i < RARRAY_LEN(ary); i++) {
|
||||
VALUE val = RARRAY_PTR(ary)[i];
|
||||
int fd;
|
||||
|
||||
Check_Type(val, T_FIXNUM);
|
||||
fd = FIX2INT(val);
|
||||
if (fd >= *max)
|
||||
*max = fd + 1;
|
||||
FD_SET(fd, fds);
|
||||
}
|
||||
|
||||
return fds;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timeval *tvp = NULL;
|
||||
fd_set rfds, wfds, efds;
|
||||
fd_set *rp, *wp, *ep;
|
||||
int rc;
|
||||
int max = 0;
|
||||
|
||||
if (!NIL_P(timeout)) {
|
||||
tv = rb_time_timeval(timeout);
|
||||
tvp = &tv;
|
||||
}
|
||||
rp = array2fdset(&rfds, r, &max);
|
||||
wp = array2fdset(&wfds, w, &max);
|
||||
ep = array2fdset(&efds, w, &max);
|
||||
rc = rb_thread_select(max, rp, wp, ep, tvp);
|
||||
if (rc == -1)
|
||||
rb_sys_fail("rb_wait_for_single_fd");
|
||||
return INT2NUM(rc);
|
||||
}
|
||||
|
||||
void
|
||||
Init_old_thread_select(void)
|
||||
{
|
||||
rb_define_singleton_method(rb_cIO, "old_thread_select",
|
||||
old_thread_select, 4);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue