Bug #5306 » old_thread_select.patch
thread.c (working copy) | ||
---|---|---|
memcpy(dst->fdset, src, size);
|
||
}
|
||
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)) {
|
||
rb_raise(rb_eArgError, "too large fdsets");
|
||
}
|
||
memcpy(dst, rb_fd_ptr(src), sizeof(fd_set));
|
||
}
|
||
void
|
||
rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src)
|
||
{
|
||
... | ... | |
rb_fd_dup(dst, src);
|
||
}
|
||
static void
|
||
rb_fd_rcopy(fd_set *dst, rb_fdset_t *src)
|
||
{
|
||
int max = rb_fd_max(src);
|
||
if (max > FD_SETSIZE) {
|
||
rb_raise(rb_eArgError, "too large fdsets");
|
||
}
|
||
memcpy(dst->fd_array, src->fdset->fd_array, max);
|
||
dst->fd_count = max;
|
||
}
|
||
void
|
||
rb_fd_term(rb_fdset_t *set)
|
||
{
|
||
... | ... | |
#define FD_CLR(i, f) rb_fd_clr((i), (f))
|
||
#define FD_ISSET(i, f) rb_fd_isset((i), (f))
|
||
#else
|
||
#define rb_fd_rcopy(d, s) (*(d) = *(s))
|
||
#endif
|
||
#if defined(__CYGWIN__)
|
||
... | ... | |
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;
|
||
}
|
ext/-test-/old_thread_select/old_thread_select.c (working copy) | ||
---|---|---|
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 (working copy) | ||
---|---|---|
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('.')
|