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