diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-07-23 02:46:41 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-07-23 02:46:41 +0000 |
commit | 80914a2666d44d1f5b112240d22441d3ac0476c2 (patch) | |
tree | def78c73cdc98494c5ad9dd2e3df52a97f187a32 | |
parent | 6524f34a2688436249d111a3456a097c7111722c (diff) | |
download | ruby-80914a2666d44d1f5b112240d22441d3ac0476c2.tar.gz |
* eval.c (rb_fd_select): the all three fd_sets must be long enough for
select. fixed: [ruby-talk:149059]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8826 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | eval.c | 26 | ||||
-rw-r--r-- | intern.h | 2 |
3 files changed, 30 insertions, 3 deletions
@@ -1,3 +1,8 @@ +Sat Jul 23 11:46:30 2005 Tanaka Akira <akr@m17n.org> + + * eval.c (rb_fd_select): the all three fd_sets must be long enough for + select. fixed: [ruby-talk:149059] + Sat Jul 23 10:01:41 2005 Nobuyoshi Nakada <nobu@ruby-lang.org> * sprintf.c (rb_vsprintf, rb_sprintf): new functions return new String, @@ -9871,8 +9871,8 @@ rb_fd_zero(fds) } } -void -rb_fd_set(n, fds) +static void +rb_fd_resize(n, fds) int n; rb_fdset_t *fds; { @@ -9887,6 +9887,14 @@ rb_fd_set(n, fds) memset((char *)fds->fdset + o, 0, m - o); } if (n >= fds->maxfd) fds->maxfd = n + 1; +} + +void +rb_fd_set(n, fds) + int n; + rb_fdset_t *fds; +{ + rb_fd_resize(n, fds); FD_SET(n, fds->fdset); } @@ -9922,6 +9930,18 @@ rb_fd_copy(dst, src, max) memcpy(dst->fdset, src, size); } +int +rb_fd_select(n, readfds, writefds, exceptfds, timeout) + int n; + rb_fdset_t *readfds, *writefds, *exceptfds; + struct timeval *timeout; +{ + rb_fd_resize(n - 1, readfds); + rb_fd_resize(n - 1, writefds); + rb_fd_resize(n - 1, exceptfds); + return select(n, rb_fd_ptr(readfds), rb_fd_ptr(writefds), rb_fd_ptr(exceptfds), timeout); +} + #undef FD_ZERO #undef FD_SET #undef FD_CLR @@ -10786,7 +10806,7 @@ rb_thread_schedule() delay_ptr = &delay_tv; } - n = select(max+1, rb_fd_ptr(&readfds), rb_fd_ptr(&writefds), rb_fd_ptr(&exceptfds), delay_ptr); + n = rb_fd_select(max+1, &readfds, &writefds, &exceptfds, delay_ptr); if (n < 0) { int e = errno; @@ -168,6 +168,7 @@ void rb_fd_set _((int, rb_fdset_t *)); void rb_fd_clr _((int, rb_fdset_t *)); int rb_fd_isset _((int, const rb_fdset_t *)); void rb_fd_copy _((rb_fdset_t *, const fd_set *, int)); +int rb_fd_select _((int, rb_fdset_t *, rb_fdset_t *, rb_fdset_t *, struct timeval *)); #define rb_fd_ptr(f) ((f)->fdset) #define rb_fd_max(f) ((f)->maxfd) @@ -184,6 +185,7 @@ typedef fd_set rb_fdset_t; #define rb_fd_init(f) FD_ZERO(f) #define rb_fd_term(f) (f) #define rb_fd_max(f) FD_SETSIZE +#define rb_fd_select(n, rfds, wfds, efds, timeout) select(n, rfds, wfds, efds, timeout) #endif |