#ifndef _IPC_IPC_MQUEUE_H_
#define _IPC_IPC_MQUEUE_H_
#include <mach_assert.h>
#include <mach/message.h>
#include <kern/assert.h>
#include <kern/macro_help.h>
#include <kern/kern_types.h>
#include <kern/wait_queue.h>
#include <ipc/ipc_kmsg.h>
#include <ipc/ipc_object.h>
#include <ipc/ipc_types.h>
typedef struct ipc_mqueue {
union {
struct {
struct wait_queue wait_queue;
struct ipc_kmsg_queue messages;
mach_port_msgcount_t msgcount;
mach_port_msgcount_t qlimit;
mach_port_seqno_t seqno;
boolean_t fullwaiters;
} port;
struct wait_queue_set set_queue;
} data;
} *ipc_mqueue_t;
#define IMQ_NULL ((ipc_mqueue_t) 0)
#define imq_wait_queue data.port.wait_queue
#define imq_messages data.port.messages
#define imq_msgcount data.port.msgcount
#define imq_qlimit data.port.qlimit
#define imq_seqno data.port.seqno
#define imq_fullwaiters data.port.fullwaiters
#define imq_set_queue data.set_queue
#define imq_setlinks data.set_queue.wqs_setlinks
#define imq_is_set(mq) wait_queue_is_set(&(mq)->imq_set_queue)
#define imq_lock(mq) wait_queue_lock(&(mq)->imq_wait_queue)
#define imq_lock_try(mq) wait_queue_lock_try(&(mq)->imq_wait_queue)
#define imq_unlock(mq) wait_queue_unlock(&(mq)->imq_wait_queue)
#define imq_held(mq) wait_queue_held(&(mq)->imq_wait_queue)
#define imq_full(mq) ((mq)->imq_msgcount >= (mq)->imq_qlimit)
extern int ipc_mqueue_full;
extern int ipc_mqueue_rcv;
#define IPC_MQUEUE_FULL (event64_t)&ipc_mqueue_full
#define IPC_MQUEUE_RECEIVE (event64_t)&ipc_mqueue_rcv
extern void ipc_mqueue_init(
ipc_mqueue_t mqueue,
boolean_t is_set);
extern void ipc_mqueue_destroy(
ipc_mqueue_t mqueue);
extern void ipc_mqueue_changed(
ipc_mqueue_t mqueue);
extern kern_return_t ipc_mqueue_add(
ipc_mqueue_t mqueue,
ipc_mqueue_t set_mqueue);
extern boolean_t ipc_mqueue_member(
ipc_mqueue_t mqueue,
ipc_mqueue_t set_mqueue);
extern kern_return_t ipc_mqueue_remove(
ipc_mqueue_t mqueue,
ipc_mqueue_t set_mqueue);
extern void ipc_mqueue_remove_from_all(
ipc_mqueue_t mqueue);
extern void ipc_mqueue_remove_all(
ipc_mqueue_t mqueue);
extern mach_msg_return_t ipc_mqueue_send(
ipc_mqueue_t mqueue,
ipc_kmsg_t kmsg,
mach_msg_option_t option,
mach_msg_timeout_t timeout_val);
extern void ipc_mqueue_post(
ipc_mqueue_t mqueue,
ipc_kmsg_t kmsg);
extern void ipc_mqueue_receive(
ipc_mqueue_t mqueue,
mach_msg_option_t option,
mach_msg_size_t max_size,
mach_msg_timeout_t timeout_val,
int interruptible);
extern void ipc_mqueue_receive_continue(
void *param,
wait_result_t wresult);
extern void ipc_mqueue_select(
ipc_mqueue_t mqueue,
mach_msg_option_t option,
mach_msg_size_t max_size);
extern void ipc_mqueue_release_msgcount(
ipc_mqueue_t mqueue);
extern void ipc_mqueue_set_qlimit(
ipc_mqueue_t mqueue,
mach_port_msgcount_t qlimit);
extern void ipc_mqueue_set_seqno(
ipc_mqueue_t mqueue,
mach_port_seqno_t seqno);
extern mach_msg_return_t ipc_mqueue_copyin(
ipc_space_t space,
mach_port_name_t name,
ipc_mqueue_t *mqueuep,
ipc_object_t *objectp);
#endif