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 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 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 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 * 69 lwkt_getport(lwkt_port_t port) 70 { 71 return(port->mp_getport(port)); 72 } 73 74 static __inline 75 void * 76 lwkt_waitport(lwkt_port_t port, int flags) 77 { 78 return(port->mp_waitport(port, flags)); 79 } 80 81 static __inline 82 int 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 91 lwkt_checkmsg(lwkt_msg_t msg) 92 { 93 return(msg->ms_flags & MSGF_DONE); 94 } 95 96 static __inline 97 int 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 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