diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-07 13:36:08 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-05-07 13:36:08 +0000 |
commit | 156ccab7964ae35fa2bcdb0e0a9c5f11192aa848 (patch) | |
tree | 9dd75fe32f964e09fcb9e7544c5f55a105b897f8 | |
parent | ddcd5c2939771129c779bad077bbacc59cd7679a (diff) | |
download | ruby-156ccab7964ae35fa2bcdb0e0a9c5f11192aa848.tar.gz |
* 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
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | include/ruby/intern.h | 1 | ||||
-rw-r--r-- | thread.c | 37 |
3 files changed, 32 insertions, 12 deletions
@@ -1,3 +1,9 @@ +Sat May 7 22:34:29 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> + + * 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 <kosaki.motohiro@gmail.com> 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)) @@ -2328,6 +2328,18 @@ rb_fd_init(volatile rb_fdset_t *fds) } 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) { if (fds->fdset) xfree(fds->fdset); @@ -2433,6 +2445,13 @@ rb_fd_init(volatile rb_fdset_t *set) } 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) { xfree(set->fdset); @@ -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; |