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
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
00294 int msg_testRun(void);
00295 int msg_testSetup(void);
00296 int msg_testTearDown(void);
00297
00298 #endif