[前][次][番号順一覧][スレッド一覧]

ruby-changes:19425

From: kosaki <ko1@a...>
Date: Sat, 7 May 2011 22:36:15 +0900 (JST)
Subject: [ruby-changes:19425] Ruby:r31465 (trunk): * thread.c (rb_fd_init_copy): new internal api. It provide efficient

kosaki	2011-05-07 22:36:08 +0900 (Sat, 07 May 2011)

  New Revision: 31465

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31465

  Log:
    * thread.c (rb_fd_init_copy): new internal api. It provide efficient
      copy constructor semantics.
    * thread.c (do_select): use rb_fd_init_copy().

  Modified files:
    trunk/ChangeLog
    trunk/include/ruby/intern.h
    trunk/thread.c

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h	(revision 31464)
+++ include/ruby/intern.h	(revision 31465)
@@ -288,6 +288,7 @@
 #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))
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 31464)
+++ ChangeLog	(revision 31465)
@@ -1,3 +1,9 @@
+Sat May  7 22:34:29 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
+
+	* 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@g...>
 	fix incorrect native_cond_signal call when deadlock was detected.
 
Index: thread.c
===================================================================
--- thread.c	(revision 31464)
+++ thread.c	(revision 31465)
@@ -2328,6 +2328,18 @@
 }
 
 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 @@
 }
 
 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 @@
 	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;

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]