From b6d82cdeff1ea2822c2911adf61d6a00538ecba8 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 23 Feb 2011 20:11:18 +0000 Subject: test for alarm() working properly to interrupt Some systems without mq_timedsend/mq_timedreceive need to use alarm() or similar (setitimer()) to interrupt timed-out mq_send/mq_receive calls, so we need to handle EINTR properly. --- test/test_posix_mq.rb | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/test_posix_mq.rb b/test/test_posix_mq.rb index e58a212..3dcaa90 100644 --- a/test/test_posix_mq.rb +++ b/test/test_posix_mq.rb @@ -96,6 +96,34 @@ class Test_POSIX_MQ < Test::Unit::TestCase assert elapsed < 1.10, elapsed.inspect end + def test_alarm_signal_safe + alarm = nil + libcs = %w(/lib/libc-2.7.so /usr/lib/libc.sl) + libcs.each do |libc| + if File.readable?(libc) + require "dl" + libc = DL.dlopen libc + alarm = libc["alarm", "II"] + break + end + end + alarm or return warn "alarm() not found in #{libcs.inspect}" + alarms = 0 + trap("ALRM") { alarms += 1 } + interval = 1 + alarm[interval] + @mq = POSIX_MQ.new(@path, :rw) + assert ! @mq.nonblock? + t0 = Time.now + a = nil + assert_raises(Errno::EINTR) { a = @mq.receive } + elapsed = Time.now - t0 + assert_nil a + assert elapsed >= interval, elapsed.inspect + assert elapsed < 1.10, elapsed.inspect + assert_equal 1, alarms + end + def test_timed_send interval = 0.01 @mq = POSIX_MQ.new(@path, :rw, 0666, POSIX_MQ::Attr[0, 1, 1, 0]) -- cgit v1.2.3-24-ge0c7