summaryrefslogtreecommitdiffstats
path: root/message.c
diff options
context:
space:
mode:
authorAndreas Eversberg2010-01-16 11:20:23 +0100
committerAndreas Eversberg2010-01-16 11:20:23 +0100
commitb0bd74e35e935aa976b68c594def4e8d2c22ef95 (patch)
tree7e7033beb3b9b1a1976d58ce4e16c6f965a3c9fc /message.c
parentAdded new option to interface.conf: "nonotify" to disable notify messages. (diff)
downloadlcr-b0bd74e35e935aa976b68c594def4e8d2c22ef95.tar.gz
lcr-b0bd74e35e935aa976b68c594def4e8d2c22ef95.tar.xz
lcr-b0bd74e35e935aa976b68c594def4e8d2c22ef95.zip
Replaced polling loop for LCR and chan_lcr with select based event loop.
Now LCR and chan_lcr will not use any CPU until there is work to do.
Diffstat (limited to 'message.c')
-rw-r--r--message.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/message.c b/message.c
index 403253d..e2f01ec 100644
--- a/message.c
+++ b/message.c
@@ -15,6 +15,20 @@ MESSAGES
struct lcr_msg *message_first = NULL;
struct lcr_msg **messagepointer_end = &message_first;
+struct lcr_work message_work;
+
+static int work_message(struct lcr_work *work, void *instance, int index);
+
+void init_message(void)
+{
+ memset(&message_work, 0, sizeof(message_work));
+ add_work(&message_work, work_message, NULL, 0);
+}
+
+void cleanup_message(void)
+{
+ del_work(&message_work);
+}
/* creates a new message with the given attributes. the message must be filled then. after filling, the message_put must be called */
struct lcr_msg *message_create(int id_from, int id_to, int flow, int type)
@@ -50,6 +64,9 @@ void message_put(struct lcr_msg *message)
messagepointer_end = &(message->next);
/* Nullify next pointer if recycled messages */
*messagepointer_end=NULL;
+
+ /* trigger work */
+ trigger_work(&message_work);
}
struct lcr_msg *message_forward(int id_from, int id_to, int flow, union parameter *param)
@@ -102,3 +119,66 @@ void message_free(struct lcr_msg *message)
}
+static int work_message(struct lcr_work *work, void *instance, int index)
+{
+ struct lcr_msg *message;
+ class Port *port;
+ class Endpoint *epoint;
+ class Join *join;
+
+ while ((message = message_get())) {
+ switch(message->flow) {
+ case PORT_TO_EPOINT:
+ epoint = find_epoint_id(message->id_to);
+ if (epoint) {
+ if (epoint->ep_app) {
+ epoint->ep_app->ea_message_port(message->id_from, message->type, &message->param);
+ } else {
+ PDEBUG(DEBUG_MSG, "Warning: message %s from port %d to endpoint %d. endpoint doesn't have an application.\n", messages_txt[message->type], message->id_from, message->id_to);
+ }
+ } else {
+ PDEBUG(DEBUG_MSG, "Warning: message %s from port %d to endpoint %d. endpoint doesn't exist anymore.\n", messages_txt[message->type], message->id_from, message->id_to);
+ }
+ break;
+
+ case EPOINT_TO_JOIN:
+ join = find_join_id(message->id_to);
+ if (join) {
+ join->message_epoint(message->id_from, message->type, &message->param);
+ } else {
+ PDEBUG(DEBUG_MSG, "Warning: message %s from endpoint %d to join %d. join doesn't exist anymore\n", messages_txt[message->type], message->id_from, message->id_to);
+ }
+ break;
+
+ case JOIN_TO_EPOINT:
+ epoint = find_epoint_id(message->id_to);
+ if (epoint) {
+ if (epoint->ep_app) {
+ epoint->ep_app->ea_message_join(message->id_from, message->type, &message->param);
+ } else {
+ PDEBUG(DEBUG_MSG, "Warning: message %s from join %d to endpoint %d. endpoint doesn't have an application.\n", messages_txt[message->type], message->id_from, message->id_to);
+ }
+ } else {
+ PDEBUG(DEBUG_MSG, "Warning: message %s from join %d to endpoint %d. endpoint doesn't exist anymore.\n", messages_txt[message->type], message->id_from, message->id_to);
+ }
+ break;
+
+ case EPOINT_TO_PORT:
+ port = find_port_id(message->id_to);
+ if (port) {
+ port->message_epoint(message->id_from, message->type, &message->param);
+BUDETECT
+ } else {
+ PDEBUG(DEBUG_MSG, "Warning: message %s from endpoint %d to port %d. port doesn't exist anymore\n", messages_txt[message->type], message->id_from, message->id_to);
+ }
+ break;
+
+ default:
+ PERROR("Message flow %d unknown.\n", message->flow);
+ }
+ message_free(message);
+ }
+
+ return 0;
+}
+