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

ruby-changes:6392

From: nobu <ko1@a...>
Date: Sun, 6 Jul 2008 23:58:55 +0900 (JST)
Subject: [ruby-changes:6392] Ruby:r17908 (mvm): * merged from trunk r17892:17907.

nobu	2008-07-06 23:58:12 +0900 (Sun, 06 Jul 2008)

  New Revision: 17908

  Modified files:
    branches/mvm/.merged-trunk-revision
    branches/mvm/ChangeLog
    branches/mvm/ext/socket/socket.c
    branches/mvm/include/ruby/intern.h
    branches/mvm/include/ruby/ruby.h
    branches/mvm/io.c
    branches/mvm/lib/test/unit/collector/objectspace.rb
    branches/mvm/process.c
    branches/mvm/test/win32ole/test_win32ole_type.rb
    branches/mvm/version.h

  Log:
    * merged from trunk r17892:17907.

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

Index: mvm/include/ruby/intern.h
===================================================================
--- mvm/include/ruby/intern.h	(revision 17907)
+++ mvm/include/ruby/intern.h	(revision 17908)
@@ -386,6 +386,7 @@
 void rb_write_error2(const char*, long);
 int rb_io_mode_modenum(const char *mode);
 void rb_close_before_exec(int lowfd, int maxhint, VALUE noclose_fds);
+int rb_pipe(int *pipes);
 /* marshal.c */
 VALUE rb_marshal_dump(VALUE, VALUE);
 VALUE rb_marshal_load(VALUE);
Index: mvm/include/ruby/ruby.h
===================================================================
--- mvm/include/ruby/ruby.h	(revision 17907)
+++ mvm/include/ruby/ruby.h	(revision 17908)
@@ -357,13 +357,13 @@
 #define NUM2ULONG(x) rb_num2ulong((VALUE)x)
 #if SIZEOF_INT < SIZEOF_LONG
 long rb_num2int(VALUE);
-#define NUM2INT(x) (FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x))
+#define NUM2INT(x) ((int)(FIXNUM_P(x)?FIX2INT(x):rb_num2int((VALUE)x)))
 long rb_fix2int(VALUE);
-#define FIX2INT(x) rb_fix2int((VALUE)x)
+#define FIX2INT(x) ((int)rb_fix2int((VALUE)x))
 unsigned long rb_num2uint(VALUE);
-#define NUM2UINT(x) rb_num2uint(x)
+#define NUM2UINT(x) ((unsigned int)rb_num2uint(x))
 unsigned long rb_fix2uint(VALUE);
-#define FIX2UINT(x) rb_fix2uint(x)
+#define FIX2UINT(x) ((unsigned int)rb_fix2uint(x))
 #else
 #define NUM2INT(x) ((int)NUM2LONG(x))
 #define NUM2UINT(x) ((unsigned int)NUM2ULONG(x))
Index: mvm/ChangeLog
===================================================================
--- mvm/ChangeLog	(revision 17907)
+++ mvm/ChangeLog	(revision 17908)
@@ -1,3 +1,45 @@
+Sun Jul  6 23:48:06 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* ext/socket/socket.c (bsock_send, s_recvfrom, ruby_connect, s_accept),
+	  (udp_send, unix_send_io, unix_recv_io): blocking region support.
+
+Sun Jul  6 18:34:35 2008  Masaki Suketa  <masaki.suketa@n...>
+
+	* test/win32ole/test_win32ole_type.rb (test_initialize): add 
+	  more assertions.
+
+Sun Jul  6 10:12:21 2008  Kouhei Sutou  <kou@c...>
+
+	* lib/test/unit/collector/objectspace.rb
+	(Test::Unit::Collector::ObjectSpace::NAME): fix a typo.
+
+Sun Jul  6 00:56:51 2008  Tanaka Akira  <akr@f...>
+
+	* ext/socket/socket.c (host_str): fix type mismatch in rb_raise
+	  format and argument.
+	  (port_str): ditto.
+	  (unix_recv_io): ditto.
+	  (sock_s_unpack_sockaddr_un): ditto.
+
+Sat Jul  5 23:42:23 2008  Tanaka Akira  <akr@f...>
+
+	* include/ruby/ruby.h (NUM2INT): cast to int.
+	  (FIX2INT): ditto.
+	  (NUM2UINT): cast to unsigned int.
+	  (FIX2UINT): ditto.
+
+Sat Jul  5 23:10:41 2008  Tanaka Akira  <akr@f...>
+
+	* io.c (rb_pipe): new function for handling EMFILE and ENFILE
+	  error of pipe().
+	  (UPDATE_MAXFD_PIPE): removed.
+	  (pipe_open): use rb_pipe.
+	  (rb_io_s_pipe): ditto.
+
+	* process.c (pipe_nocrash): use rb_pipe.
+
+	* include/ruby/intern.h (rb_pipe): declared.
+
 Sat Jul  5 22:22:27 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* thread.c (thread_initialize): NUM2INT() returns int.
