kern/msg.h

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