4 * Copyright 2004 Develer S.r.l. (http://www.develer.com/)
5 * Copyright 1999,2001 Bernardo Innocenti <bernie@develer.com>
6 * This file is part of DevLib - See devlib/README for information.
9 * \brief Simple inter-process messaging system
11 * This module implements a common system for executing
12 * a user defined action calling a hook function.
16 * \author Bernardo Innocenti <bernie@develer.com>
21 *#* Revision 1.4 2004/10/19 08:22:09 bernie
22 *#* msg_peek(): New function.
24 *#* Revision 1.3 2004/08/25 14:12:09 rasky
25 *#* Aggiornato il comment block dei log RCS
27 *#* Revision 1.2 2004/08/14 19:37:57 rasky
28 *#* Merge da SC: macros.h, pool.h, BIT_CHANGE, nome dei processi, etc.
30 *#* Revision 1.1 2004/06/06 15:11:08 bernie
31 *#* Import into DevLib.
38 #include <mware/list.h>
41 typedef struct MsgPort
43 List queue; /*!< Messages queued at this port */
44 Event evn; /*!< Event to trigger when a message arrives */
50 Node link; /*!< Link into message port queue */
51 MsgPort *replyPort; /*!< Port to which the msg is to be replied */
52 /* User data may follow */
56 /*! Initialize a message port */
57 INLINE void msg_initPort(MsgPort* port, Event event)
59 INITLIST(&port->queue);
63 /*! Queue \a msg into \a port, triggering the associated event */
64 INLINE void msg_put(MsgPort* port, Msg* msg)
66 ADDTAIL(&port->queue, &msg->link);
70 /* Get the first message from the queue of \a port, or NULL if the port is empty */
71 INLINE Msg* msg_get(MsgPort* port)
73 return (Msg*)REMHEAD(&port->queue);
76 /* Peek the first message in the queue of \a port, or NULL if the port is empty */
77 INLINE Msg *msg_peek(MsgPort *port)
79 if (ISLISTEMPTY(&port->queue))
82 return (Msg *)port->queue.head;
85 /*! Send back (reply) \a msg to its sender */
86 INLINE void msg_reply(Msg* msg)
88 msg_put(msg->replyPort, msg);
91 #endif /* KERN_MSG_H */