+/*
+ * Contains the string of the log entry time. This is used as a thread local
+ * storage so we don't race between thread and also avoid memory allocation
+ * every time a log is fired.
+ */
+struct log_time {
+ /* Format: 00:00:00.000000 plus NULL byte. */
+ char str[16];
+};
+extern DECLARE_URCU_TLS(struct log_time, error_log_time);
+
+extern int lttng_opt_quiet;
+extern int lttng_opt_verbose;
+extern int lttng_opt_mi;
+
+/* Error type. */
+enum lttng_error_level {
+ 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_level 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;
+ }