1 # -*- encoding: binary -*-
4 # version of POSIX_MQ, currently 0.6.0
7 # An analogous Struct to "struct mq_attr" in C.
8 # This may be used in arguments for POSIX_MQ.new and
9 # POSIX_MQ#attr=. POSIX_MQ#attr returns an instance
12 # See the mq_getattr(3) manpage for more information on the values.
13 Attr = Struct.new(:flags, :maxmsg, :msgsize, :curmsgs)
15 # Opens a POSIX message queue and performs operations on the
16 # given block, closing the message queue at exit.
17 # All all arguments are passed to POSIX_MQ.new.
20 block_given? or return mq
24 mq.close unless mq.closed?
28 # Executes the given block upon reception of the next message in an
29 # empty queue. If the message queue is not empty, then this block
30 # will only be fired after the queue is emptied and repopulated with
33 # This block will only be executed upon the arrival of the
34 # first message and must be reset/reenabled for subsequent
35 # notifications. This block will execute in a separate Ruby
36 # Thread (and thus will safely have the GVL by default).
38 # This method is only supported on platforms that implement
39 # SIGEV_THREAD functionality in mq_notify(3). So far we only
40 # know of glibc + Linux supporting this. Please let us
41 # know if your platform can support this functionality and
42 # are willing to test for us <ruby.posix.mq@librelist.com>
45 raise ArgumentError, "arity of notify block must be 1"
47 self.notify_exec(w, Thread.new(r, w, self) do |r, w, mq|
50 r.read(1) or raise Errno::EINTR
51 rescue Errno::EINTR, Errno::EAGAIN
62 end if RUBY_PLATFORM =~ /linux/
64 # There's no point in ever duping a POSIX_MQ object.
65 # All send/receive operations are atomic and only one
66 # native thread may be notified at a time
71 # There's no point in ever cloning a POSIX_MQ object.
72 # All send/receive operations are atomic and only one
73 # native thread may be notified at a time
78 require 'posix_mq_ext'