/** * D header file for Posix Message Queues * * Defines external functions required to manage Posix Message Queues * * mq_open(3) open a message queue * mq_close(3) close a message queue * mq_unlink(3) remove a message queue * mq_send(3) send a message * mq_receive(3) receive a message * mq_timedsend(3) send a message with a timeout (linux specific) * mq_timedreceive(3) receive a message with a timeout (linux specific) * mq_getattr(3) get message queue attributes * mq_setattr(3) set message queue attributes * mq_notify(3) register asynchronous notify * * Copyright: Copyright (c) 2016 sociomantic labs. All rights reserved * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). * Authors: Andreas Bok Andersen, Mathias Lang * Standards: POSIX.1-2001. * See_Also: $(HTTP pubs.opengroup.org/onlinepubs/9699919799/basedefs/mqueue.h.html, Standard) * Source: $(DRUNTIMESRC core/sys/posix/mqueue.d) */ module core.sys.posix.mqueue; import core.sys.posix.config; import core.sys.posix.signal; import core.sys.posix.time; version (Posix): version (CRuntime_Glibc): extern (C): @nogc nothrow: @system: /// Message queue descriptor. alias int mqd_t; /** * Used in getting and setting the attributes of a message queue. */ struct mq_attr { /// Message queue flags. c_long mq_flags; /// Maximum number of messages. c_long mq_maxmsg; /// Maximum message size. c_long mq_msgsize; /// Number of messages currently queued. c_long mq_curmsgs; } /** * Establish connection between a process and a message queue `name`. * * Note: * Linux prototypes are: * mqd_t mq_open (const(char)* name, int oflag); * mqd_t mq_open (const(char)* name, int oflag, mode_t mode, mq_attr* attr); * * Params: * name = Name of the message queue to open. * oflag = determines the type of access used. * If `O_CREAT` is on `oflag`, the third argument is taken as a * `mode_t`, the mode of the created message queue. * If `O_CREAT` is on `oflag`, the fourth argument is taken as * a pointer to a `mq_attr' (message queue attributes). * If the fourth argument is `null`, default attributes are used. * ... = varargs matching the function prototypes * * Returns: * Message queue descriptor or (mqd_t) -1 on error. */ mqd_t mq_open(const(char)* name, int oflag, ...); /** * Closes the message queue descriptor mqdes. * * Params: * mqdes = Message queue descriptor to close. * * Returns: * On success mq_close() returns 0; on error, -1 is returned, with errno * set to indicate the error. */ int mq_close (mqd_t mqdes); /** * Query status and attributes of message queue `mqdes`. * * Params: * mqdes = Message queue descriptor. * mqstat = Buffer to fill with the message queue's attributes. * * Returns: * On success mq_getattr() return 0; on error, -1 is returned, with errno * set to indicate the error. */ int mq_getattr (mqd_t mqdes, mq_attr* mqstat); /* * Set attributes associated with message queue `mqdes` * * Params: * mqdes = Message queue descriptor. * newstat = non-null pointer to fill with attributes for `mqdes`. * oldstat = if not `null` it is filled with the old attributes. * * Returns: * On success mq_setattr() return 0; on error, -1 is returned, with errno * set to indicate the error. */ int mq_setattr (mqd_t mqdes, const(mq_attr)* newstat, mq_attr* oldstat); /** * Remove the specified message queue `name`. * * Params: * name = Name of the queue to remove. * * Returns: * On success mq_unlink() returns 0; on error, -1 is returned, with errno * set to indicate the error. */ int mq_unlink (const(char)* name); /** * Register for notification when a message is available * * Params: * mqdes = Message queue descriptor. * notification = See `man 3 mq_notify` for details. * * Returns: * On success mq_notify() returns 0; on error, -1 is returned, with errno * set to indicate the error. */ int mq_notify (mqd_t mqdes, const(sigevent)* notification); /** * Receive the oldest message with the highest priority the the message queue * * Params: * mqdes = Message queue descriptor. * msg_ptr = Buffer to write the message to * msg_len = Size of the buffer provided as `msg_ptr`. Must be greater * than the mq_msgsize attribute of the queue. * msg_prio = If not `null`, set to the priority of this message. * * Returns: * On success, mq_receive() returns the number of bytes in the received * message; on error, -1 is returned, with errno set to indicate the error */ ssize_t mq_receive (mqd_t mqdes, char* msg_ptr, size_t msg_len, uint* msg_prio); /** * Receive the oldest message with the highest priority the the message queue, * wait up to a certain timeout. * * Params: * mqdes = Message queue descriptor. * msg_ptr = Buffer to write the message to * msg_len = Size of the buffer provided as `msg_ptr`. Must be greater * than the mq_msgsize attribute of the queue. * msg_prio = If not `null`, set to the priority of this message. * abs_timeout = Specify a ceiling on the time to block if the queue is empty. * * Returns: * On success, mq_receive() returns the number of bytes in the received * message; on error, -1 is returned, with errno set to indicate the error */ ssize_t mq_timedreceive (mqd_t mqdes, char* msg_ptr, size_t msg_len, uint* msg_prio, const(timespec)* abs_timeout); /** * Add a message to a message queue. * * Params: * mqdes = Message queue descriptor. * msg_ptr = Buffer to read the message from * msg_len = Size of the message provided via `msg_ptr`. Must be lower * or equal to the mq_msgsize attribute of the queue. * msg_prio = Priority of this message. * * Returns: * On success, mq_send() return zero; on error, -1 is returned, with errno * set to indicate the error. */ int mq_send (mqd_t mqdes, const(char)* msg_ptr, size_t msg_len, uint msg_prio); /** * Add a message to a message queue, block up to a certain time if the queue * is full. * * Params: * mqdes = Message queue descriptor. * msg_ptr = Buffer to read the message from * msg_len = Size of the message provided via `msg_ptr`. Must be lower * or equal to the mq_msgsize attribute of the queue. * msg_prio = Priority of this message. * abs_timeout = Specify a ceiling on the time to block if the queue is empty. * * Returns: * On success, mq_timedsend() return zero; on error, -1 is returned, * with errno set to indicate the error. * */ int mq_timedsend (mqd_t mqdes, const(char)* msg_ptr, size_t msg_len, uint msg_prio, const(timespec)* abs_timeout);