diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-02-12 05:44:23 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-02-12 05:44:23 +0000 |
commit | 58b325366dbc5c84be12fb336ee5e68f208d9365 (patch) | |
tree | e76cc28208f340b4fa1f1a126f35e5953f56e27a /ext | |
parent | dda8de065c1c7691ec8627d3024a61f324bc9f73 (diff) |
* thread.c (rb_thread_io_blocking_region): new function to run
blocking region with GIL released, for fd.
* thread.c (rb_thread_fd_close): implement. [ruby-core:35203]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30852 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r-- | ext/socket/basicsocket.c | 2 | ||||
-rw-r--r-- | ext/socket/init.c | 6 | ||||
-rw-r--r-- | ext/socket/rubysocket.h | 1 | ||||
-rw-r--r-- | ext/socket/udpsocket.c | 2 | ||||
-rw-r--r-- | ext/socket/unixsocket.c | 4 |
5 files changed, 8 insertions, 7 deletions
diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c index e744ad27d3..aa99041664 100644 --- a/ext/socket/basicsocket.c +++ b/ext/socket/basicsocket.c @@ -559,7 +559,7 @@ rsock_bsock_send(int argc, VALUE *argv, VALUE sock) arg.fd = fptr->fd; arg.flags = NUM2INT(flags); while (rb_thread_fd_writable(arg.fd), - (n = (int)BLOCKING_REGION(func, &arg)) < 0) { + (n = (int)BLOCKING_REGION_FD(func, &arg)) < 0) { if (rb_io_wait_writable(arg.fd)) { continue; } diff --git a/ext/socket/init.c b/ext/socket/init.c index ebc9031150..8fa907f1dc 100644 --- a/ext/socket/init.c +++ b/ext/socket/init.c @@ -129,7 +129,7 @@ rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from) while (rb_io_check_closed(fptr), rb_thread_wait_fd(arg.fd), - (slen = BLOCKING_REGION(recvfrom_blocking, &arg)) < 0) { + (slen = BLOCKING_REGION_FD(recvfrom_blocking, &arg)) < 0) { if (!rb_io_wait_readable(fptr->fd)) { rb_sys_fail("recvfrom(2)"); } @@ -380,7 +380,7 @@ rsock_connect(int fd, const struct sockaddr *sockaddr, int len, int socks) if (socks) func = socks_connect_blocking; #endif for (;;) { - status = (int)BLOCKING_REGION(func, &arg); + status = (int)BLOCKING_REGION_FD(func, &arg); if (status < 0) { switch (errno) { case EAGAIN: @@ -515,7 +515,7 @@ rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len) arg.len = len; retry: rb_thread_wait_fd(fd); - fd2 = (int)BLOCKING_REGION(accept_blocking, &arg); + fd2 = (int)BLOCKING_REGION_FD(accept_blocking, &arg); if (fd2 < 0) { switch (errno) { case EMFILE: diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h index 60ac25fbbd..a80c93e1fd 100644 --- a/ext/socket/rubysocket.h +++ b/ext/socket/rubysocket.h @@ -197,6 +197,7 @@ int Rconnect(); #include "constdefs.h" #define BLOCKING_REGION(func, arg) (long)rb_thread_blocking_region((func), (arg), RUBY_UBF_IO, 0) +#define BLOCKING_REGION_FD(func, arg) (long)rb_thread_io_blocking_region((func), (arg), (arg)->fd) #define SockAddrStringValue(v) rsock_sockaddr_string_value(&(v)) #define SockAddrStringValuePtr(v) rsock_sockaddr_string_value_ptr(&(v)) diff --git a/ext/socket/udpsocket.c b/ext/socket/udpsocket.c index b278523eba..bd62d89872 100644 --- a/ext/socket/udpsocket.c +++ b/ext/socket/udpsocket.c @@ -177,7 +177,7 @@ udp_send(int argc, VALUE *argv, VALUE sock) arg.to = res->ai_addr; arg.tolen = res->ai_addrlen; rb_thread_fd_writable(arg.fd); - n = (int)BLOCKING_REGION(rsock_sendto_blocking, &arg); + n = (int)BLOCKING_REGION_FD(rsock_sendto_blocking, &arg); if (n >= 0) { freeaddrinfo(res0); return INT2FIX(n); diff --git a/ext/socket/unixsocket.c b/ext/socket/unixsocket.c index 25a2c1e331..5a8641acc2 100644 --- a/ext/socket/unixsocket.c +++ b/ext/socket/unixsocket.c @@ -249,7 +249,7 @@ unix_send_io(VALUE sock, VALUE val) arg.fd = fptr->fd; rb_thread_fd_writable(arg.fd); - if ((int)BLOCKING_REGION(sendmsg_blocking, &arg) == -1) + if ((int)BLOCKING_REGION_FD(sendmsg_blocking, &arg) == -1) rb_sys_fail("sendmsg(2)"); return Qnil; @@ -335,7 +335,7 @@ unix_recv_io(int argc, VALUE *argv, VALUE sock) arg.fd = fptr->fd; rb_thread_wait_fd(arg.fd); - if ((int)BLOCKING_REGION(recvmsg_blocking, &arg) == -1) + if ((int)BLOCKING_REGION_FD(recvmsg_blocking, &arg) == -1) rb_sys_fail("recvmsg(2)"); #if FD_PASSING_BY_MSG_CONTROL |