From: kimuraw@... Date: 2016-11-12T01:04:23+00:00 Subject: [ruby-dev:49872] [Ruby trunk Bug#12924] Fiddle::TestFunction#test_nogvl_poll fails on macOS 10.12-10.12.1 Sierra Issue #12924 has been updated by Wataru Kimura. Subject changed from Fiddle::TestFunction#test_nogvl_poll fails on macOS 10.12 Sierra to Fiddle::TestFunction#test_nogvl_poll fails on macOS 10.12-10.12.1 Sierra @hsbtさんから教えてもらったのですが、10.12.2 betaで直っているようです。 私の手元でも確認しました。 Third Party's Issueで閉じてもらってもよいでしょうか。 ~~~ % sw_vers ProductName: Mac OS X ProductVersion: 10.12.2 BuildVersion: 16C41b % ruby2.4 poll_sierra.rb ruby 2.4.0preview3 (2016-11-07 trunk 56661) [x86_64-darwin16] Darwin 16.3.0 fds=7, nfds=0, slept=206 fds=7, nfds=1, slept=206 fds=(nil), nfds=0, slept=206 # Fixed! fds=(nil), nfds=1, slept=0 ~~~ ---------------------------------------- Bug #12924: Fiddle::TestFunction#test_nogvl_poll fails on macOS 10.12-10.12.1 Sierra https://bugs.ruby-lang.org/issues/12924#change-61458 * Author: Wataru Kimura * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.4.0dev (2016-11-12 trunk 56725) [x86_64-darwin16] * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- macOS 10.12.1上でFiddle::TestFunction#test_nogvl_pollが失敗します。OS X 10.11では問題ありません。 2.4-preview3およびtrunk(r56725)で確認しました。 ~~~ 1) Failure: Fiddle::TestFunction#test_nogvl_poll [/.../ruby-2.4.0-preview3/test/fiddle/test_function.rb:91]: slept correct amount of time. Expected |200 - 0| (200) to be <= 100. ~~~ おそらくruby側の問題ではなく、poll(2)の動作が10.12で変わったようです。 pollへ渡したnfdsの値が0のとき、待たずにすぐ抜けてしまいます。 参考: https://github.com/curl/curl/issues/1057 opensource.apple.comにはまだ10.12のソースコードが上がっていないため 実際にpollが変更されたかは確認できていません。 以下のコードで確認してみました。 ~~~ ruby require 'fiddle/import' require 'tempfile' include Fiddle libc = dlopen('/usr/lib/libc.dylib') @func = Function.new(libc['poll'], [TYPE_VOIDP, TYPE_INT, TYPE_INT], TYPE_INT) def test_poll(fds, nfds) t0 = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond) n1 = @func.call(fds&.to_ptr, nfds, 200) t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond) puts "fd=#{fds ? fds.fd : "(nil)"}, nfds=#{nfds}, slept=#{t1 - t0}" end fds = Fiddle::Importer.struct(["int fd", "short events", "short revents"]).malloc file = Tempfile.open('test_poll') begin fds.fd = file.fileno fds.events = 0 fds.revents = 0 puts RUBY_DESCRIPTION puts `uname -sr`.chomp test_poll(fds, 0) # not block on macOS Sierra test_poll(fds, 1) test_poll(nil, 0) # not block on macOS Sierra test_poll(nil, 1) ensure file.unlink end ~~~ 結果は次の通りです。 ~~~ # trunk on 10.12 Sierra ruby 2.4.0dev (2016-11-12 trunk 56725) [x86_64-darwin16] Darwin 16.1.0 fd=7, nfds=0, slept=0 ### fd=7, nfds=1, slept=201 fd=(nil), nfds=0, slept=0 ### fd=(nil), nfds=1, slept=0 # 2.4-preview3 on 10.12 Sierra ruby 2.4.0preview3 (2016-11-07 trunk 56661) [x86_64-darwin16] Darwin 16.1.0 fd=7, nfds=0, slept=0 ### fd=7, nfds=1, slept=205 fd=(nil), nfds=0, slept=0 ### fd=(nil), nfds=1, slept=0 # 2.4-preview3 on 10.11 El Capitan ruby 2.4.0preview3 (2016-11-07 trunk 56661) [x86_64-darwin15] Darwin 15.6.0 fd=7, nfds=0, slept=206 ### fd=7, nfds=1, slept=206 fd=(nil), nfds=0, slept=206 ### fd=(nil), nfds=1, slept=0 ~~~ -- https://bugs.ruby-lang.org/