Rework console to use rb_io_wait.

This commit is contained in:
Samuel Williams 2020-09-14 12:17:11 +12:00
parent 8eea66a0ca
commit 7fca274198
Notes: git 2020-09-14 13:44:35 +09:00
2 changed files with 31 additions and 31 deletions

View File

@ -513,44 +513,44 @@ console_getch(int argc, VALUE *argv, VALUE io)
int w, len; int w, len;
char buf[8]; char buf[8];
wint_t wbuf[2]; wint_t wbuf[2];
struct timeval *to = NULL, tv; VALUE timeout = Qnil;
GetOpenFile(io, fptr); GetOpenFile(io, fptr);
if (optp) { if (optp) {
if (optp->vtime) { if (optp->vtime) {
to = &tv; struct timeval tv;
tv.tv_sec = optp->vtime / 10; tv.tv_sec = optp->vtime / 10;
tv.tv_usec = (optp->vtime % 10) * 100000; tv.tv_usec = (optp->vtime % 10) * 100000;
} timeout = rb_scheduler_timeout(&tv);
if (optp->vmin != 1) { }
rb_warning("min option ignored"); 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 (optp->intr) {
if (w < 0) rb_eof_error(); VALUE result = RB_NUM2INT(rb_io_wait(io, RUBY_IO_READABLE, timeout));
if (!(w & RB_WAITFD_IN)) return Qnil; if (result == Qfalse) return Qnil;
} }
else { else {
rb_warning("vtime option ignored if intr flag is unset"); 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); len = (int)(VALUE)rb_thread_call_without_gvl(nogvl_getch, wbuf, RUBY_UBF_IO, 0);
switch (len) { switch (len) {
case 0: case 0:
return Qnil; return Qnil;
case 2: case 2:
buf[0] = (char)wbuf[0]; buf[0] = (char)wbuf[0];
c = wbuf[1]; c = wbuf[1];
len = 1; len = 1;
do { do {
buf[len++] = (unsigned char)c; buf[len++] = (unsigned char)c;
} while ((c >>= CHAR_BIT) && len < (int)sizeof(buf)); } while ((c >>= CHAR_BIT) && len < (int)sizeof(buf));
return rb_str_new(buf, len); return rb_str_new(buf, len);
default: default:
c = wbuf[0]; c = wbuf[0];
len = rb_uv_to_utf8(buf, c); len = rb_uv_to_utf8(buf, c);
str = rb_utf8_str_new(buf, len); str = rb_utf8_str_new(buf, len);
return rb_str_conv_enc(str, NULL, rb_default_external_encoding()); return rb_str_conv_enc(str, NULL, rb_default_external_encoding());
} }
#endif #endif
} }

View File

@ -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); 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); ssize_t rb_io_bufwrite(VALUE io, const void *buf, size_t size);
int rb_io_wait_readable(int); int rb_io_wait_readable(int fd);
int rb_io_wait_writable(int); int rb_io_wait_writable(int fd);
int rb_wait_for_single_fd(int fd, int events, struct timeval *tv); int rb_wait_for_single_fd(int fd, int events, struct timeval *tv);
VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout); VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout);