1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

spec/ruby/optional/capi/io_spec.rb: fix fragile spec from unpredictable errno

rb_io_wait_readable and rb_io_wait_writable depend on the TSD
errno value.  Due to the recent changes in r64352-r64353 to
restructure GVL, errno could be set to EAGAIN from the signal
self-pipe and cause the rb_io_wait_readable spec to block
unexpectedly.  This should fix rubyspec timeouts on Solaris:

  http://rubyci.s3.amazonaws.com/unstable11s/ruby-trunk/log/20180814T042506Z.fail.html.gz

* spec/ruby/optional/capi/ext/io_spec.c: add errno= setter method
* spec/ruby/optional/capi/io_spec.rb: set errno to appropriate values for tests

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64359 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-08-14 17:07:36 +00:00
parent 37279d1546
commit 17ed23bb6d
2 changed files with 16 additions and 0 deletions

View file

@ -218,6 +218,17 @@ VALUE io_spec_rb_io_close(VALUE self, VALUE io) {
}
#endif
/*
* this is needed to ensure rb_io_wait_*able functions behave
* predictably because errno may be set to unexpected values
* otherwise.
*/
static VALUE io_spec_errno_set(VALUE self, VALUE val) {
int e = NUM2INT(val);
errno = e;
return val;
}
void Init_io_spec(void) {
VALUE cls = rb_define_class("CApiIOSpecs", rb_cObject);
@ -296,6 +307,8 @@ void Init_io_spec(void) {
#ifdef HAVE_RB_CLOEXEC_OPEN
rb_define_method(cls, "rb_cloexec_open", io_spec_rb_cloexec_open, 3);
#endif
rb_define_method(cls, "errno=", io_spec_errno_set, 1);
}
#ifdef __cplusplus

View file

@ -236,6 +236,7 @@ describe "C-API IO function" do
describe "rb_io_wait_writable" do
it "returns false if there is no error condition" do
@o.errno = 0
@o.rb_io_wait_writable(@w_io).should be_false
end
@ -254,6 +255,7 @@ describe "C-API IO function" do
platform_is_not :windows do
describe "rb_io_wait_readable" do
it "returns false if there is no error condition" do
@o.errno = 0
@o.rb_io_wait_readable(@r_io, false).should be_false
end
@ -271,6 +273,7 @@ describe "C-API IO function" do
@w_io.write "rb_io_wait_readable"
end
@o.errno = Errno::EAGAIN.new.errno
@o.rb_io_wait_readable(@r_io, true).should be_true
@o.instance_variable_get(:@read_data).should == "rb_io_wait_re"