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