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

ruby-changes:62927

From: Samuel <ko1@a...>
Date: Mon, 14 Sep 2020 13:44:39 +0900 (JST)
Subject: [ruby-changes:62927] 7fca274198 (master): Rework console to use `rb_io_wait`.

https://git.ruby-lang.org/ruby.git/commit/?id=7fca274198

From 7fca27419846f76f978f3bbef2d2db3e1bf688e7 Mon Sep 17 00:00:00 2001
From: Samuel Williams <samuel.williams@o...>
Date: Mon, 14 Sep 2020 12:17:11 +1200
Subject: Rework console to use `rb_io_wait`.


diff --git a/ext/io/console/console.c b/ext/io/console/console.c
index 64f795d..76253ee 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -513,44 +513,44 @@ console_getch(int argc, VALUE *argv, VALUE io) https://github.com/ruby/ruby/blob/trunk/ext/io/console/console.c#L513
     int w, len;
     char buf[8];
     wint_t wbuf[2];
-    struct timeval *to = NULL, tv;
+    VALUE timeout = Qnil;
 
     GetOpenFile(io, fptr);
     if (optp) {
-	if (optp->vtime) {
-	    to = &tv;
-	    tv.tv_sec = optp->vtime / 10;
-	    tv.tv_usec = (optp->vtime % 10) * 100000;
-	}
-	if (optp->vmin != 1) {
-	    rb_warning("min option ignored");
-	}
-	if (optp->intr) {
-	    w = rb_wait_for_single_fd(fptr->fd, RB_WAITFD_IN, to);
-	    if (w < 0) rb_eof_error();
-	    if (!(w & RB_WAITFD_IN)) return Qnil;
-	}
-	else {
-	    rb_warning("vtime option ignored if intr flag is unset");
-	}
+        if (optp->vtime) {
+            struct timeval tv;
+            tv.tv_sec = optp->vtime / 10;
+            tv.tv_usec = (optp->vtime % 10) * 100000;
+            timeout = rb_scheduler_timeout(&tv);
+        }
+        if (optp->vmin != 1) {
+            rb_warning("min option ignored");
+        }
+        if (optp->intr) {
+            VALUE result = RB_NUM2INT(rb_io_wait(io, RUBY_IO_READABLE, timeout));
+            if (result == Qfalse) return Qnil;
+        }
+        else {
+            rb_warning("vtime option ignored if intr flag is unset");
+        }
     }
     len = (int)(VALUE)rb_thread_call_without_gvl(nogvl_getch, wbuf, RUBY_UBF_IO, 0);
     switch (len) {
       case 0:
-	return Qnil;
+        return Qnil;
       case 2:
-	buf[0] = (char)wbuf[0];
-	c = wbuf[1];
-	len = 1;
-	do {
-	    buf[len++] = (unsigned char)c;
-	} while ((c >>= CHAR_BIT) && len < (int)sizeof(buf));
-	return rb_str_new(buf, len);
+        buf[0] = (char)wbuf[0];
+        c = wbuf[1];
+        len = 1;
+        do {
+            buf[len++] = (unsigned char)c;
+        } while ((c >>= CHAR_BIT) && len < (int)sizeof(buf));
+        return rb_str_new(buf, len);
       default:
-	c = wbuf[0];
-	len = rb_uv_to_utf8(buf, c);
-	str = rb_utf8_str_new(buf, len);
-	return rb_str_conv_enc(str, NULL, rb_default_external_encoding());
+        c = wbuf[0];
+        len = rb_uv_to_utf8(buf, c);
+        str = rb_utf8_str_new(buf, len);
+        return rb_str_conv_enc(str, NULL, rb_default_external_encoding());
     }
 #endif
 }
diff --git a/include/ruby/io.h b/include/ruby/io.h
index 19b2036..a3de95f 100644
--- a/include/ruby/io.h
+++ b/include/ruby/io.h
@@ -154,8 +154,8 @@ int rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding ** https://github.com/ruby/ruby/blob/trunk/include/ruby/io.h#L154
 void rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, int *oflags_p, int *fmode_p, rb_io_enc_t *convconfig_p);
 ssize_t rb_io_bufwrite(VALUE io, const void *buf, size_t size);
 
-int rb_io_wait_readable(int);
-int rb_io_wait_writable(int);
+int rb_io_wait_readable(int fd);
+int rb_io_wait_writable(int fd);
 int rb_wait_for_single_fd(int fd, int events, struct timeval *tv);
 
 VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout);
-- 
cgit v0.10.2


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

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