1 /* 2 * SYS/MSGPORT2.H 3 * 4 * Implements Inlines for LWKT messages and ports. 5 * 6 * $DragonFly: src/sys/sys/msgport2.h,v 1.17 2008/11/09 09:20:09 sephe 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 /* 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 int 50 lwkt_beginmsg(lwkt_port_t port, lwkt_msg_t msg) 51 { 52 return(port->mp_putport(port, msg)); 53 } 54 55 static __inline 56 void 57 lwkt_replymsg(lwkt_msg_t msg, int error) 58 { 59 lwkt_port_t port; 60 61 msg->ms_error = error; 62 port = msg->ms_reply_port; 63 port->mp_replyport(port, msg); 64 } 65 66 /* 67 * Retrieve the next message from the port's message queue, return NULL 68 * if no messages are pending. The retrieved message will either be a 69 * request or a reply based on the MSGF_REPLY bit. 70 * 71 * If the backend port is a thread port, the the calling thread MUST 72 * own the port. 73 */ 74 static __inline 75 void * 76 lwkt_getport(lwkt_port_t port) 77 { 78 return(port->mp_getport(port)); 79 } 80 81 static __inline 82 void * 83 lwkt_waitport(lwkt_port_t port, int flags) 84 { 85 return(port->mp_waitport(port, flags)); 86 } 87 88 static __inline 89 int 90 lwkt_waitmsg(lwkt_msg_t msg, int flags) 91 { 92 return(msg->ms_reply_port->mp_waitmsg(msg, flags)); 93 } 94 95 96 static __inline 97 int 98 lwkt_checkmsg(lwkt_msg_t msg) 99 { 100 return(msg->ms_flags & MSGF_DONE); 101 } 102 103 static __inline 104 void 105 lwkt_dropmsg(lwkt_msg_t msg) 106 { 107 lwkt_port_t port; 108 109 KKASSERT((msg->ms_flags & (MSGF_DROPABLE | MSGF_DONE | MSGF_QUEUED)) == 110 (MSGF_DROPABLE | MSGF_QUEUED)); 111 port = msg->ms_target_port; 112 port->mp_dropmsg(port, msg); 113 } 114 115 #endif /* _KERNEL */ 116 #endif /* _SYS_MSGPORT2_H_ */ 117