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 */