@ -8,58 +8,90 @@
# include "ice.h"
# include "ice.h"
# include "log.h"
# include "log.h"
INLINE void log_info_clear ( void ) {
switch ( log_info . e ) {
INLINE void __log_info_release ( struct log_info * li ) {
switch ( li - > e ) {
case LOG_INFO_NONE :
case LOG_INFO_NONE :
return ;
return ;
case LOG_INFO_CALL :
case LOG_INFO_CALL :
obj_put ( log_info . u . call ) ;
obj_put ( li - > u . call ) ;
break ;
break ;
case LOG_INFO_STREAM_FD :
case LOG_INFO_STREAM_FD :
obj_put ( log_info . u . stream_fd ) ;
obj_put ( li - > u . stream_fd ) ;
break ;
break ;
case LOG_INFO_ICE_AGENT :
case LOG_INFO_ICE_AGENT :
obj_put ( & log_info . u . ice_agent - > tt_obj ) ;
obj_put ( & li - > u . ice_agent - > tt_obj ) ;
break ;
break ;
case LOG_INFO_STR :
case LOG_INFO_STR :
case LOG_INFO_C_STRING :
case LOG_INFO_C_STRING :
break ;
break ;
}
}
log_info . e = LOG_INFO_NONE ;
log_info . u . ptr = NULL ;
}
}
INLINE void __log_info_push ( void ) {
struct log_info * copy = g_slice_alloc ( sizeof ( * copy ) ) ;
* copy = log_info ;
log_info_stack = g_slist_prepend ( log_info_stack , copy ) ;
ZERO ( log_info ) ;
}
/ / should be paired with any invocation of log_info_X ( )
INLINE void log_info_pop ( void ) {
__log_info_release ( & log_info ) ;
if ( ! log_info_stack ) {
ZERO ( log_info ) ;
return ;
}
struct log_info * next = log_info_stack - > data ;
log_info = * next ;
g_slice_free1 ( sizeof ( * next ) , next ) ;
log_info_stack = g_slist_delete_link ( log_info_stack , log_info_stack ) ;
}
/ / clears current log context and entire stack
INLINE void log_info_reset ( void ) {
__log_info_release ( & log_info ) ;
ZERO ( log_info ) ;
while ( log_info_stack ) {
struct log_info * element = log_info_stack - > data ;
__log_info_release ( element ) ;
g_slice_free1 ( sizeof ( * element ) , element ) ;
log_info_stack = g_slist_delete_link ( log_info_stack , log_info_stack ) ;
}
}
INLINE void log_info_call ( struct call * c ) {
INLINE void log_info_call ( struct call * c ) {
log_info_clear ( ) ;
if ( ! c )
if ( ! c )
return ;
return ;
__log_info_push ( ) ;
log_info . e = LOG_INFO_CALL ;
log_info . e = LOG_INFO_CALL ;
log_info . u . call = obj_get ( c ) ;
log_info . u . call = obj_get ( c ) ;
}
}
INLINE void log_info_stream_fd ( struct stream_fd * sfd ) {
INLINE void log_info_stream_fd ( struct stream_fd * sfd ) {
log_info_clear ( ) ;
if ( ! sfd )
if ( ! sfd )
return ;
return ;
__log_info_push ( ) ;
log_info . e = LOG_INFO_STREAM_FD ;
log_info . e = LOG_INFO_STREAM_FD ;
log_info . u . stream_fd = obj_get ( sfd ) ;
log_info . u . stream_fd = obj_get ( sfd ) ;
}
}
INLINE void log_info_str ( const str * s ) {
INLINE void log_info_str ( const str * s ) {
log_info_clear ( ) ;
if ( ! s | | ! s - > s )
if ( ! s | | ! s - > s )
return ;
return ;
__log_info_push ( ) ;
log_info . e = LOG_INFO_STR ;
log_info . e = LOG_INFO_STR ;
log_info . u . str = s ;
log_info . u . str = s ;
}
}
INLINE void log_info_c_string ( const char * s ) {
INLINE void log_info_c_string ( const char * s ) {
log_info_clear ( ) ;
if ( ! s )
if ( ! s )
return ;
return ;
__log_info_push ( ) ;
log_info . e = LOG_INFO_C_STRING ;
log_info . e = LOG_INFO_C_STRING ;
log_info . u . cstr = s ;
log_info . u . cstr = s ;
}
}
INLINE void log_info_ice_agent ( struct ice_agent * ag ) {
INLINE void log_info_ice_agent ( struct ice_agent * ag ) {
log_info_clear ( ) ;
if ( ! ag )
if ( ! ag )
return ;
return ;
__log_info_push ( ) ;
log_info . e = LOG_INFO_ICE_AGENT ;
log_info . e = LOG_INFO_ICE_AGENT ;
log_info . u . ice_agent = obj_get ( & ag - > tt_obj ) ;
log_info . u . ice_agent = obj_get ( & ag - > tt_obj ) ;
}
}