Add critical log level
[lttng-ust.git] / src / common / logging.h
index 4001c8852b90aabde67035d942506697ed321336..c98644d87c8128c3caf2debe0e841f830c82ba22 100644 (file)
@@ -5,8 +5,8 @@
  * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
  */
 
-#ifndef _USTERR_SIGNAL_SAFE_H
-#define _USTERR_SIGNAL_SAFE_H
+#ifndef _UST_COMMON_LOGGING_H
+#define _UST_COMMON_LOGGING_H
 
 #include <string.h>
 #include <sys/types.h>
 #include <stdarg.h>
 #include <stdbool.h>
 #include <stdio.h>
+
+#include <lttng/ust-utils.h>
+#include <urcu/compiler.h>
+#include <urcu/system.h>
+
 #include "common/patient.h"
 #include "common/compat/tid.h"
 #include "common/safe-snprintf.h"
 
-enum ust_err_loglevel {
-       UST_ERR_LOGLEVEL_UNKNOWN = 0,
-       UST_ERR_LOGLEVEL_NORMAL,
-       UST_ERR_LOGLEVEL_DEBUG,
+enum lttng_ust_log_level {
+       LTTNG_UST_LOG_LEVEL_UNKNOWN = 0,
+       LTTNG_UST_LOG_LEVEL_SILENT,
+       LTTNG_UST_LOG_LEVEL_DEBUG,
+};
+
+enum lttng_ust_log_critical_action {
+       LTTNG_UST_LOG_CRITICAL_ACTION_UNKNOWN = 0,
+       LTTNG_UST_LOG_CRITICAL_ACTION_NONE,
+       LTTNG_UST_LOG_CRITICAL_ACTION_ABORT,
 };
 
-extern volatile enum ust_err_loglevel ust_err_loglevel
+extern int lttng_ust_log_level                 /* enum lttng_ust_log_level */
        __attribute__((visibility("hidden")));
 
-void ust_err_init(void)
+extern int lttng_ust_log_critical_action               /* enum lttng_ust_log_critical_action */
+       __attribute__((visibility("hidden")));
+
+/*
+ * Initialize the global log level from the "LTTNG_UST_DEBUG" environment
+ * variable and the global log critical action from "LTTNG_UST_ABORT_ON_CRITICAL".
+ *
+ * This could end up being called concurrently by multiple threads but doesn't
+ * require a mutex since the input is invariant across threads and the result
+ * will be the same.
+ */
+void lttng_ust_logging_init(void)
        __attribute__((visibility("hidden")));
 
 #ifdef LTTNG_UST_DEBUG
-static inline bool ust_err_debug_enabled(void)
+static inline
+bool lttng_ust_logging_debug_enabled(void)
 {
        return true;
 }
 #else /* #ifdef LTTNG_UST_DEBUG */
-static inline bool ust_err_debug_enabled(void)
+static inline
+bool lttng_ust_logging_debug_enabled(void)
 {
-       return ust_err_loglevel == UST_ERR_LOGLEVEL_DEBUG;
+       int current_log_level;
+
+       current_log_level = CMM_LOAD_SHARED(lttng_ust_log_level);
+
+       /* If the global log level is unknown, lazy-initialize it. */
+       if (caa_unlikely(current_log_level == LTTNG_UST_LOG_LEVEL_UNKNOWN)) {
+               lttng_ust_logging_init();
+               current_log_level = CMM_LOAD_SHARED(lttng_ust_log_level);
+       }
+
+       return current_log_level == LTTNG_UST_LOG_LEVEL_DEBUG;
 }
-#endif /* #else #ifdef LTTNG_UST_DEBUG */
+#endif /* #ifdef LTTNG_UST_DEBUG */
+
+#ifdef LTTNG_UST_ABORT_ON_CRITICAL
+static inline
+bool lttng_ust_logging_abort_on_critical_enabled(void)
+{
+       return true;
+}
+#else /* #ifdef LTTNG_UST_ABORT_ON_CRITICAL */
+static inline
+bool lttng_ust_logging_abort_on_critical_enabled(void)
+{
+       int current_log_critical_action;
+
+       current_log_critical_action = CMM_LOAD_SHARED(lttng_ust_log_critical_action);
+
+       /* If the global log critical action is unknown, lazy-initialize it. */
+       if (caa_unlikely(current_log_critical_action == LTTNG_UST_LOG_CRITICAL_ACTION_UNKNOWN)) {
+               lttng_ust_logging_init();
+               current_log_critical_action = CMM_LOAD_SHARED(lttng_ust_log_critical_action);
+       }
+
+       return current_log_critical_action == LTTNG_UST_LOG_CRITICAL_ACTION_ABORT;
+}
+#endif /* #ifdef LTTNG_UST_ABORT_ON_CRITICAL */
 
 /*
- * The default component for error messages.
+ * The default component for log statements.
  */
 #ifndef UST_COMPONENT
 #define UST_COMPONENT libust
 #endif
 
-/* To stringify the expansion of a define */
-#define UST_XSTR(d) UST_STR(d)
-#define UST_STR(s) #s
-
-#define UST_ERR_MAX_LEN        512
+#define LTTNG_UST_LOG_MAX_LEN  512
 
 /*
  * We sometimes print in the tracing path, and tracing can occur in
  * signal handlers, so we must use a print method which is signal safe.
  */
-/* Can't use dynamic allocation. Limit ourselves to UST_ERR_MAX_LEN chars. */
+/* Can't use dynamic allocation. Limit ourselves to LTTNG_UST_LOG_MAX_LEN chars. */
 /* Add end of string in case of buffer overflow. */
 #define sigsafe_print_err(fmt, args...)                                        \
 do {                                                                   \
-       if (ust_err_debug_enabled()) {                                  \
-               char ____buf[UST_ERR_MAX_LEN];                          \
+       if (lttng_ust_logging_debug_enabled()) {                        \
+               char ____buf[LTTNG_UST_LOG_MAX_LEN];                    \
                int ____saved_errno;                                    \
                                                                        \
                ____saved_errno = errno;        /* signal-safety */     \
@@ -76,11 +130,11 @@ do {                                                                       \
        }                                                               \
 } while (0)
 
-#define UST_STR_COMPONENT UST_XSTR(UST_COMPONENT)
+#define LTTNG_UST_STR_COMPONENT lttng_ust_stringify(UST_COMPONENT)
 
 #define ERRMSG(fmt, args...)                   \
        do {                                    \
-               sigsafe_print_err(UST_STR_COMPONENT "[%ld/%ld]: " fmt " (in %s() at " __FILE__ ":" UST_XSTR(__LINE__) ")\n", \
+               sigsafe_print_err(LTTNG_UST_STR_COMPONENT "[%ld/%ld]: " fmt " (in %s() at " __FILE__ ":" lttng_ust_stringify(__LINE__) ")\n", \
                (long) getpid(),                \
                (long) lttng_gettid(),          \
                ## args, __func__);             \
@@ -91,7 +145,13 @@ do {                                                                        \
 #define DBG_raw(fmt, args...)  sigsafe_print_err(fmt, ## args)
 #define WARN(fmt, args...)     ERRMSG("Warning: " fmt, ## args)
 #define ERR(fmt, args...)      ERRMSG("Error: " fmt, ## args)
-#define BUG(fmt, args...)      ERRMSG("BUG: " fmt, ## args)
+#define CRIT(fmt, args...)                                             \
+       do {                                                            \
+               ERRMSG("Critical: " fmt, ## args);                      \
+               if (lttng_ust_logging_abort_on_critical_enabled()) {    \
+                       abort();                                        \
+               }                                                       \
+       } while(0)
 
 #if !defined(__GLIBC__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE))
 /*
@@ -99,7 +159,7 @@ do {                                                                 \
  */
 #define PERROR(call, args...)                                          \
        do {                                                            \
-               if (ust_err_debug_enabled()) {                          \
+               if (lttng_ust_logging_debug_enabled()) {                \
                        char perror_buf[200] = "Error in strerror_r()"; \
                        strerror_r(errno, perror_buf,                   \
                                        sizeof(perror_buf));            \
@@ -113,7 +173,7 @@ do {                                                                        \
  */
 #define PERROR(call, args...)                                          \
        do {                                                            \
-               if (ust_err_debug_enabled()) {                          \
+               if (lttng_ust_logging_debug_enabled()) {                \
                        char *perror_buf;                               \
                        char perror_tmp[200];                           \
                        perror_buf = strerror_r(errno, perror_tmp,      \
@@ -136,4 +196,4 @@ do {                                                                        \
        } while(0)
 #define WARN_ON_ONCE(condition) WARN_ON(condition)
 
-#endif /* _USTERR_SIGNAL_SAFE_H */
+#endif /* _UST_COMMON_LOGGING_H */
This page took 0.025851 seconds and 4 git commands to generate.