Actions
Bug #12924
closedFiddle::TestFunction#test_nogvl_poll fails on macOS 10.12-10.12.1 Sierra
Status:
Third Party's Issue
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.0dev (2016-11-12 trunk 56725) [x86_64-darwin16]
Description
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が変更されたかは確認できていません。
以下のコードで確認してみました。
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
Actions
Like0
Like0Like0Like0Like0