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/