Project

General

Profile

Actions

Bug #12924

closed

Fiddle::TestFunction#test_nogvl_poll fails on macOS 10.12-10.12.1 Sierra

Added by kimuraw (Wataru Kimura) over 7 years ago. Updated about 7 years ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.0dev (2016-11-12 trunk 56725) [x86_64-darwin16]
[ruby-dev:49871]

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

Also available in: Atom PDF

Like0
Like0Like0Like0Like0