diff options
Diffstat (limited to 'mq.h')
-rw-r--r-- | mq.h | 79 |
1 files changed, 79 insertions, 0 deletions
@@ -0,0 +1,79 @@ +#include <limits.h> // for definition of SSIZE_MAX + +typedef struct { + PyObject_HEAD + key_t key; + int id; + unsigned long max_message_size; +} MessageQueue; + +/* Message queue message struct for send() & receive() +On many systems this is defined in sys/msg.h already, but it's better +for me to define it here. Name it something other than msgbuf to avoid +conflict with the struct that the OS header file might define. +*/ +struct queue_message { + long type; + char message[]; +}; + +/* Maximum message size is limited by (a) the largest Python string I can +create and (b) SSIZE_T_MAX. The latter restriction comes from the spec which +says, "If the value of msgsz is greater than {SSIZE_MAX}, the result is +implementation-defined." +ref: http://www.opengroup.org/onlinepubs/000095399/functions/msgrcv.html +*/ +#if SSIZE_MAX > PY_STRING_LENGTH_MAX +#define QUEUE_MESSAGE_SIZE_MAX PY_STRING_LENGTH_MAX +#else +#define QUEUE_MESSAGE_SIZE_MAX SSIZE_MAX +#endif + +/* The max message size is probably a very big number, and since a +max-sized buffer is allocated every time receive() is called, it would be +ugly if the default message size for new queues was the same as the max. +In addition, many operating systems limit the entire queue to 2048 bytes, +so defaulting the max message to something larger seems a bit stupid. + +This value is also present in numeric form in ReadMe.html, so if you +change it here, change it there too. +*/ +#define QUEUE_MESSAGE_SIZE_MAX_DEFAULT 2048 + +/* Object methods */ +PyObject *MessageQueue_new(PyTypeObject *, PyObject *, PyObject *); +int MessageQueue_init(MessageQueue *, PyObject *, PyObject *); +void MessageQueue_dealloc(MessageQueue *); +PyObject *MessageQueue_send(MessageQueue *, PyObject *, PyObject *); +PyObject *MessageQueue_receive(MessageQueue *, PyObject *, PyObject *); +PyObject *MessageQueue_remove(MessageQueue *); + +/* Object attributes (read-write & read-only) */ +PyObject *mq_get_mode(MessageQueue *); +int mq_set_mode(MessageQueue *, PyObject *); + +PyObject *mq_get_uid(MessageQueue *); +int mq_set_uid(MessageQueue *, PyObject *); + +PyObject *mq_get_gid(MessageQueue *); +int mq_set_gid(MessageQueue *, PyObject *); + +PyObject *mq_get_max_size(MessageQueue *); +int mq_set_max_size(MessageQueue *, PyObject *); + +PyObject *mq_get_key(MessageQueue *); +PyObject *mq_get_last_send_time(MessageQueue *); +PyObject *mq_get_last_receive_time(MessageQueue *); +PyObject *mq_get_last_change_time(MessageQueue *); +PyObject *mq_get_last_send_pid(MessageQueue *); +PyObject *mq_get_last_receive_pid(MessageQueue *); +PyObject *mq_get_current_messages(MessageQueue *); +PyObject *mq_get_c_uid(MessageQueue *); +PyObject *mq_get_c_gid(MessageQueue *); + +PyObject *mq_str(MessageQueue *); +PyObject *mq_repr(MessageQueue *); + +/* Misc. */ +PyObject *mq_remove(int); + |