2007-05-06 13:54:52 +00:00
/*****************************************************************************\
* * * *
2007-07-18 09:44:25 +00:00
* * Linux Call Route * *
2007-05-06 13:54:52 +00:00
* * * *
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
* * Copyright : Andreas Eversberg * *
* * * *
* * message handling * *
* * * *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "main.h"
MESSAGES
2008-04-25 07:06:20 +00:00
struct lcr_msg * message_first = NULL ;
struct lcr_msg * * messagepointer_end = & message_first ;
2010-01-16 10:20:23 +00:00
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 ) ;
}
2007-05-06 13:54:52 +00:00
/* creates a new message with the given attributes. the message must be filled then. after filling, the message_put must be called */
2008-04-25 07:06:20 +00:00
struct lcr_msg * message_create ( int id_from , int id_to , int flow , int type )
2007-05-06 13:54:52 +00:00
{
2008-04-25 07:06:20 +00:00
struct lcr_msg * message ;
2007-05-06 13:54:52 +00:00
2008-04-25 07:06:20 +00:00
message = ( struct lcr_msg * ) MALLOC ( sizeof ( struct lcr_msg ) ) ;
2007-05-06 13:54:52 +00:00
if ( ! message )
2007-07-15 10:01:27 +00:00
FATAL ( " No memory for message. \n " ) ;
2007-05-06 13:54:52 +00:00
mmemuse + + ;
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 */
2012-01-14 17:36:26 +00:00
void _message_put ( struct lcr_msg * message , const char * file , int line )
2007-05-06 13:54:52 +00:00
{
2009-07-05 20:14:21 +00:00
if ( message - > id_to = = 0 ) {
2007-05-06 13:54:52 +00:00
PDEBUG ( DEBUG_MSG , " message %s not written, because destination is 0. \n " , messages_txt [ message - > type ] ) ;
message_free ( message ) ;
return ;
}
2012-01-14 17:36:26 +00:00
if ( ( options . deb & DEBUG_MSG ) )
PDEBUG ( DEBUG_MSG , " message %s written from %ld to %ld (memory %x at file %s, line %d) \n " , messages_txt [ message - > type ] , message - > id_from , message - > id_to , message , file , line ) ;
2007-05-06 13:54:52 +00:00
* messagepointer_end = message ;
messagepointer_end = & ( message - > next ) ;
2009-01-06 17:44:41 +00:00
/* Nullify next pointer if recycled messages */
* messagepointer_end = NULL ;
2010-01-16 10:20:23 +00:00
/* trigger work */
trigger_work ( & message_work ) ;
2007-05-06 13:54:52 +00:00
}
2008-04-25 07:06:20 +00:00
struct lcr_msg * message_forward ( int id_from , int id_to , int flow , union parameter * param )
2007-07-15 10:01:27 +00:00
{
2008-04-25 07:06:20 +00:00
struct lcr_msg * message ;
2007-07-15 10:01:27 +00:00
/* get point to message */
2008-04-25 07:06:20 +00:00
message = ( struct lcr_msg * ) ( ( unsigned long ) param - ( ( unsigned long ) ( & message - > param ) - ( unsigned long ) message ) ) ;
2007-07-15 10:01:27 +00:00
/* protect, so forwarded messages are not freed after handling */
message - > keep = 1 ;
message - > id_from = id_from ;
message - > id_to = id_to ;
message - > flow = flow ;
message_put ( message ) ;
2007-08-11 08:12:10 +00:00
return ( message ) ;
2007-07-15 10:01:27 +00:00
}
2007-05-06 13:54:52 +00:00
/* detaches the first messages from the message chain */
2008-04-25 07:06:20 +00:00
struct lcr_msg * message_get ( void )
2007-05-06 13:54:52 +00:00
{
2008-04-25 07:06:20 +00:00
struct lcr_msg * message ;
2007-05-06 13:54:52 +00:00
if ( ! message_first )
return ( 0 ) ;
message = message_first ;
message_first = message - > next ;
if ( ! message_first )
messagepointer_end = & message_first ;
2007-07-15 10:01:27 +00:00
message - > keep = 0 ;
2012-01-14 17:36:26 +00:00
if ( ( options . deb & DEBUG_MSG ) )
2007-05-06 13:54:52 +00:00
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 */
2008-04-25 07:06:20 +00:00
void message_free ( struct lcr_msg * message )
2007-05-06 13:54:52 +00:00
{
2007-07-15 10:01:27 +00:00
if ( message - > keep )
return ;
2008-04-25 07:06:20 +00:00
FREE ( message , sizeof ( struct lcr_msg ) ) ;
2007-05-06 13:54:52 +00:00
mmemuse - - ;
}
2010-01-16 10:20:23 +00:00
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 ;
}