diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-09-12 11:36:06 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-09-12 11:36:06 +0000 |
commit | 2c9375ba69c5bfba56e8cc1ab4ac7c2ff01d24f3 (patch) | |
tree | c4555ba6c22779df7b80a2a217e01fe59bf87982 /thread.c | |
parent | 4705fcc3c0df0d4f389aff690852356b8d2fd317 (diff) | |
download | ruby-2c9375ba69c5bfba56e8cc1ab4ac7c2ff01d24f3.tar.gz |
* 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
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 38 |
1 files changed, 35 insertions, 3 deletions
@@ -2395,6 +2395,17 @@ rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int max) 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) { @@ -2453,6 +2464,19 @@ rb_fd_init_copy(rb_fdset_t *dst, 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) { @@ -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_ISSET(i, f) rb_fd_isset((i), (f)) +#else +#define rb_fd_rcopy(d, s) (*(d) = *(s)) #endif #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); - 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; } |