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/