Index: mvm/io.c
===================================================================
--- mvm/io.c	(revision 17907)
+++ mvm/io.c	(revision 17908)
@@ -145,13 +145,7 @@
     do { \
         if (max_file_descriptor < (fd)) max_file_descriptor = (fd); \
     } while (0)
-#define UPDATE_MAXFD_PIPE(filedes) \
-    do { \
-        UPDATE_MAXFD((filedes)[0]); \
-        UPDATE_MAXFD((filedes)[1]); \
-    } while (0)
 
-
 #define argf_of(obj) (*(struct argf *)DATA_PTR(obj))
 #define ruby_vm_argf(vm) ((vm)->argf)
 #define ARGF argf_of(ruby_vm_argf(GET_VM()))
@@ -3643,6 +3637,24 @@
     rb_io_synchronized(fptr);
 }
 
+int
+rb_pipe(int *pipes)
+{
+    int ret;
+    ret = pipe(pipes);
+    if (ret == -1) {
+        if (errno == EMFILE || errno == ENFILE) {
+            rb_gc();
+            ret = pipe(pipes);
+        }
+    }
+    if (ret == 0) {
+        UPDATE_MAXFD(pipes[0]);
+        UPDATE_MAXFD(pipes[1]);
+    }
+    return ret;
+}
+
 #ifdef HAVE_FORK
 struct popen_arg {
     struct rb_exec_arg *execp;
@@ -3765,33 +3777,29 @@
     arg.write_pair[0] = arg.write_pair[1] = -1;
     switch (modef & (FMODE_READABLE|FMODE_WRITABLE)) {
       case FMODE_READABLE|FMODE_WRITABLE:
-        if (pipe(arg.write_pair) < 0)
+        if (rb_pipe(arg.write_pair) < 0)
             rb_sys_fail(cmd);
-        UPDATE_MAXFD_PIPE(arg.write_pair);
-        if (pipe(arg.pair) < 0) {
+        if (rb_pipe(arg.pair) < 0) {
             int e = errno;
             close(arg.write_pair[0]);
             close(arg.write_pair[1]);
             errno = e;
             rb_sys_fail(cmd);
         }
-        UPDATE_MAXFD_PIPE(arg.pair);
         if (eargp) {
             rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(arg.write_pair[0]));
             rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(arg.pair[1]));
         }
 	break;
       case FMODE_READABLE:
-        if (pipe(arg.pair) < 0)
+        if (rb_pipe(arg.pair) < 0)
             rb_sys_fail(cmd);
-        UPDATE_MAXFD_PIPE(arg.pair);
         if (eargp)
             rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(arg.pair[1]));
 	break;
       case FMODE_WRITABLE:
-        if (pipe(arg.pair) < 0)
+        if (rb_pipe(arg.pair) < 0)
             rb_sys_fail(cmd);
-        UPDATE_MAXFD_PIPE(arg.pair);
         if (eargp)
             rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(arg.pair[0]));
 	break;
@@ -6211,9 +6219,8 @@
     rb_io_t *fptr;
 
     rb_scan_args(argc, argv, "02", &v1, &v2);
-    if (pipe(pipes) == -1)
-	rb_sys_fail(0);
-    UPDATE_MAXFD_PIPE(pipes);
+    if (rb_pipe(pipes) == -1)
+        rb_sys_fail(0);
 
     args[0] = klass;
     args[1] = INT2NUM(pipes[0]);
Index: mvm/lib/test/unit/collector/objectspace.rb
===================================================================
--- mvm/lib/test/unit/collector/objectspace.rb	(revision 17907)
+++ mvm/lib/test/unit/collector/objectspace.rb	(revision 17908)
@@ -10,7 +10,7 @@
       class ObjectSpace
         include Test::Unit::Collector
         
-        NAME = 'collected from the subclasses of TestSuite'
+        NAME = 'collected from the subclasses of TestCase'
         
         def initialize(source=nil)
           super()
Index: mvm/process.c
===================================================================
--- mvm/process.c	(revision 17907)
+++ mvm/process.c	(revision 17908)
@@ -2255,7 +2255,7 @@
 pipe_nocrash(int filedes[2], VALUE fds)
 {
     int ret;
-    ret = pipe(filedes);
+    ret = rb_pipe(filedes);
     if (ret == -1)
         return -1;
     if (RTEST(fds)) {
Index: mvm/ext/socket/socket.c
===================================================================
--- mvm/ext/socket/socket.c	(revision 17907)
+++ mvm/ext/socket/socket.c	(revision 17908)
@@ -102,6 +102,8 @@
 #endif
 #endif
 
+#define BLOCKING_REGION(func, arg) (long)rb_thread_blocking_region((func), (arg), RB_UBF_DFL, 0)
+
 #define INET_CLIENT 0
 #define INET_SERVER 1
 #define INET_SOCKS  2
@@ -498,37 +500,60 @@
     return rb_str_new(buf, len);
 }
 
+struct send_arg {
+    int fd, flags;
+    VALUE mesg;
+    struct sockaddr *to;
+    socklen_t tolen;
+};
+
 static VALUE
+sendto_blocking(void *data)
+{
+    struct send_arg *arg = data;
+    VALUE mesg = arg->mesg;
+    return (VALUE)sendto(arg->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg),
+			 arg->flags, arg->to, arg->tolen);
+}
+
+static VALUE
+send_blocking(void *data)
+{
+    struct send_arg *arg = data;
+    VALUE mesg = arg->mesg;
+    return (VALUE)send(arg->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg),
+		       arg->flags);
+}
+
+static VALUE
 bsock_send(int argc, VALUE *argv, VALUE sock)
 {
-    VALUE mesg, to;
-    VALUE flags;
+    struct send_arg arg;
+    VALUE flags, to;
     rb_io_t *fptr;
-    int fd, n;
+    int n;
+    rb_blocking_function_t *func;
 
     rb_secure(4);
-    rb_scan_args(argc, argv, "21", &mesg, &flags, &to);
+    rb_scan_args(argc, argv, "21", &arg.mesg, &flags, &to);
 
-    StringValue(mesg);
-    if (!NIL_P(to)) StringValue(to);
-    GetOpenFile(sock, fptr);
-    fd = fptr->fd;
-    rb_thread_fd_writable(fd);
-  retry:
+    StringValue(arg.mesg);
     if (!NIL_P(to)) {
-        TRAP_BEG;
-	n = sendto(fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg), NUM2INT(flags),
-		   (struct sockaddr*)RSTRING_PTR(to), RSTRING_LEN(to));
-        TRAP_END;
+	StringValue(to);
+	to = rb_str_new4(to);
+	arg.to = (struct sockaddr *)RSTRING_PTR(to);
+	arg.tolen = RSTRING_LEN(to);
+	func = sendto_blocking;
     }
     else {
-        TRAP_BEG;
-	n = send(fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg), NUM2INT(flags));
-        TRAP_END;
+	func = send_blocking;
     }
-    if (n < 0) {
-	if (rb_io_wait_writable(fd)) {
-	    goto retry;
+    GetOpenFile(sock, fptr);
+    arg.fd = fptr->fd;
+    arg.flags = NUM2INT(flags);
+    while ((n = (int)BLOCKING_REGION(func, &arg)) < 0) {
+	if (rb_io_wait_writable(arg.fd)) {
+	    continue;
 	}
 	rb_sys_fail("send(2)");
     }
@@ -572,72 +597,80 @@
     RECV_SOCKET			/* Socket#recvfrom */
 };
 
+struct recvfrom_arg {
+    int fd, flags;
+    VALUE str;
+    socklen_t alen;
+    char buf[1024];
+};
+
 static VALUE
+recvfrom_blocking(void *data)
+{
+    struct recvfrom_arg *arg = data;
+    return (VALUE)recvfrom(arg->fd, RSTRING_PTR(arg->str), RSTRING_LEN(arg->str),
+			   arg->flags, (struct sockaddr*)arg->buf, &arg->alen);
+}
+
+static VALUE
 s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
 {
     rb_io_t *fptr;
-    VALUE str;
-    char buf[1024];
-    socklen_t alen = sizeof buf;
+    VALUE str, klass;
+    struct recvfrom_arg arg;
     VALUE len, flg;
     long buflen;
     long slen;
-    int fd, flags;
 
     rb_scan_args(argc, argv, "11", &len, &flg);
 
-    if (flg == Qnil) flags = 0;
-    else             flags = NUM2INT(flg);
+    if (flg == Qnil) arg.flags = 0;
+    else             arg.flags = NUM2INT(flg);
     buflen = NUM2INT(len);
 
     GetOpenFile(sock, fptr);
     if (rb_io_read_pending(fptr)) {
 	rb_raise(rb_eIOError, "recv for buffered IO");
     }
-    fd = fptr->fd;
+    arg.fd = fptr->fd;
+    arg.alen = sizeof(arg.buf);
 
-    str = rb_tainted_str_new(0, buflen);
+    arg.str = str = rb_tainted_str_new(0, buflen);
+    klass = RBASIC(str)->klass;
+    RBASIC(str)->klass = 0;
 
-  retry:
-    rb_thread_wait_fd(fd);
-    rb_io_check_closed(fptr);
-    if (RSTRING_LEN(str) != buflen) {
-	rb_raise(rb_eRuntimeError, "buffer string modified");
+    while (rb_io_check_closed(fptr),
+	   (slen = BLOCKING_REGION(recvfrom_blocking, &arg)) < 0) {
+	if (RBASIC(str)->klass || RSTRING_LEN(str) != buflen) {
+	    rb_raise(rb_eRuntimeError, "buffer string modified");
+	}
     }
-    TRAP_BEG;
-    slen = recvfrom(fd, RSTRING_PTR(str), buflen, flags, (struct sockaddr*)buf, &alen);
-    TRAP_END;
 
-    if (slen < 0) {
-	if (rb_io_wait_readable(fd)) {
-	    goto retry;
-	}
-	rb_sys_fail("recvfrom(2)");
-    }
+    RBASIC(str)->klass = klass;
     if (slen < RSTRING_LEN(str)) {
 	rb_str_set_len(str, slen);
     }
     rb_obj_taint(str);
     switch (from) {
       case RECV_RECV:
-	return (VALUE)str;
+	return str;
       case RECV_IP:
 #if 0
-	if (alen != sizeof(struct sockaddr_in)) {
+	if (arg.alen != sizeof(struct sockaddr_in)) {
 	    rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
 	}
 #endif
-	if (alen && alen != sizeof(buf)) /* OSX doesn't return a from result for connection-oriented sockets */
-	    return rb_assoc_new(str, ipaddr((struct sockaddr*)buf, fptr->mode & FMODE_NOREVLOOKUP));
+	if (arg.alen && arg.alen != sizeof(arg.buf)) /* OSX doesn't return a from result for connection-oriented sockets */
+	    return rb_assoc_new(str, ipaddr((struct sockaddr*)arg.buf, fptr->mode & FMODE_NOREVLOOKUP));
 	else
 	    return rb_assoc_new(str, Qnil);
 
 #ifdef HAVE_SYS_UN_H
       case RECV_UNIX:
-        return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf, alen));
+        return rb_assoc_new(str, unixaddr((struct sockaddr_un*)arg.buf, arg.alen));
 #endif
       case RECV_SOCKET:
-	return rb_assoc_new(str, rb_str_new(buf, alen));
+	return rb_assoc_new(str, rb_str_new(arg.buf, arg.alen));
       default:
 	rb_bug("s_recvfrom called with bad value");
     }
@@ -850,7 +883,8 @@
 	    make_inetaddr(INADDR_BROADCAST, hbuf, len);
 	}
 	else if (strlen(name) >= len) {
-	    rb_raise(rb_eArgError, "hostname too long (%d)", strlen(name));
+	    rb_raise(rb_eArgError, "hostname too long (%"PRIuVALUE")",
+                (VALUE)strlen(name));
 	}
 	else {
 	    strcpy(hbuf, name);
@@ -875,7 +909,8 @@
 	SafeStringValue(port);
 	serv = RSTRING_PTR(port);
 	if (strlen(serv) >= len) {
-	    rb_raise(rb_eArgError, "service name too long (%d)", strlen(serv));
+	    rb_raise(rb_eArgError, "service name too long (%"PRIuVALUE")",
+                (VALUE)strlen(serv));
 	}
 	strcpy(pbuf, serv);
 	return pbuf;
@@ -919,19 +954,20 @@
 
 #if defined(__APPLE__) && defined(__MACH__)
     {
-        struct addrinfo *r;
-       r = res;
-       while (r) {
-            if (! r->ai_socktype) r->ai_socktype = hints.ai_socktype;
-            if (! r->ai_protocol) {
-                if (r->ai_socktype == SOCK_DGRAM) {
-                    r->ai_protocol = IPPROTO_UDP;
-                } else if (r->ai_socktype == SOCK_STREAM) {
-                    r->ai_protocol = IPPROTO_TCP;
-                }
-            }
-            r = r->ai_next;
-        }
+	struct addrinfo *r;
+	r = res;
+	while (r) {
+	    if (! r->ai_socktype) r->ai_socktype = hints.ai_socktype;
+	    if (! r->ai_protocol) {
+		if (r->ai_socktype == SOCK_DGRAM) {
+		    r->ai_protocol = IPPROTO_UDP;
+		}
+		else if (r->ai_socktype == SOCK_STREAM) {
+		    r->ai_protocol = IPPROTO_TCP;
+		}
+	    }
+	    r = r->ai_next;
+	}
     }
 #endif
     return res;
@@ -1098,49 +1134,48 @@
 #define WAIT_IN_PROGRESS 1
 #endif
 
+struct connect_arg {
+    int fd;
+    const struct sockaddr *sockaddr;
+    socklen_t len;
+};
+
+static VALUE
+connect_blocking(void *data)
+{
+    struct connect_arg *arg = data;
+    return (VALUE)connect(arg->fd, arg->sockaddr, arg->len);
+}
+
+#if defined(SOCKS) && !defined(SOCKS5)
+static VALUE
+socks_connect_blocking(void *data)
+{
+    struct connect_arg *arg = data;
+    return (VALUE)Rconnect(arg->fd, arg->sockaddr, arg->len);
+}
+#endif
+
 static int
-ruby_connect(int fd, struct sockaddr *sockaddr, int len, int socks)
+ruby_connect(int fd, const struct sockaddr *sockaddr, int len, int socks)
 {
     int status;
-    int mode;
+    rb_blocking_function_t *func = connect_blocking;
+    struct connect_arg arg;
 #if WAIT_IN_PROGRESS > 0
     int wait_in_progress = -1;
     int sockerr;
     socklen_t sockerrlen;
 #endif
 
-#if defined(HAVE_FCNTL)
-# if defined(F_GETFL)
-    mode = fcntl(fd, F_GETFL, 0);
-# else
-    mode = 0;
-# endif
-
-#ifdef O_NDELAY
-# define NONBLOCKING O_NDELAY
-#else
-#ifdef O_NBIO
-# define NONBLOCKING O_NBIO
-#else
-# define NONBLOCKING O_NONBLOCK
+    arg.fd = fd;
+    arg.sockaddr = sockaddr;
+    arg.len = len;
+#if defined(SOCKS) && !defined(SOCKS5)
+    if (socks) func = socks_connect_blocking;
 #endif
-#endif
-#ifdef SOCKS5
-    if (!socks)
-#endif
-    fcntl(fd, F_SETFL, mode|NONBLOCKING);
-#endif /* HAVE_FCNTL */
-
     for (;;) {
-#if defined(SOCKS) && !defined(SOCKS5)
-	if (socks) {
-	    status = Rconnect(fd, sockaddr, len);
-	}
-	else
-#endif
-	{
-	    status = connect(fd, sockaddr, len);
-	}
+	status = (int)BLOCKING_REGION(func, &arg);
 	if (status < 0) {
 	    switch (errno) {
 	      case EAGAIN:
@@ -1201,9 +1236,6 @@
 		break;
 	    }
 	}
-#ifdef HAVE_FCNTL
-	fcntl(fd, F_SETFL, mode);
-#endif
 	return status;
     }
 }
@@ -1242,7 +1274,7 @@
     int type = arg->type;
     struct addrinfo *res;
     int fd, status = 0;
-    const char *syscall;
+    const char *syscall = 0;
 
     arg->remote.res = sock_addrinfo(arg->remote.host, arg->remote.serv, SOCK_STREAM,
 				    (type == INET_SERVER) ? AI_PASSIVE : 0);
@@ -1493,22 +1525,32 @@
     return init_sock(rb_obj_alloc(klass), fd2);
 }
 
+struct accept_arg {
+    int fd;
+    struct sockaddr *sockaddr;
+    socklen_t *len;
+};
+
 static VALUE
+accept_blocking(void *data)
+{
+    struct accept_arg *arg = data;
+    return (VALUE)accept(arg->fd, arg->sockaddr, arg->len);
+}
+
+static VALUE
 s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
 {
     int fd2;
     int retry = 0;
+    struct accept_arg arg;
 
     rb_secure(3);
+    arg.fd = fd;
+    arg.sockaddr = sockaddr;
+    arg.len = len;
   retry:
-    rb_thread_wait_fd(fd);
-#if defined(_nec_ews)
-    fd2 = accept(fd, sockaddr, len);
-#else
-    TRAP_BEG;
-    fd2 = accept(fd, sockaddr, len);
-    TRAP_END;
-#endif
+    fd2 = (int)BLOCKING_REGION(accept_blocking, &arg);
     if (fd2 < 0) {
 	switch (errno) {
 	  case EMFILE:
@@ -1789,24 +1831,28 @@
 static VALUE
 udp_send(int argc, VALUE *argv, VALUE sock)
 {
-    VALUE mesg, flags, host, port;
+    VALUE flags, host, port;
     rb_io_t *fptr;
     int n;
     struct addrinfo *res0, *res;
+    struct send_arg arg;
 
     if (argc == 2 || argc == 3) {
 	return bsock_send(argc, argv, sock);
     }
     rb_secure(4);
-    rb_scan_args(argc, argv, "4", &mesg, &flags, &host, &port);
+    rb_scan_args(argc, argv, "4", &arg.mesg, &flags, &host, &port);
 
-    StringValue(mesg);
+    StringValue(arg.mesg);
     res0 = sock_addrinfo(host, port, SOCK_DGRAM, 0);
     GetOpenFile(sock, fptr);
+    arg.fd = fptr->fd;
+    arg.flags = NUM2INT(flags);
     for (res = res0; res; res = res->ai_next) {
       retry:
-	n = sendto(fptr->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg), NUM2INT(flags),
-		   res->ai_addr, res->ai_addrlen);
+	arg.to = res->ai_addr;
+	arg.tolen = res->ai_addrlen;
+	n = (int)BLOCKING_REGION(sendto_blocking, &arg);
 	if (n >= 0) {
 	    freeaddrinfo(res0);
 	    return INT2FIX(n);
@@ -1922,13 +1968,25 @@
 #define FD_PASSING_BY_MSG_ACCRIGHTS 0
 #endif
 
+struct iomsg_arg {
+    int fd;
+    struct msghdr msg;
+};
+
 static VALUE
+sendmsg_blocking(void *data)
+{
+    struct iomsg_arg *arg = data;
+    return sendmsg(arg->fd, &arg->msg, 0);
+}
+
+static VALUE
 unix_send_io(VALUE sock, VALUE val)
 {
 #if defined(HAVE_SENDMSG) && (FD_PASSING_BY_MSG_CONTROL || FD_PASSING_BY_MSG_ACCRIGHTS)
     int fd;
     rb_io_t *fptr;
-    struct msghdr msg;
+    struct iomsg_arg arg;
     struct iovec vec[1];
     char buf[1];
 
@@ -1953,31 +2011,32 @@
 
     GetOpenFile(sock, fptr);
 
-    msg.msg_name = NULL;
-    msg.msg_namelen = 0;
+    arg.msg.msg_name = NULL;
+    arg.msg.msg_namelen = 0;
 
     /* Linux and Solaris doesn't work if msg_iov is NULL. */
     buf[0] = '\0';
     vec[0].iov_base = buf;
     vec[0].iov_len = 1;
-    msg.msg_iov = vec;
-    msg.msg_iovlen = 1;
+    arg.msg.msg_iov = vec;
+    arg.msg.msg_iovlen = 1;
 
 #if FD_PASSING_BY_MSG_CONTROL
-    msg.msg_control = (caddr_t)&cmsg;
-    msg.msg_controllen = CMSG_LEN(sizeof(int));
-    msg.msg_flags = 0;
+    arg.msg.msg_control = (caddr_t)&cmsg;
+    arg.msg.msg_controllen = CMSG_LEN(sizeof(int));
+    arg.msg.msg_flags = 0;
     MEMZERO((char*)&cmsg, char, sizeof(cmsg));
     cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int));
     cmsg.hdr.cmsg_level = SOL_SOCKET;
     cmsg.hdr.cmsg_type = SCM_RIGHTS;
     *(int *)CMSG_DATA(&cmsg.hdr) = fd;
 #else
-    msg.msg_accrights = (caddr_t)&fd;
-    msg.msg_accrightslen = sizeof(fd);
+    arg.msg.msg_accrights = (caddr_t)&fd;
+    arg.msg.msg_accrightslen = sizeof(fd);
 #endif
 
-    if (sendmsg(fptr->fd, &msg, 0) == -1)
+    arg.fd = fptr->fd;
+    if ((int)BLOCKING_REGION(sendmsg_blocking, &arg) == -1)
 	rb_sys_fail("sendmsg(2)");
 
     return Qnil;
@@ -1988,12 +2047,19 @@
 }
 
 static VALUE
+recvmsg_blocking(void *data)
+{
+    struct iomsg_arg *arg = data;
+    return recvmsg(arg->fd, &arg->msg, 0);
+}
+
+static VALUE
 unix_recv_io(int argc, VALUE *argv, VALUE sock)
 {
 #if defined(HAVE_RECVMSG) && (FD_PASSING_BY_MSG_CONTROL || FD_PASSING_BY_MSG_ACCRIGHTS)
     VALUE klass, mode;
     rb_io_t *fptr;
-    struct msghdr msg;
+    struct iomsg_arg arg;
     struct iovec vec[2];
     char buf[1];
 
@@ -2013,59 +2079,58 @@
 
     GetOpenFile(sock, fptr);
 
-    rb_io_wait_readable(fptr->fd);
+    arg.msg.msg_name = NULL;
+    arg.msg.msg_namelen = 0;
 
-    msg.msg_name = NULL;
-    msg.msg_namelen = 0;
-
     vec[0].iov_base = buf;
     vec[0].iov_len = sizeof(buf);
-    msg.msg_iov = vec;
-    msg.msg_iovlen = 1;
+    arg.msg.msg_iov = vec;
+    arg.msg.msg_iovlen = 1;
 
 #if FD_PASSING_BY_MSG_CONTROL
-    msg.msg_control = (caddr_t)&cmsg;
-    msg.msg_controllen = CMSG_SPACE(sizeof(int));
-    msg.msg_flags = 0;
+    arg.msg.msg_control = (caddr_t)&cmsg;
+    arg.msg.msg_controllen = CMSG_SPACE(sizeof(int));
+    arg.msg.msg_flags = 0;
     cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int));
     cmsg.hdr.cmsg_level = SOL_SOCKET;
     cmsg.hdr.cmsg_type = SCM_RIGHTS;
     *(int *)CMSG_DATA(&cmsg.hdr) = -1;
 #else
-    msg.msg_accrights = (caddr_t)&fd;
-    msg.msg_accrightslen = sizeof(fd);
+    arg.msg.msg_accrights = (caddr_t)&fd;
+    arg.msg.msg_accrightslen = sizeof(fd);
     fd = -1;
 #endif
 
-    if (recvmsg(fptr->fd, &msg, 0) == -1)
+    arg.fd = fptr->fd;
+    if ((int)BLOCKING_REGION(recvmsg_blocking, &arg) == -1)
 	rb_sys_fail("recvmsg(2)");
 
 #if FD_PASSING_BY_MSG_CONTROL
-    if (msg.msg_controllen != CMSG_SPACE(sizeof(int))) {
-      rb_raise(rb_eSocket,
-          "file descriptor was not passed (msg_controllen=%d, %d expected)",
-          msg.msg_controllen, CMSG_SPACE(sizeof(int)));
+    if (arg.msg.msg_controllen != CMSG_SPACE(sizeof(int))) {
+	rb_raise(rb_eSocket,
+		 "file descriptor was not passed (msg_controllen=%d, %d expected)",
+		 (int)arg.msg.msg_controllen, (int)CMSG_SPACE(sizeof(int)));
     }
     if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) {
-      rb_raise(rb_eSocket,
-          "file descriptor was not passed (cmsg_len=%d, %d expected)",
-          cmsg.hdr.cmsg_len, CMSG_LEN(sizeof(int)));
+	rb_raise(rb_eSocket,
+		 "file descriptor was not passed (cmsg_len=%d, %d expected)",
+		 (int)cmsg.hdr.cmsg_len, (int)CMSG_LEN(sizeof(int)));
     }
     if (cmsg.hdr.cmsg_level != SOL_SOCKET) {
-      rb_raise(rb_eSocket,
-          "file descriptor was not passed (cmsg_level=%d, %d expected)",
-          cmsg.hdr.cmsg_level, SOL_SOCKET);
+	rb_raise(rb_eSocket,
+		 "file descriptor was not passed (cmsg_level=%d, %d expected)",
+		 cmsg.hdr.cmsg_level, SOL_SOCKET);
     }
     if (cmsg.hdr.cmsg_type != SCM_RIGHTS) {
-      rb_raise(rb_eSocket,
-          "file descriptor was not passed (cmsg_type=%d, %d expected)",
-          cmsg.hdr.cmsg_type, SCM_RIGHTS);
+	rb_raise(rb_eSocket,
+		 "file descriptor was not passed (cmsg_type=%d, %d expected)",
+		 cmsg.hdr.cmsg_type, SCM_RIGHTS);
     }
 #else
-    if (msg.msg_accrightslen != sizeof(fd)) {
+    if (arg.msg.msg_accrightslen != sizeof(fd)) {
 	rb_raise(rb_eSocket,
-            "file descriptor was not passed (accrightslen) : %d != %d",
-            msg.msg_accrightslen, sizeof(fd));
+		 "file descriptor was not passed (accrightslen) : %d != %d",
+		 arg.msg.msg_accrightslen, (int)sizeof(fd));
     }
 #endif
 
@@ -3474,7 +3539,7 @@
     }
     if (sizeof(struct sockaddr_un) < RSTRING_LEN(addr)) {
 	rb_raise(rb_eTypeError, "too long sockaddr_un - %ld longer than %d",
-		 RSTRING_LEN(addr), sizeof(struct sockaddr_un));
+		 RSTRING_LEN(addr), (int)sizeof(struct sockaddr_un));
     }
     sun_path = unixpath(sockaddr, RSTRING_LEN(addr));
     if (sizeof(struct sockaddr_un) == RSTRING_LEN(addr) &&
Index: mvm/.merged-trunk-revision
===================================================================
--- mvm/.merged-trunk-revision	(revision 17907)
+++ mvm/.merged-trunk-revision	(revision 17908)
@@ -1 +1 @@
-17892
+17907
Index: mvm/version.h
===================================================================
--- mvm/version.h	(revision 17907)
+++ mvm/version.h	(revision 17908)
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.9.0"
-#define RUBY_RELEASE_DATE "2008-07-05"
+#define RUBY_RELEASE_DATE "2008-07-06"
 #define RUBY_VERSION_CODE 190
-#define RUBY_RELEASE_CODE 20080705
+#define RUBY_RELEASE_CODE 20080706
 #define RUBY_PATCHLEVEL 0
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 0
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 7
-#define RUBY_RELEASE_DAY 5
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
Index: mvm/test/win32ole/test_win32ole_type.rb
===================================================================
--- mvm/test/win32ole/test_win32ole_type.rb	(revision 17907)
+++ mvm/test/win32ole/test_win32ole_type.rb	(revision 17908)
@@ -30,7 +30,22 @@
       }
       ole_type = WIN32OLE_TYPE.new("Microsoft Shell Controls And Automation", "Shell")
       assert_instance_of(WIN32OLE_TYPE, ole_type)
-
+      assert_equal("Shell", ole_type.name)
+      assert_equal("Class", ole_type.ole_type)
+      assert_equal("{13709620-C279-11CE-A49E-444553540000}", ole_type.guid)
+      assert_equal("Shell.Application.1", ole_type.progid)
+      assert_equal(true, ole_type.visible?)
+      assert_equal("Shell", ole_type.to_s)
+      assert_equal(0, ole_type.major_version)
+      assert_equal(0, ole_type.minor_version)
+      assert_equal(5, ole_type.typekind)
+      assert_equal("Shell Object Type Information", ole_type.helpstring)
+      assert_equal(nil, ole_type.src_type)
+      assert_equal("", ole_type.helpfile)
+      assert_equal(0, ole_type.helpcontext)
+      assert_equal([], ole_type.variables)
+      assert(ole_type.ole_methods.select{|m|/NameSpace/i =~ m.name}.size > 0)
+      
       ole_type2 = WIN32OLE_TYPE.new("{13709620-C279-11CE-A49E-444553540000}", "Shell")
       assert_instance_of(WIN32OLE_TYPE, ole_type)
       assert_equal(ole_type.name, ole_type2.name)

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

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