diff options
-rw-r--r-- | ext/sleepy_penguin/kqueue.c | 6 | ||||
-rw-r--r-- | test/test_kqueue.rb | 1 |
2 files changed, 6 insertions, 1 deletions
diff --git a/ext/sleepy_penguin/kqueue.c b/ext/sleepy_penguin/kqueue.c index 430bc88..d7e8d8e 100644 --- a/ext/sleepy_penguin/kqueue.c +++ b/ext/sleepy_penguin/kqueue.c @@ -110,6 +110,7 @@ static VALUE s_new(VALUE klass) { VALUE rv; int fd = kqueue(); + int flags; if (fd < 0) { /* @@ -122,9 +123,12 @@ static VALUE s_new(VALUE klass) rb_sys_fail("kqueue"); } + flags = fcntl(fd, F_GETFD); + if (flags != -1) + fcntl(fd, F_SETFD, flags | FD_CLOEXEC); + rv = INT2FIX(fd); - /* This will set FD_CLOEXEC on Ruby 2.0.0+: */ return rb_call_super(1, &rv); } diff --git a/test/test_kqueue.rb b/test/test_kqueue.rb index ae3203d..9d853c1 100644 --- a/test/test_kqueue.rb +++ b/test/test_kqueue.rb @@ -6,6 +6,7 @@ class TestKqueue < Test::Unit::TestCase def test_kqueue kq = Kqueue.new assert_kind_of IO, kq.to_io + assert_predicate kq.to_io, :close_on_exec? rd, wr = IO.pipe ev = Kevent[rd.fileno, EvFilt::READ, Ev::ADD|Ev::ONESHOT, 0, 0, rd] thr = Thread.new do |