Mirror of the lttng-dev mailing list
 help / color / mirror / Atom feed
From: mathieu.desnoyers@efficios.com (Mathieu Desnoyers)
Subject: [lttng-dev] [PATCH lttng-tools 4/4] Cleanup error.h __lttng_print() used for message printing
Date: Thu, 19 May 2016 11:57:45 -0400	[thread overview]
Message-ID: <1463673465-26888-5-git-send-email-mathieu.desnoyers@efficios.com> (raw)
In-Reply-To: <1463673465-26888-1-git-send-email-mathieu.desnoyers@efficios.com>

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 at efficios.com>
---
 src/common/error.h | 110 +++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 81 insertions(+), 29 deletions(-)

diff --git a/src/common/error.h b/src/common/error.h
index 6c239fe..ad6113f 100644
--- a/src/common/error.h
+++ b/src/common/error.h
@@ -22,6 +22,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
+#include <stdbool.h>
 #include <urcu/tls-compat.h>
 #include <time.h>
 
@@ -57,13 +58,79 @@ 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;
+}
+
+void lttng_abort_on_error(void);
+
+static inline void __lttng_print_check_abort(enum lttng_error_type type)
+{
+	switch (type) {
+	case PRINT_DBG3:
+	case PRINT_DBG2:
+	case PRINT_DBG:
+	case PRINT_MSG:
+	case PRINT_WARN:
+		break;
+	case PRINT_BUG:
+	case PRINT_ERR:
+		lttng_abort_on_error();
+	}
+}
 
 /*
  * Macro for printing message depending on command line option and verbosity.
@@ -73,26 +140,13 @@ 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);                             \
-		}                                                                  \
-		if ((type) & (PRINT_ERR | PRINT_BUG)) {                            \
-			lttng_abort_on_error();                                    \
-		}                                                                  \
-	} while (0);
+#define __lttng_print(type, fmt, args...)						\
+	do {										\
+		if (__lttng_print_check_opt(type)) {					\
+			fprintf((type) == PRINT_MSG ? stdout : stderr, fmt, ## args);	\
+		}									\
+		__lttng_print_check_abort(type);					\
+	} while (0)
 
 /* Three level of debug. Use -v, -vv or -vvv for the levels */
 #define _ERRMSG(msg, type, fmt, args...) __lttng_print(type, msg \
@@ -177,6 +231,4 @@ const char *error_get_str(int32_t code);
  */
 const char *log_add_time();
 
-void lttng_abort_on_error(void);
-
 #endif /* _ERROR_H */
-- 
2.1.4



      parent reply	other threads:[~2016-05-19 15:57 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-19 15:57 [lttng-dev] [PATCH lttng-tools 0/4] error.h message printing fixes Mathieu Desnoyers
2016-05-19 15:57 ` [lttng-dev] [PATCH lttng-tools 1/4] Fix: add missing semicolons after MSG, DBG, ERR print macros Mathieu Desnoyers
2016-05-19 18:02   ` Jérémie Galarneau
2016-05-19 15:57 ` [lttng-dev] [PATCH lttng-tools 2/4] Fix: coding style document has erroneous semicolon at end of macro Mathieu Desnoyers
2016-05-19 15:57 ` [lttng-dev] [PATCH lttng-tools 3/4] Update coding style document for macro style Mathieu Desnoyers
2016-05-19 15:57 ` Mathieu Desnoyers [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1463673465-26888-5-git-send-email-mathieu.desnoyers@efficios.com \
    --to=mathieu.desnoyers@efficios.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox