Bug #5306 » 0001-thread.c-rb_thread_select-mark-original-fd_sets-prop.patch
ext/-test-/old_thread_select/old_thread_select.c | ||
---|---|---|
return fds;
|
||
}
|
||
static void fdset2array(VALUE dst, fd_set *fds, int max)
|
||
{
|
||
int i;
|
||
rb_ary_clear(dst);
|
||
for (i = 0; i < max; i++) {
|
||
if (FD_ISSET(i, fds))
|
||
rb_ary_push(dst, INT2NUM(i));
|
||
}
|
||
}
|
||
static VALUE
|
||
old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout)
|
||
{
|
||
... | ... | |
rc = rb_thread_select(max, rp, wp, ep, tvp);
|
||
if (rc == -1)
|
||
rb_sys_fail("rb_wait_for_single_fd");
|
||
if (rp)
|
||
fdset2array(r, &rfds, max);
|
||
if (wp)
|
||
fdset2array(w, &wfds, max);
|
||
if (ep)
|
||
fdset2array(e, &efds, max);
|
||
return INT2NUM(rc);
|
||
}
|
||
test/-ext-/old_thread_select/test_old_thread_select.rb | ||
---|---|---|
end
|
||
end
|
||
def test_old_select_false_positive
|
||
bug5306 = '[ruby-core:39435]'
|
||
with_pipe do |r2, w2|
|
||
with_pipe do |r, w|
|
||
t0 = Time.now
|
||
w.syswrite '.'
|
||
rfds = [ r.fileno, r2.fileno ]
|
||
rc = IO.old_thread_select(rfds, nil, nil, nil)
|
||
assert_equal [ r.fileno ], rfds, bug5306
|
||
assert_equal 1, rc, bug5306
|
||
end
|
||
end
|
||
end
|
||
def test_old_select_read_write_check
|
||
with_pipe do |r, w|
|
||
w.syswrite('.')
|
thread.c | ||
---|---|---|
return TRUE;
|
||
}
|
||
static void rb_fd_rcopy(fd_set *dst, rb_fdset_t *src)
|
||
{
|
||
size_t size = howmany(rb_fd_max(src), NFDBITS) * sizeof(fd_mask);
|
||
if (size < sizeof(fd_set))
|
||
size = sizeof(fd_set);
|
||
memcpy(dst, rb_fd_ptr(src), size);
|
||
rb_fd_term(src);
|
||
}
|
||
int
|
||
rb_thread_select(int max, fd_set * read, fd_set * write, fd_set * except,
|
||
struct timeval *timeout)
|
||
... | ... | |
retval = rb_thread_fd_select(max, rfds, wfds, efds, timeout);
|
||
if (rfds)
|
||
if (rfds) {
|
||
rb_fd_rcopy(read, rfds);
|
||
rb_fd_term(rfds);
|
||
if (wfds)
|
||
}
|
||
if (wfds) {
|
||
rb_fd_rcopy(write, wfds);
|
||
rb_fd_term(wfds);
|
||
if (efds)
|
||
}
|
||
if (efds) {
|
||
rb_fd_rcopy(except, efds);
|
||
rb_fd_term(efds);
|
||
}
|
||
return retval;
|
||
}
|