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