mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* thread.c (rb_thread_select): fix to ignore an argument
modification of rb_thread_fd_select(). based on a patch by Eric Wong. [Bug #5306] [ruby-core:39435] * thread.c (rb_fd_rcopy): New. for reverse fd copy. * test/-ext-/old_thread_select/test_old_thread_select.rb (test_old_select_false_positive): test for bug5306. * ext/-test-/old_thread_select/old_thread_select.c (fdset2array): New. convert fdsets to array. * ext/-test-/old_thread_select/old_thread_select.c (old_thread_select): return 'read', 'write', 'except' argument of rb_thread_select() to ruby script. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
4705fcc3c0
commit
2c9375ba69
4 changed files with 84 additions and 3 deletions
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
Mon Sep 12 19:55:00 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
|
* thread.c (rb_thread_select): fix to ignore an argument
|
||||||
|
modification of rb_thread_fd_select().
|
||||||
|
based on a patch by Eric Wong. [Bug #5306] [ruby-core:39435]
|
||||||
|
* thread.c (rb_fd_rcopy): New. for reverse fd copy.
|
||||||
|
|
||||||
|
* test/-ext-/old_thread_select/test_old_thread_select.rb
|
||||||
|
(test_old_select_false_positive): test for bug5306.
|
||||||
|
|
||||||
|
* ext/-test-/old_thread_select/old_thread_select.c (fdset2array):
|
||||||
|
New. convert fdsets to array.
|
||||||
|
* ext/-test-/old_thread_select/old_thread_select.c (old_thread_select):
|
||||||
|
return 'read', 'write', 'except' argument of rb_thread_select()
|
||||||
|
to ruby script.
|
||||||
|
|
||||||
Mon Sep 12 13:38:12 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon Sep 12 13:38:12 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* README.EXT, README.EXT.ja (2.2.2), parse.y (rb_check_id): add
|
* README.EXT, README.EXT.ja (2.2.2), parse.y (rb_check_id): add
|
||||||
|
|
|
@ -25,6 +25,18 @@ static fd_set * array2fdset(fd_set *fds, VALUE ary, int *max)
|
||||||
return fds;
|
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
|
static VALUE
|
||||||
old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout)
|
old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout)
|
||||||
{
|
{
|
||||||
|
@ -45,6 +57,13 @@ old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout)
|
||||||
rc = rb_thread_select(max, rp, wp, ep, tvp);
|
rc = rb_thread_select(max, rp, wp, ep, tvp);
|
||||||
if (rc == -1)
|
if (rc == -1)
|
||||||
rb_sys_fail("rb_wait_for_single_fd");
|
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);
|
return INT2NUM(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,20 @@ class TestOldThreadSelect < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
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
|
def test_old_select_read_write_check
|
||||||
with_pipe do |r, w|
|
with_pipe do |r, w|
|
||||||
w.syswrite('.')
|
w.syswrite('.')
|
||||||
|
|
38
thread.c
38
thread.c
|
@ -2395,6 +2395,17 @@ rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int max)
|
||||||
memcpy(dst->fdset, src, size);
|
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
|
void
|
||||||
rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src)
|
rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src)
|
||||||
{
|
{
|
||||||
|
@ -2453,6 +2464,19 @@ rb_fd_init_copy(rb_fdset_t *dst, rb_fdset_t *src)
|
||||||
rb_fd_dup(dst, 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
|
void
|
||||||
rb_fd_term(rb_fdset_t *set)
|
rb_fd_term(rb_fdset_t *set)
|
||||||
{
|
{
|
||||||
|
@ -2489,6 +2513,8 @@ rb_fd_set(int fd, rb_fdset_t *set)
|
||||||
#define FD_CLR(i, f) rb_fd_clr((i), (f))
|
#define FD_CLR(i, f) rb_fd_clr((i), (f))
|
||||||
#define FD_ISSET(i, f) rb_fd_isset((i), (f))
|
#define FD_ISSET(i, f) rb_fd_isset((i), (f))
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define rb_fd_rcopy(d, s) (*(d) = *(s))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__CYGWIN__)
|
#if defined(__CYGWIN__)
|
||||||
|
@ -2710,12 +2736,18 @@ rb_thread_select(int max, fd_set * read, fd_set * write, fd_set * except,
|
||||||
|
|
||||||
retval = rb_thread_fd_select(max, rfds, wfds, efds, timeout);
|
retval = rb_thread_fd_select(max, rfds, wfds, efds, timeout);
|
||||||
|
|
||||||
if (rfds)
|
if (rfds) {
|
||||||
|
rb_fd_rcopy(read, rfds);
|
||||||
rb_fd_term(rfds);
|
rb_fd_term(rfds);
|
||||||
if (wfds)
|
}
|
||||||
|
if (wfds) {
|
||||||
|
rb_fd_rcopy(write, wfds);
|
||||||
rb_fd_term(wfds);
|
rb_fd_term(wfds);
|
||||||
if (efds)
|
}
|
||||||
|
if (efds) {
|
||||||
|
rb_fd_rcopy(except, efds);
|
||||||
rb_fd_term(efds);
|
rb_fd_term(efds);
|
||||||
|
}
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue