From 156ccab7964ae35fa2bcdb0e0a9c5f11192aa848 Mon Sep 17 00:00:00 2001 From: kosaki Date: Sat, 7 May 2011 13:36:08 +0000 Subject: [PATCH] * thread.c (rb_fd_init_copy): new internal api. It provide efficient copy constructor semantics. * thread.c (do_select): use rb_fd_init_copy(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31465 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ include/ruby/intern.h | 1 + thread.c | 37 +++++++++++++++++++++++++------------ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42651858b8..309bde6034 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat May 7 22:34:29 2011 KOSAKI Motohiro + + * thread.c (rb_fd_init_copy): new internal api. It provide efficient + copy constructor semantics. + * thread.c (do_select): use rb_fd_init_copy(). + Sat May 7 15:18:06 2011 KOSAKI Motohiro fix incorrect native_cond_signal call when deadlock was detected. diff --git a/include/ruby/intern.h b/include/ruby/intern.h index efb2814e6f..84a8a46ed1 100644 --- a/include/ruby/intern.h +++ b/include/ruby/intern.h @@ -288,6 +288,7 @@ typedef fd_set rb_fdset_t; #define rb_fd_resize(n, f) ((void)(f)) #define rb_fd_ptr(f) (f) #define rb_fd_init(f) FD_ZERO(f) +#define rb_fd_init_copy(d, s) (*(d) = *(s)) #define rb_fd_term(f) ((void)(f)) #define rb_fd_max(f) FD_SETSIZE #define rb_fd_select(n, rfds, wfds, efds, timeout) select((n), (rfds), (wfds), (efds), (timeout)) diff --git a/thread.c b/thread.c index 271795fe9e..90c2765447 100644 --- a/thread.c +++ b/thread.c @@ -2327,6 +2327,18 @@ rb_fd_init(volatile rb_fdset_t *fds) FD_ZERO(fds->fdset); } +void +rb_fd_init_copy(rb_fdset_t *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); + dst->maxfd = src->maxfd; + dst->fdset = xmalloc(size); + memcpy(dst->fdset, src->fdset, size); +} + void rb_fd_term(rb_fdset_t *fds) { @@ -2432,6 +2444,13 @@ rb_fd_init(volatile rb_fdset_t *set) FD_ZERO(set->fdset); } +void +rb_fd_init_copy(rb_fdset_t *dst, rb_fdset_t *src) +{ + rb_fd_init(dst); + rb_fd_copy(dst, src); +} + void rb_fd_term(rb_fdset_t *set) { @@ -2523,18 +2542,12 @@ do_select(int n, rb_fdset_t *read, rb_fdset_t *write, rb_fdset_t *except, timeout = &wait_rest; } - if (read) { - rb_fd_init(&orig_read); - rb_fd_copy(&orig_read, read); - } - if (write) { - rb_fd_init(&orig_write); - rb_fd_copy(&orig_write, write); - } - if (except) { - rb_fd_init(&orig_except); - rb_fd_copy(&orig_except, except); - } + if (read) + rb_fd_init_copy(&orig_read, read); + if (write) + rb_fd_init_copy(&orig_write, write); + if (except) + rb_fd_init_copy(&orig_except, except); retry: lerrno = 0;