summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--include/ruby/intern.h1
-rw-r--r--thread.c37
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 <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))
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;