From 2ed0fee489c37a6e2d4473f6185ebbe3e746ac11 Mon Sep 17 00:00:00 2001 From: Super User Date: Sun, 6 May 2007 15:54:52 +0200 Subject: only for backup, still in coding state - no compile!!! --- message.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 message.c (limited to 'message.c') diff --git a/message.c b/message.c new file mode 100644 index 0000000..97c032c --- /dev/null +++ b/message.c @@ -0,0 +1,128 @@ +/*****************************************************************************\ +** ** +** PBX4Linux ** +** ** +**---------------------------------------------------------------------------** +** Copyright: Andreas Eversberg ** +** ** +** message handling ** +** ** +\*****************************************************************************/ + +#include +#include +#include +#include "main.h" + +MESSAGES + +struct message *message_first = NULL; +struct message **messagepointer_end = &message_first; + +//#ifdef H323 +//PMutex mutex_message; +//#endif + +/* creates a new message with the given attributes. the message must be filled then. after filling, the message_put must be called */ +struct message *message_create(int id_from, int id_to, int flow, int type) +{ + struct message *message; + int i = 0; + + while(i < 10) + { + message = (struct message *)calloc(1, sizeof(struct message)); + if (message) + break; + + if (!i) + PERROR("no mem for message, retrying...\n"); + i++; + usleep(300000); + } + if (!message) + { + PERROR("***Fatal error: no mem for message!!! exitting.\n"); + exit(-1); + } + mmemuse++; + + memset(message, 0, sizeof(struct message)); + + message->id_from = id_from; + message->id_to = id_to; + message->flow = flow; + message->type = type; + + return(message); +} + +/* attaches a message to the end of the message chain */ +void message_put(struct message *message) +{ + /* the mutex prevents from creating two messages at a time (h323 thread and main thread). */ +//#ifdef H323 +// mutex_message.Wait(); +//#endif + + if (message->id_to == 0) + { + PDEBUG(DEBUG_MSG, "message %s not written, because destination is 0.\n", messages_txt[message->type]); + message_free(message); + return; + } + + if ((options.deb&DEBUG_MSG) && message->type != MESSAGE_DATA) + PDEBUG(DEBUG_MSG, "message %s written from %ld to %ld (memory %x)\n", messages_txt[message->type], message->id_from, message->id_to, message); + + *messagepointer_end = message; + messagepointer_end = &(message->next); + +//#ifdef H323 +// mutex_message.Signal(); +//#endif +} + + +/* detaches the first messages from the message chain */ +struct message *message_get(void) +{ + struct message *message; + + /* the mutex prevents from getting a message while creating a messages at a time (h323 thread and main thread). */ +//#ifdef H323 +// mutex_message.Wait(); +//#endif + + if (!message_first) + { +//#ifdef H323 +// mutex_message.Signal(); +//#endif + return(0); + } + + message = message_first; + message_first = message->next; + if (!message_first) + messagepointer_end = &message_first; + +//#ifdef H323 +// mutex_message.Signal(); +//#endif + + if ((options.deb&DEBUG_MSG) && message->type != MESSAGE_DATA) + PDEBUG(DEBUG_MSG, "message %s reading from %ld to %ld (memory %x)\n", messages_txt[message->type], message->id_from, message->id_to, message); + + return(message); +} + +/* free a message */ +void message_free(struct message *message) +{ + memset(message, 0, sizeof(struct message)); + free(message); + mmemuse--; +} + + -- cgit v1.2.3-55-g7522