Mercurial > hg > freeDiameter
diff libfdproto/messages.c @ 689:933d098fc75d
Cleanups in msg_log feature
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Thu, 20 Jan 2011 14:24:13 +0900 |
parents | 8c3dc8584dab |
children | a29e4201d511 |
line wrap: on
line diff
--- a/libfdproto/messages.c Wed Jan 19 19:05:30 2011 +0900 +++ b/libfdproto/messages.c Thu Jan 20 14:24:13 2011 +0900 @@ -2324,130 +2324,3 @@ } -/***************************************************************************************************************/ -/* messages logging facility */ -#include <stdarg.h> - -static struct { - struct { - enum fd_msg_log_method meth; - const char * metharg; - } causes[FD_MSG_LOG_MAX + 1]; - pthread_mutex_t lock; - int init; - struct dictionary *dict; -} ml_conf = { .lock = PTHREAD_MUTEX_INITIALIZER, .init = 0 }; - -void ml_conf_init(struct dictionary *dict) -{ - memset(&ml_conf.causes, 0, sizeof(ml_conf.causes)); - ml_conf.init = 1; - ml_conf.dict = dict; -} - -/* Set a configuration property */ -int fd_msg_log_config(enum fd_msg_log_cause cause, enum fd_msg_log_method method, const char * arg) -{ - /* Check the parameters are valid */ - TRACE_ENTRY("%d %d %p", cause, method, arg); - CHECK_PARAMS( (cause >= 0) && (cause <= FD_MSG_LOG_MAX) ); - CHECK_PARAMS( (method >= FD_MSG_LOGTO_DEBUGONLY) && (method <= FD_MSG_LOGTO_DIR) ); - CHECK_PARAMS( (method == FD_MSG_LOGTO_DEBUGONLY) || (arg != NULL) ); - - /* Lock the configuration */ - CHECK_POSIX( pthread_mutex_lock(&ml_conf.lock) ); - if (!ml_conf.init) { - ASSERT(0); - } - - /* Now set the parameter */ - ml_conf.causes[cause].meth = method; - ml_conf.causes[cause].metharg = arg; - - if (method) { - TRACE_DEBUG(INFO, "Logging %s messages set to %s '%s'", - (cause == FD_MSG_LOG_DROPPED) ? "DROPPED" : - (cause == FD_MSG_LOG_RECEIVED) ? "RECEIVED" : - (cause == FD_MSG_LOG_SENT) ? "SENT" : - "???", - (method == FD_MSG_LOGTO_FILE) ? "file" : - (method == FD_MSG_LOGTO_DIR) ? "directory" : - "???", - arg); - } - - CHECK_POSIX( pthread_mutex_unlock(&ml_conf.lock) ); - - /* Done */ - return 0; -} - -/* Do not log anything within this one, since log lock is held */ -static void fd_cleanup_mutex_silent( void * mutex ) -{ - (void)pthread_mutex_unlock((pthread_mutex_t *)mutex); -} - -/* Really log the message */ -void fd_msg_log( enum fd_msg_log_cause cause, struct msg * msg, const char * prefix_format, ... ) -{ - va_list ap; - enum fd_msg_log_method meth; - const char * metharg; - FILE * fstr; - - TRACE_ENTRY("%d %p %p", cause, msg, prefix_format); - CHECK_PARAMS_DO( (cause >= 0) && (cause <= FD_MSG_LOG_MAX), - { - TRACE_DEBUG(INFO, "Invalid cause received (%d)! Message was:", cause); - fd_msg_dump_walk(INFO, msg); - } ); - - /* First retrieve the config for this message */ - CHECK_POSIX_DO( pthread_mutex_lock(&ml_conf.lock), ); - if (!ml_conf.init) { - ASSERT(0); - } - meth = ml_conf.causes[cause].meth; - metharg = ml_conf.causes[cause].metharg; - CHECK_POSIX_DO( pthread_mutex_unlock(&ml_conf.lock), ); - - /* Okay, now we will create the file descriptor */ - switch (meth) { - case FD_MSG_LOGTO_DEBUGONLY: - fstr = fd_g_debug_fstr; - break; - - case FD_MSG_LOGTO_FILE: - TODO("Log to arg file"); - TODO("Log a note to debug stream"); - break; - case FD_MSG_LOGTO_DIR: - TODO("Log to arg directory in a new file"); - TODO("Log a note to debug stream"); - break; - } - - /* For file methods, let's parse the message so it looks better */ - if ((meth != FD_MSG_LOGTO_DEBUGONLY) && ml_conf.dict) { - CHECK_FCT_DO( fd_msg_parse_dict( msg, ml_conf.dict, NULL ), ); - } - - /* Then dump the prefix message to this stream, & to debug stream */ - (void)pthread_mutex_lock(&fd_log_lock); - pthread_cleanup_push(fd_cleanup_mutex_silent, &fd_log_lock); - va_start(ap, prefix_format); - vfprintf( fstr, prefix_format, ap); - va_end(ap); - fflush(fstr); - pthread_cleanup_pop(0); - (void)pthread_mutex_unlock(&fd_log_lock); - fd_log_debug_fstr(fstr, "\n\n"); - - /* And now the message itself */ - fd_msg_dump_fstr(msg, fstr); - - /* And finally close the stream if needed */ - TODO("close?"); -} -