xref: /dragonfly/sys/sys/msgport2.h (revision 521a7b05)
1 /*
2  * SYS/MSGPORT2.H
3  *
4  *	Implements Inlines for LWKT messages and ports.
5  *
6  * $DragonFly: src/sys/sys/msgport2.h,v 1.11 2006/05/21 03:43:47 dillon Exp $
7  */
8 
9 #ifndef _SYS_MSGPORT2_H_
10 #define _SYS_MSGPORT2_H_
11 
12 #ifndef _KERNEL
13 
14 #error "This file should not be included by userland programs."
15 
16 #else
17 
18 #ifndef _SYS_THREAD2_H_
19 #include <sys/thread2.h>
20 #endif
21 
22 #define lwkt_cmd_op_none	lwkt_cmd_op(0)
23 
24 typedef int (*lwkt_cmd_func_t)(lwkt_msg_t);
25 
26 /*
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.
31  *
32  * Note that other areas of the LWKT msg may already be initialized, so we
33  * do not zero the message here.
34  */
35 static __inline
36 void
37 lwkt_initmsg(lwkt_msg_t msg, lwkt_port_t rport, int flags,
38 		lwkt_cmd_t cmd, lwkt_cmd_t abort)
39 {
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;
45     msg->ms_msgsize = 0;
46 }
47 
48 /*
49  * These inlines convert specific types to the lwkt_cmd_t type.  The compiler
50  * should be able to optimize this whole mess out.
51  */
52 static __inline
53 lwkt_cmd_t
54 lwkt_cmd_op(int op)
55 {
56     lwkt_cmd_t cmd;
57 
58     cmd.cm_op = op;
59     return(cmd);
60 }
61 
62 static __inline
63 lwkt_cmd_t
64 lwkt_cmd_func(int (*func)(lwkt_msg_t))
65 {
66     lwkt_cmd_t cmd;
67 
68     cmd.cm_func = func;
69     return(cmd);
70 }
71 
72 static __inline
73 void
74 lwkt_initmsg_simple(lwkt_msg_t msg, int op)
75 {
76     lwkt_initmsg(msg, &curthread->td_msgport, 0,
77 	lwkt_cmd_op(op), lwkt_cmd_op(0));
78 }
79 
80 static __inline
81 void
82 lwkt_reinitmsg(lwkt_msg_t msg, lwkt_port_t rport)
83 {
84     msg->ms_flags = (msg->ms_flags & (MSGF_ASYNC | MSGF_ABORTABLE)) | MSGF_DONE;
85     msg->ms_reply_port = rport;
86 }
87 
88 static __inline
89 int
90 lwkt_beginmsg(lwkt_port_t port, lwkt_msg_t msg)
91 {
92     return(port->mp_putport(port, msg));
93 }
94 
95 static __inline
96 int
97 lwkt_waitmsg(lwkt_msg_t msg)
98 {
99     lwkt_port_t port = msg->ms_reply_port;
100     return(((lwkt_msg_t)port->mp_waitport(port, msg))->ms_error);
101 }
102 
103 static __inline
104 void
105 lwkt_replymsg(lwkt_msg_t msg, int error)
106 {
107     lwkt_port_t port;
108 
109     msg->ms_error = error;
110     port = msg->ms_reply_port;
111     port->mp_replyport(port, msg);
112 }
113 
114 static __inline
115 void *
116 lwkt_waitport(lwkt_port_t port, lwkt_msg_t msg)
117 {
118     return(port->mp_waitport(port, msg));
119 }
120 
121 static __inline
122 int
123 lwkt_checkmsg(lwkt_msg_t msg)
124 {
125     return(msg->ms_flags & MSGF_DONE);
126 }
127 
128 #endif	/* _KERNEL */
129 #endif	/* _SYS_MSGPORT2_H_ */
130