kern/msg.h
Go to the documentation of this file.00001 00179 #ifndef KERN_MSG_H 00180 #define KERN_MSG_H 00181 00182 #include <mware/event.h> 00183 #include <struct/list.h> 00184 #include <kern/proc.h> 00185 00186 typedef struct MsgPort 00187 { 00188 List queue; 00189 Event event; 00190 } MsgPort; 00191 00192 00193 typedef struct Msg 00194 { 00195 Node link; 00196 MsgPort *replyPort; 00197 /* User data may follow */ 00198 } Msg; 00199 00200 00216 INLINE void msg_lockPort(UNUSED_ARG(MsgPort *, port)) 00217 { 00218 proc_forbid(); 00219 } 00220 00226 INLINE void msg_unlockPort(UNUSED_ARG(MsgPort *, port)) 00227 { 00228 proc_permit(); 00229 } 00230 00231 00233 INLINE void msg_initPort(MsgPort *port, Event event) 00234 { 00235 LIST_INIT(&port->queue); 00236 port->event = event; 00237 } 00238 00240 INLINE void msg_put(MsgPort *port, Msg *msg) 00241 { 00242 msg_lockPort(port); 00243 ADDTAIL(&port->queue, &msg->link); 00244 msg_unlockPort(port); 00245 00246 event_do(&port->event); 00247 } 00248 00254 INLINE Msg *msg_get(MsgPort *port) 00255 { 00256 Msg *msg; 00257 00258 msg_lockPort(port); 00259 msg = (Msg *)list_remHead(&port->queue); 00260 msg_unlockPort(port); 00261 00262 return msg; 00263 } 00264 00266 INLINE Msg *msg_peek(MsgPort *port) 00267 { 00268 Msg *msg; 00269 00270 msg_lockPort(port); 00271 msg = (Msg *)port->queue.head.succ; 00272 if (LIST_EMPTY(&port->queue)) 00273 msg = NULL; 00274 msg_unlockPort(port); 00275 00276 return msg; 00277 } 00278 00280 INLINE void msg_reply(Msg *msg) 00281 { 00282 msg_put(msg->replyPort, msg); 00283 } 00284 00285 #endif /* KERN_MSG_H */
