diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-14 12:17:11 +1200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-14 16:44:09 +1200 |
commit | 7fca27419846f76f978f3bbef2d2db3e1bf688e7 (patch) | |
tree | 51bed41b7a54b1bdd40a236c88e4815be4bd3634 | |
parent | 8eea66a0ca8965ae8319b4c404f61c4d46866f64 (diff) | |
download | ruby-7fca27419846f76f978f3bbef2d2db3e1bf688e7.tar.gz |
Rework console to use `rb_io_wait`.
-rw-r--r-- | ext/io/console/console.c | 58 | ||||
-rw-r--r-- | include/ruby/io.h | 4 |
2 files changed, 31 insertions, 31 deletions
diff --git a/ext/io/console/console.c b/ext/io/console/console.c index 64f795d3bc..76253ee3d0 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) 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 19b2036a86..a3de95f281 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 ** 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); |