mirror of
https://github.com/ruby/ruby.git
synced 2025-09-18 10:03:59 +02:00
merge revision(s) 611e711085c7e3984555a79626d025c8b876eced,a9c5c2d614f30a616970245fef3e7ffc151e2ecf: [Backport #17527]
Test incorrect behaviour of `rb_io_wait_readable/writable`. --- test/fiber/test_io.rb | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) Check errno before invoking scheduler in `rb_io_wait_readable/writable`. See <https://bugs.ruby-lang.org/issues/17527> for more details. --- io.c | 66 +++++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 31 deletions(-)
This commit is contained in:
parent
5a9b5b8e95
commit
13f93ad16d
3 changed files with 74 additions and 33 deletions
30
io.c
30
io.c
|
@ -1306,14 +1306,11 @@ rb_io_from_fd(int fd)
|
||||||
int
|
int
|
||||||
rb_io_wait_readable(int f)
|
rb_io_wait_readable(int f)
|
||||||
{
|
{
|
||||||
VALUE scheduler = rb_scheduler_current();
|
VALUE scheduler;
|
||||||
if (scheduler != Qnil) {
|
|
||||||
return RTEST(
|
|
||||||
rb_scheduler_io_wait_readable(scheduler, rb_io_from_fd(f))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
io_fd_check_closed(f);
|
io_fd_check_closed(f);
|
||||||
|
|
||||||
|
scheduler = rb_scheduler_current();
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case EINTR:
|
case EINTR:
|
||||||
#if defined(ERESTART)
|
#if defined(ERESTART)
|
||||||
|
@ -1326,7 +1323,13 @@ rb_io_wait_readable(int f)
|
||||||
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
||||||
case EWOULDBLOCK:
|
case EWOULDBLOCK:
|
||||||
#endif
|
#endif
|
||||||
|
if (scheduler != Qnil) {
|
||||||
|
return RTEST(
|
||||||
|
rb_scheduler_io_wait_readable(scheduler, rb_io_from_fd(f))
|
||||||
|
);
|
||||||
|
} else {
|
||||||
rb_thread_wait_fd(f);
|
rb_thread_wait_fd(f);
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1337,14 +1340,11 @@ rb_io_wait_readable(int f)
|
||||||
int
|
int
|
||||||
rb_io_wait_writable(int f)
|
rb_io_wait_writable(int f)
|
||||||
{
|
{
|
||||||
VALUE scheduler = rb_scheduler_current();
|
VALUE scheduler;
|
||||||
if (scheduler != Qnil) {
|
|
||||||
return RTEST(
|
|
||||||
rb_scheduler_io_wait_writable(scheduler, rb_io_from_fd(f))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
io_fd_check_closed(f);
|
io_fd_check_closed(f);
|
||||||
|
|
||||||
|
scheduler = rb_scheduler_current();
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case EINTR:
|
case EINTR:
|
||||||
#if defined(ERESTART)
|
#if defined(ERESTART)
|
||||||
|
@ -1366,7 +1366,13 @@ rb_io_wait_writable(int f)
|
||||||
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
||||||
case EWOULDBLOCK:
|
case EWOULDBLOCK:
|
||||||
#endif
|
#endif
|
||||||
|
if (scheduler != Qnil) {
|
||||||
|
return RTEST(
|
||||||
|
rb_scheduler_io_wait_writable(scheduler, rb_io_from_fd(f))
|
||||||
|
);
|
||||||
|
} else {
|
||||||
rb_thread_fd_writable(f);
|
rb_thread_fd_writable(f);
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -62,4 +62,39 @@ class TestFiberIO < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
end.each(&:join)
|
end.each(&:join)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_epipe_on_read
|
||||||
|
skip "UNIXSocket is not defined!" unless defined?(UNIXSocket)
|
||||||
|
|
||||||
|
i, o = UNIXSocket.pair
|
||||||
|
|
||||||
|
unless i.nonblock? && o.nonblock?
|
||||||
|
i.close
|
||||||
|
o.close
|
||||||
|
skip "I/O is not non-blocking!"
|
||||||
|
end
|
||||||
|
|
||||||
|
error = nil
|
||||||
|
|
||||||
|
thread = Thread.new do
|
||||||
|
scheduler = Scheduler.new
|
||||||
|
Fiber.set_scheduler scheduler
|
||||||
|
|
||||||
|
Fiber.schedule do
|
||||||
|
begin
|
||||||
|
i.close
|
||||||
|
o.write(MESSAGE)
|
||||||
|
rescue => error
|
||||||
|
# Saved into error.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
thread.join
|
||||||
|
|
||||||
|
i.close
|
||||||
|
o.close
|
||||||
|
|
||||||
|
assert_kind_of Errno::EPIPE, error
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
|
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
|
||||||
#define RUBY_VERSION_TEENY 2
|
#define RUBY_VERSION_TEENY 2
|
||||||
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
|
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
|
||||||
#define RUBY_PATCHLEVEL 71
|
#define RUBY_PATCHLEVEL 72
|
||||||
|
|
||||||
#define RUBY_RELEASE_YEAR 2021
|
#define RUBY_RELEASE_YEAR 2021
|
||||||
#define RUBY_RELEASE_MONTH 4
|
#define RUBY_RELEASE_MONTH 4
|
||||||
#define RUBY_RELEASE_DAY 18
|
#define RUBY_RELEASE_DAY 24
|
||||||
|
|
||||||
#include "ruby/version.h"
|
#include "ruby/version.h"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue