xref: /dragonfly/sys/sys/msgport2.h (revision 805c8e8e)
1 /*
2  * SYS/MSGPORT2.H
3  *
4  *	Implements Inlines for LWKT messages and ports.
5  */
6 
7 #ifndef _SYS_MSGPORT2_H_
8 #define _SYS_MSGPORT2_H_
9 
10 #ifndef _KERNEL
11 #error "This file should not be included by userland programs."
12 #endif
13 
14 #ifndef _SYS_SYSTM_H_
15 #include <sys/systm.h>
16 #endif
17 
18 #ifdef MALLOC_DECLARE
19 MALLOC_DECLARE(M_LWKTMSG);
20 #endif
21 
22 /*
23  * Initialize a LWKT message structure.  Note that if the message supports
24  * an abort MSGF_ABORTABLE must be passed in flags.
25  *
26  * Note that other areas of the LWKT msg may already be initialized, so we
27  * do not zero the message here.
28  *
29  * Messages are marked as DONE until sent.
30  */
31 static __inline
32 void
lwkt_initmsg(lwkt_msg_t msg,lwkt_port_t rport,int flags)33 lwkt_initmsg(lwkt_msg_t msg, lwkt_port_t rport, int flags)
34 {
35     msg->ms_flags = MSGF_DONE | flags;
36     msg->ms_reply_port = rport;
37 }
38 
39 static __inline
40 void
lwkt_initmsg_abortable(lwkt_msg_t msg,lwkt_port_t rport,int flags,void (* abortfn)(lwkt_msg_t))41 lwkt_initmsg_abortable(lwkt_msg_t msg, lwkt_port_t rport, int flags,
42 		       void (*abortfn)(lwkt_msg_t))
43 {
44     lwkt_initmsg(msg, rport, flags | MSGF_ABORTABLE);
45     msg->ms_abortfn = abortfn;
46 }
47 
48 static __inline
49 void
lwkt_replymsg(lwkt_msg_t msg,int error)50 lwkt_replymsg(lwkt_msg_t msg, int error)
51 {
52     lwkt_port_t port;
53 
54     msg->ms_error = error;
55     port = msg->ms_reply_port;
56     port->mp_replyport(port, msg);
57 }
58 
59 /*
60  * Retrieve the next message from the port's message queue, return NULL
61  * if no messages are pending.  The retrieved message will either be a
62  * request or a reply based on the MSGF_REPLY bit.
63  *
64  * If the backend port is a thread port, the the calling thread MUST
65  * own the port.
66  */
67 static __inline
68 void *
lwkt_getport(lwkt_port_t port)69 lwkt_getport(lwkt_port_t port)
70 {
71     return(port->mp_getport(port));
72 }
73 
74 static __inline
75 void *
lwkt_waitport(lwkt_port_t port,int flags)76 lwkt_waitport(lwkt_port_t port, int flags)
77 {
78     return(port->mp_waitport(port, flags));
79 }
80 
81 static __inline
82 int
lwkt_waitmsg(lwkt_msg_t msg,int flags)83 lwkt_waitmsg(lwkt_msg_t msg, int flags)
84 {
85     return(msg->ms_reply_port->mp_waitmsg(msg, flags));
86 }
87 
88 
89 static __inline
90 int
lwkt_checkmsg(lwkt_msg_t msg)91 lwkt_checkmsg(lwkt_msg_t msg)
92 {
93     return(msg->ms_flags & MSGF_DONE);
94 }
95 
96 static __inline
97 int
lwkt_dropmsg(lwkt_msg_t msg)98 lwkt_dropmsg(lwkt_msg_t msg)
99 {
100     lwkt_port_t port;
101     int error = ENOENT;
102 
103     KKASSERT(msg->ms_flags & MSGF_DROPABLE);
104     port = msg->ms_target_port;
105     if (port)
106 	    error = port->mp_dropmsg(port, msg);
107     return (error);
108 }
109 
110 static __inline
111 void
lwkt_setmsg_receipt(lwkt_msg_t msg,void (* receiptfn)(lwkt_msg_t,lwkt_port_t))112 lwkt_setmsg_receipt(lwkt_msg_t msg, void (*receiptfn)(lwkt_msg_t, lwkt_port_t))
113 {
114 	msg->ms_flags |= MSGF_RECEIPT;
115 	msg->ms_receiptfn = receiptfn;
116 }
117 
118 #endif	/* _SYS_MSGPORT2_H_ */
119