Remove stale declarations (moved to monitor.h).
[bertos.git] / kern / msg.h
1 /*!
2  * \file
3  * <!--
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.
7  * -->
8  *
9  * \brief Simple inter-process messaging system
10  *
11  * This module implements a common system for executing
12  * a user defined action calling a hook function.
13  *
14  * \version $Id$
15  *
16  * \author Bernardo Innocenti <bernie@develer.com>
17  */
18
19 /*#*
20  *#* $Log$
21  *#* Revision 1.3  2004/08/25 14:12:09  rasky
22  *#* Aggiornato il comment block dei log RCS
23  *#*
24  *#* Revision 1.2  2004/08/14 19:37:57  rasky
25  *#* Merge da SC: macros.h, pool.h, BIT_CHANGE, nome dei processi, etc.
26  *#*
27  *#* Revision 1.1  2004/06/06 15:11:08  bernie
28  *#* Import into DevLib.
29  *#*
30  *#*/
31 #ifndef KERN_MSG_H
32 #define KERN_MSG_H
33
34 #include "event.h"
35 #include <mware/list.h>
36
37
38 typedef struct MsgPort
39 {
40         List  queue; /*!< Messages queued at this port */
41         Event evn;   /*!< Event to trigger when a message arrives */
42 } MsgPort;
43
44
45 typedef struct Msg
46 {
47         Node     link;      /*!< Link into message port queue */
48         MsgPort *replyPort; /*!< Port to which the msg is to be replied */
49         /* User data may follow */
50 } Msg;
51
52
53 /*! Initialize a message port */
54 INLINE void msg_initPort(MsgPort* port, Event event)
55 {
56         INITLIST(&port->queue);
57         port->evn = event;
58 }
59
60 /*! Queue \a msg into \a port, triggering the associated event */
61 INLINE void msg_put(MsgPort* port, Msg* msg)
62 {
63         ADDTAIL(&port->queue, &msg->link);
64         event_do(&port->evn);
65 }
66
67 /* Get the first message from the queue of \a port, or NULL if the port is empty */
68 INLINE Msg* msg_get(MsgPort* port)
69 {
70         return (Msg*)REMHEAD(&port->queue);
71 }
72
73 /*! Send back (reply) \a msg to its sender */
74 INLINE void msg_reply(Msg* msg)
75 {
76         msg_put(msg->replyPort, msg);
77 }
78
79 #endif /* KERN_MSG_H */