BeRTOS
|
00001 00188 #ifndef KERN_MSG_H 00189 #define KERN_MSG_H 00190 00191 #include <mware/event.h> 00192 #include <struct/list.h> 00193 #include <kern/proc.h> 00194 00195 typedef struct MsgPort 00196 { 00197 List queue; 00198 Event event; 00199 } MsgPort; 00200 00201 00202 typedef struct Msg 00203 { 00204 Node link; 00205 MsgPort *replyPort; 00206 /* User data may follow */ 00207 } Msg; 00208 00209 00225 INLINE void msg_lockPort(UNUSED_ARG(MsgPort *, port)) 00226 { 00227 proc_forbid(); 00228 } 00229 00235 INLINE void msg_unlockPort(UNUSED_ARG(MsgPort *, port)) 00236 { 00237 proc_permit(); 00238 } 00239 00240 00242 INLINE void msg_initPort(MsgPort *port, Event event) 00243 { 00244 LIST_INIT(&port->queue); 00245 port->event = event; 00246 } 00247 00249 INLINE void msg_put(MsgPort *port, Msg *msg) 00250 { 00251 msg_lockPort(port); 00252 ADDTAIL(&port->queue, &msg->link); 00253 msg_unlockPort(port); 00254 00255 event_do(&port->event); 00256 } 00257 00263 INLINE Msg *msg_get(MsgPort *port) 00264 { 00265 Msg *msg; 00266 00267 msg_lockPort(port); 00268 msg = (Msg *)list_remHead(&port->queue); 00269 msg_unlockPort(port); 00270 00271 return msg; 00272 } 00273 00275 INLINE Msg *msg_peek(MsgPort *port) 00276 { 00277 Msg *msg; 00278 00279 msg_lockPort(port); 00280 msg = (Msg *)port->queue.head.succ; 00281 if (LIST_EMPTY(&port->queue)) 00282 msg = NULL; 00283 msg_unlockPort(port); 00284 00285 return msg; 00286 } 00287 00289 INLINE void msg_reply(Msg *msg) 00290 { 00291 msg_put(msg->replyPort, msg); 00292 } 00293 //defgroup kern_msg 00295 00296 int msg_testRun(void); 00297 int msg_testSetup(void); 00298 int msg_testTearDown(void); 00299 00300 #endif /* KERN_MSG_H */