diff options
author | Eric Wong <normalperson@yhbt.net> | 2010-01-07 00:37:57 -0800 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2010-01-07 01:15:05 -0800 |
commit | 40d61f55ac53e3cd2f229d0b032da03032e3d53d (patch) | |
tree | 4c57be5ba0dd0a9f1dff33bada0635188848e50b /test | |
parent | d8c8fb4155c1feea454abc3ed3f0a4b26e90be68 (diff) | |
download | ruby_posix_mq-40d61f55ac53e3cd2f229d0b032da03032e3d53d.tar.gz |
This is implementation uses both a short-lived POSIX thread and a pre-spawned Ruby Thread in a manner that works properly under both Ruby 1.8 (green threads) and 1.9 (where Ruby Threads are POSIX threads). The short-lived POSIX thread will write a single "\0" byte to a pipe the Ruby Thread waits on. This operation is atomic on all platforms. Once the Ruby Thread is woken up from the pipe, it will execute th block given to it. This dual-thread implementation is inspired by the way glibc implements mq_notify(3) + SIGEV_THREAD under Linux where the kernel itself cannot directly spawn POSIX threads.
Diffstat (limited to 'test')
-rw-r--r-- | test/test_posix_mq.rb | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/test/test_posix_mq.rb b/test/test_posix_mq.rb index dccc547..58ee6e5 100644 --- a/test/test_posix_mq.rb +++ b/test/test_posix_mq.rb @@ -1,6 +1,7 @@ # -*- encoding: binary -*- require 'test/unit' require 'posix_mq' +require 'thread' require 'fcntl' $stderr.sync = $stdout.sync = true @@ -238,4 +239,28 @@ class Test_POSIX_MQ < Test::Unit::TestCase assert POSIX_MQ::OPEN_MAX.kind_of?(Integer) end + def test_notify_block_replace + q = Queue.new + @mq = POSIX_MQ.new(@path, :rw) + assert_nothing_raised { @mq.notify { |mq| q << mq } } + @mq << "hi" + assert_equal POSIX_MQ, q.pop.class + assert_equal "hi", @mq.receive.first + assert_nothing_raised { @mq.notify { |mq| q << "hi" } } + @mq << "bye" + assert_equal "hi", q.pop + end + + def test_notify_thread + q = Queue.new + @mq = POSIX_MQ.new(@path, :rw) + @mq.notify_thread = thr = Thread.new { sleep } + assert thr.alive? + @mq.notify { |mq| q << Thread.current } + @mq << "." + x = q.pop + assert x.instance_of?(Thread) + assert Thread.current != x + assert ! thr.alive? + end end |