Date | Commit message (Collapse) |
|
There's no point in wasting cycles releasing and reacquiring
a lock when we know we won't block. Since most non-blocking
users are expected to be single/few-threaded processes, this
will likely help them.
|
|
We still need to explicitly free the pointer we're given, and
not just close the associated file descriptor. Fortunately most
people to not spend all day opening/closing message queue
descriptors so this leak may not be noticeable.
|
|
It's Rubinius-specific and we use rb_str_resize
there anyways...
|
|
It's not needed since the native thread will retry in the
unlikely case of EINTR/EAGAIN. And writing one byte to a pipe
that's guaranteed by POSIX to be at least 512 bytes is highly
unlikely.
It's also bad because F_SETFL takes the big kernel lock under
Linux (and possibly other systems), and doing it unnecessarily
is a waste of system cycles.
|
|
Most used open modes are well under INT_MAX, however
|
|
This acts like POSIX_MQ#receive but only returns the message
without the priority.
|
|
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.
|
|
The POSIX manpages specify the return values of all
mq_* functions besides mq_open(3) to be "int", not "mqd_t".
|
|
FreeBSD implements an __mq_oshandle(mqd_t mqd) function
to convert mqd_t to integer file descriptors.
|
|
FreeBSD seems to need some files explicitly included.
|
|
"mq.notify = false" also works now, doing what
"mq.notify = nil" used to do (using SIGEV_NONE).
I was confused by SIGEV_NONE usage vs using a NULL pointer for
the notification passed mq_notify(3). SIGEV_NONE does not
actually unregister, it registers a no-op notification which
prevents other processes from taking us.
This also fixes the test case to pass under both Linux and
FreeBSD.
|
|
|