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