Cleanup error.h __lttng_print() used for message printing
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 19 May 2016 15:57:45 +0000 (11:57 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 20 May 2016 20:41:29 +0000 (16:41 -0400)
The loglevels have never really been a mask, and it is useless to try to
use them as masks, because the compiler statically knows the value of
the loglevel requested, and can therefore optimise away all the logic.

This takes care of Coverity warning about mixed bitwise and boolean
logic, which was technically correct, but more complex than needed.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/error.h

index 29c9bc888d13d5bd1970596902cd263978041b6d..29c6833a9f90cd63500b94e68741987c0534181f 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
+#include <stdbool.h>
 #include <urcu/tls-compat.h>
 #include <time.h>
 
@@ -52,13 +53,62 @@ extern int lttng_opt_verbose;
 extern int lttng_opt_mi;
 
 /* Error type. */
-#define PRINT_ERR   (1 << 0)
-#define PRINT_WARN  (1 << 1)
-#define PRINT_BUG   (1 << 2)
-#define PRINT_MSG   (1 << 3)
-#define PRINT_DBG   (1 << 4)
-#define PRINT_DBG2  (1 << 5)
-#define PRINT_DBG3  (1 << 6)
+enum lttng_error_type {
+       PRINT_ERR =     0,
+       PRINT_BUG =     1,
+       PRINT_WARN =    2,
+       PRINT_MSG =     3,
+       PRINT_DBG =     4,
+       PRINT_DBG2 =    5,
+       PRINT_DBG3 =    6,
+};
+
+static inline bool __lttng_print_check_opt(enum lttng_error_type type)
+{
+       /* lttng_opt_mi and lttng_opt_quiet. */
+       switch (type) {
+       case PRINT_DBG3:
+       case PRINT_DBG2:
+       case PRINT_DBG:
+       case PRINT_MSG:
+               if (lttng_opt_mi) {
+                       return false;
+               }
+               /* Fall-through. */
+       case PRINT_WARN:
+       case PRINT_BUG:
+       case PRINT_ERR:
+               if (lttng_opt_quiet) {
+                       return false;
+               }
+       }
+
+       /* lttng_opt_verbose */
+       switch (type) {
+       case PRINT_DBG3:
+               if (lttng_opt_verbose < 3) {
+                       return false;
+               }
+               break;
+       case PRINT_DBG2:
+               if (lttng_opt_verbose < 2) {
+                       return false;
+               }
+               break;
+       case PRINT_DBG:
+               if (lttng_opt_verbose < 1) {
+                       return false;
+               }
+               break;
+       case PRINT_MSG:
+       case PRINT_WARN:
+       case PRINT_BUG:
+       case PRINT_ERR:
+               break;
+       }
+
+       return true;
+}
 
 /*
  * Macro for printing message depending on command line option and verbosity.
@@ -68,23 +118,12 @@ extern int lttng_opt_mi;
  * want any nested msg to show up when printing mi to stdout(if it's the case).
  * All warnings and errors should be printed to stderr as normal.
  */
-#define __lttng_print(type, fmt, args...)                                          \
-       do {                                                                       \
-               if (!lttng_opt_quiet && !lttng_opt_mi &&                           \
-                               (type) == PRINT_MSG) {                             \
-                       fprintf(stdout, fmt, ## args);                             \
-               } else if (!lttng_opt_quiet && !lttng_opt_mi &&                    \
-                               ((((type) & PRINT_DBG) && lttng_opt_verbose == 1) || \
-                               (((type) & (PRINT_DBG | PRINT_DBG2)) &&            \
-                                       lttng_opt_verbose == 2) ||                 \
-                               (((type) & (PRINT_DBG | PRINT_DBG2 | PRINT_DBG3)) && \
-                                       lttng_opt_verbose == 3))) {                \
-                       fprintf(stderr, fmt, ## args);                             \
-               } else if (!lttng_opt_quiet &&                                     \
-                               ((type) & (PRINT_WARN | PRINT_ERR | PRINT_BUG))) { \
-                       fprintf(stderr, fmt, ## args);                             \
-               }                                                                  \
-       } while (0);
+#define __lttng_print(type, fmt, args...)                                              \
+       do {                                                                            \
+               if (__lttng_print_check_opt(type)) {                                    \
+                       fprintf((type) == PRINT_MSG ? stdout : stderr, fmt, ## args);   \
+               }                                                                       \
+       } while (0)
 
 /* Three level of debug. Use -v, -vv or -vvv for the levels */
 #define _ERRMSG(msg, type, fmt, args...) __lttng_print(type, msg \
This page took 0.052216 seconds and 4 git commands to generate.