msg.h

Go to the documentation of this file.
00001 
00183 #ifndef KERN_MSG_H
00184 #define KERN_MSG_H
00185 
00186 #include <mware/event.h>
00187 #include <struct/list.h>
00188 #include <kern/proc.h>
00189 
00190 typedef struct MsgPort
00191 {
00192     List  queue;   
00193     Event event;   
00194 } MsgPort;
00195 
00196 
00197 typedef struct Msg
00198 {
00199     Node     link;      
00200     MsgPort *replyPort; 
00201     /* User data may follow */
00202 } Msg;
00203 
00204 
00220 INLINE void msg_lockPort(UNUSED_ARG(MsgPort *, port))
00221 {
00222     proc_forbid();
00223 }
00224 
00230 INLINE void msg_unlockPort(UNUSED_ARG(MsgPort *, port))
00231 {
00232     proc_permit();
00233 }
00234 
00235 
00237 INLINE void msg_initPort(MsgPort *port, Event event)
00238 {
00239     LIST_INIT(&port->queue);
00240     port->event = event;
00241 }
00242 
00244 INLINE void msg_put(MsgPort *port, Msg *msg)
00245 {
00246     msg_lockPort(port);
00247     ADDTAIL(&port->queue, &msg->link);
00248     msg_unlockPort(port);
00249 
00250     event_do(&port->event);
00251 }
00252 
00258 INLINE Msg *msg_get(MsgPort *port)
00259 {
00260     Msg *msg;
00261 
00262     msg_lockPort(port);
00263     msg = (Msg *)list_remHead(&port->queue);
00264     msg_unlockPort(port);
00265 
00266     return msg;
00267 }
00268 
00270 INLINE Msg *msg_peek(MsgPort *port)
00271 {
00272     Msg *msg;
00273 
00274     msg_lockPort(port);
00275     msg = (Msg *)port->queue.head.succ;
00276     if (LIST_EMPTY(&port->queue))
00277         msg = NULL;
00278     msg_unlockPort(port);
00279 
00280     return msg;
00281 }
00282 
00284 INLINE void msg_reply(Msg *msg)
00285 {
00286     msg_put(msg->replyPort, msg);
00287 }
00288 
00289 int msg_testRun(void);
00290 int msg_testSetup(void);
00291 int msg_testTearDown(void);
00292 
00293 #endif /* KERN_MSG_H */