Project

General

Profile

Bug #5306 » 0001-thread.c-rb_thread_select-mark-original-fd_sets-prop.patch

normalperson (Eric Wong), 09/11/2011 09:30 AM

View differences:

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;
}
(5-5/8)