Hi

Here is a REALLY simple blackbox.

Qu: Do we need to store the timestamp?  I don't have one in there
yet as I didn't want to use up memory more than I had to.

To extract the blackbox load your core file in gdb and:

set print array on
print blackbox

Simple.

The next thing I want to do is separately keep info on the last X (100) 
messages sent or received.
-Info like where it came from, where it's going and it's size.
>From this we could also keep counters like:
-number of TX/RX messages per service
-number of resent/dropped messages, etc...

Any other ideas?

Regards
Angus

diff --git a/exec/logsys.c b/exec/logsys.c
index c919d6f..14e0cf8 100644
--- a/exec/logsys.c
+++ b/exec/logsys.c
@@ -86,12 +86,21 @@ struct logsys_logger logsys_loggers[MAX_LOGGERS];
 
 int logsys_single_id = 0;
 
+#define MAX_LOG_LENGTH 128
+
+#ifndef MAX_BLACKBOX_LOGS
+#define MAX_BLACKBOX_LOGS 1024
+#endif /* MAX_BLACKBOX_LOG */
+
+static int blackbox_pos = 0;
+static char blackbox[MAX_BLACKBOX_LOGS][MAX_LOG_LENGTH];
+
 
 struct log_entry {
        char *file;
        int line;
        int priority;
-       char str[128];
+       char str[MAX_LOG_LENGTH];
        struct log_entry *next;
 };
 
@@ -402,6 +411,46 @@ drop_log_msg:
        }
 }
 
+/*
+ * save the log to the blackbox
+ */
+static void _blackbox_printf (
+       enum logsys_config_mutex_state config_mutex_state,
+       char *file,
+       int line,
+       char *format,
+       va_list ap)
+{
+       char *p = NULL;
+       char newfmt[MAX_LOG_LENGTH];
+
+       if (config_mutex_state == LOGSYS_CONFIG_MUTEX_UNLOCKED) {
+               pthread_mutex_lock (&logsys_config_mutex);
+       }
+       pthread_mutex_lock (&logsys_new_log_mutex);
+
+       p = strrchr(file, '/');
+       if (p) 
+               file = ++p;
+
+       snprintf (newfmt, MAX_LOG_LENGTH, "[%s:%04u] %s", file, line, format);
+       vsnprintf (&blackbox[blackbox_pos], MAX_LOG_LENGTH, newfmt, ap);
+
+       if (blackbox_pos >= (MAX_BLACKBOX_LOGS - 1)) {
+               blackbox_pos = 0;
+       } else {
+               blackbox_pos++;
+       }
+       sprintf(&blackbox[blackbox_pos], "*** END OF BLACK BOX ***");
+
+       pthread_mutex_unlock (&logsys_new_log_mutex);
+       if (config_mutex_state == LOGSYS_CONFIG_MUTEX_UNLOCKED) {
+               pthread_mutex_unlock (&logsys_config_mutex);
+       }
+       return;
+
+}
+
 unsigned int _logsys_subsys_create (
        const char *subsys,
        unsigned int priority)
@@ -532,6 +581,10 @@ void logsys_log_printf (
 
        assert (id < MAX_LOGGERS);
 
+       va_start (ap, format);
+       _blackbox_printf (LOGSYS_CONFIG_MUTEX_UNLOCKED, file, line, format, ap);
+       va_end(ap);
+       
        if (LOG_LEVEL(priority) > logsys_loggers[id].priority) {
                return;
        }
@@ -555,6 +608,10 @@ static void logsys_log_printf_locked (
 
        assert (id < MAX_LOGGERS);
 
+       va_start (ap, format);
+       _blackbox_printf (LOGSYS_CONFIG_MUTEX_LOCKED, file, line, format, ap);
+       va_end(ap);
+
        if (LOG_LEVEL(priority) > logsys_loggers[id].priority) {
                return;
        }
@@ -577,6 +634,7 @@ void _logsys_log_printf2 (
        assert (id < MAX_LOGGERS);
 
        va_start (ap, format);
+       _blackbox_printf (LOGSYS_CONFIG_MUTEX_UNLOCKED, file, line, format, ap);
        _log_printf (LOGSYS_CONFIG_MUTEX_UNLOCKED, file, line, priority, id,
                format, ap);
        va_end(ap);
@@ -584,13 +642,16 @@ void _logsys_log_printf2 (
 
 void _logsys_trace (char *file, int line, int tag, int id, char *format, ...)
 {
+       va_list ap;
        assert (id < MAX_LOGGERS);
 
        pthread_mutex_lock (&logsys_config_mutex);
 
-       if (tag & logsys_loggers[id].tags) {
-               va_list ap;
+       va_start (ap, format);
+       _blackbox_printf (LOGSYS_CONFIG_MUTEX_LOCKED, file, line, format, ap);
+       va_end(ap);
 
+       if (tag & logsys_loggers[id].tags) {
                va_start (ap, format);
                _log_printf (LOGSYS_CONFIG_MUTEX_LOCKED, file, line,
                        LOG_LEVEL_DEBUG, id, format, ap);

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to