4 * Implements Inlines for LWKT messages and ports.
6 * $DragonFly: src/sys/sys/msgport2.h,v 1.12 2007/05/23 02:09:41 dillon Exp $
9 #ifndef _SYS_MSGPORT2_H_
10 #define _SYS_MSGPORT2_H_
14 #error "This file should not be included by userland programs."
18 #ifndef _SYS_THREAD2_H_
19 #include <sys/thread2.h>
22 #define lwkt_cmd_op_none lwkt_cmd_op(0)
24 typedef int (*lwkt_cmd_func_t)(lwkt_msg_t);
27 * Initialize a LWKT message structure. Note that if the message supports
28 * an abort MSGF_ABORTABLE must be passed in flags and an abort command
29 * supplied. If abort is not supported then lwkt_cmd_op_none is passed as
30 * the abort command argument by convention.
32 * Note that other areas of the LWKT msg may already be initialized, so we
33 * do not zero the message here.
37 lwkt_initmsg(lwkt_msg_t msg, lwkt_port_t rport, int flags,
38 lwkt_cmd_t cmd, lwkt_cmd_t abort)
40 msg->ms_cmd = cmd; /* opaque */
41 if (flags & MSGF_ABORTABLE) /* constant optimized conditional */
42 msg->ms_abort = abort; /* opaque */
43 msg->ms_flags = MSGF_DONE | flags;
44 msg->ms_reply_port = rport;
48 * These inlines convert specific types to the lwkt_cmd_t type. The compiler
49 * should be able to optimize this whole mess out.
63 lwkt_cmd_func(int (*func)(lwkt_msg_t))
73 lwkt_initmsg_simple(lwkt_msg_t msg, int op)
75 lwkt_initmsg(msg, &curthread->td_msgport, 0,
76 lwkt_cmd_op(op), lwkt_cmd_op(0));
81 lwkt_reinitmsg(lwkt_msg_t msg, lwkt_port_t rport)
83 msg->ms_flags = (msg->ms_flags & (MSGF_ASYNC | MSGF_ABORTABLE)) | MSGF_DONE;
84 msg->ms_reply_port = rport;
89 lwkt_beginmsg(lwkt_port_t port, lwkt_msg_t msg)
91 return(port->mp_putport(port, msg));
96 lwkt_waitmsg(lwkt_msg_t msg)
98 lwkt_port_t port = msg->ms_reply_port;
99 return(((lwkt_msg_t)port->mp_waitport(port, msg))->ms_error);
104 lwkt_replymsg(lwkt_msg_t msg, int error)
108 msg->ms_error = error;
109 port = msg->ms_reply_port;
110 port->mp_replyport(port, msg);
115 lwkt_waitport(lwkt_port_t port, lwkt_msg_t msg)
117 return(port->mp_waitport(port, msg));
122 lwkt_checkmsg(lwkt_msg_t msg)
124 return(msg->ms_flags & MSGF_DONE);
128 #endif /* _SYS_MSGPORT2_H_ */