BeRTOS
msg.h
Go to the documentation of this file.
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 */