vmsplice: more consistent fileno retry handling
authorEric Wong <normalperson@yhbt.net>
Sat, 19 Jan 2013 08:10:23 +0000 (19 08:10 +0000)
committerEric Wong <normalperson@yhbt.net>
Sat, 19 Jan 2013 08:10:23 +0000 (19 08:10 +0000)
While vmsplice is hardly useful, its FD-closed-while-GVL-less
handling should be as good as our splice and tee wrappers.

ext/io_splice/io_splice_ext.c

index 876d07d..e429266 100644 (file)
@@ -493,6 +493,7 @@ static VALUE my_vmsplice(int argc, VALUE * argv, VALUE self)
        ssize_t left;
        struct vmsplice_args a;
        struct iovec iov;
+       ssize_t n;
 
        VALUE io, data, flags;
 
@@ -513,21 +514,19 @@ static VALUE my_vmsplice(int argc, VALUE * argv, VALUE self)
                         "(expected a String or Array of strings)",
                         rb_obj_classname(data));
        }
-       a.fd = my_fileno(io);
+
        a.flags = NIL_P(flags) ? 0 : NUM2UINT(flags);
 
        for (;;) {
-               ssize_t n = (ssize_t)io_run(nogvl_vmsplice, &a);
+               a.fd = check_fileno(io);
+               n = (ssize_t)io_run(nogvl_vmsplice, &a);
 
                if (n == -1) {
                        if (errno == EAGAIN) {
-                               if (a.flags & SPLICE_F_NONBLOCK) {
+                               if (a.flags & SPLICE_F_NONBLOCK)
                                        rb_sys_fail("vmsplice");
-                               } else {
-                                       a.fd = check_fileno(io);
-                                       if (rb_io_wait_writable(a.fd))
-                                               continue;
-                               }
+                               if (rb_io_wait_writable(check_fileno(io)))
+                                       continue;
                                /* fall through on error */
                        }
                        /*
@@ -537,10 +536,8 @@ static VALUE my_vmsplice(int argc, VALUE * argv, VALUE self)
                         */
                        if (rv > 0)
                                break;
-                       if (errno == EINTR) {
-                               a.fd = check_fileno(io);
+                       if (errno == EINTR)
                                continue;
-                       }
                        rb_sys_fail("vmsplice");
                }