summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-07 13:36:08 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-07 13:36:08 +0000
commit156ccab7964ae35fa2bcdb0e0a9c5f11192aa848 (patch)
tree9dd75fe32f964e09fcb9e7544c5f55a105b897f8 /thread.c
parentddcd5c2939771129c779bad077bbacc59cd7679a (diff)
* 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
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/thread.c b/thread.c
index 271795fe9e..90c2765447 100644
--- a/thread.c
+++ b/thread.c
@@ -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;