* Taeheon Kim <th908.kim@samsung.com>,
* YoungJun Cho <yj44.cho@samsung.com>,
* SooChan Lim <sc1.lim@samsung.com>,
- * Boram Park <sc1.lim@samsung.com>
+ * Boram Park <boram1288.park@samsung.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
#include "tdm_log.h"
#include "tdm_macro.h"
-//#define TDM_CONFIG_ASSERT
-
#define LOG_MAX_LEN 4076
#define COLOR_RED "\x1b[31m" /* for error */
static unsigned int dlog_enable = 1;
static unsigned int color_enable = 1;
-static unsigned int debug_level = TDM_LOG_LEVEL_INFO;
-static unsigned int need_check_env = 1;
+static unsigned int assert_level = TDM_LOG_LEVEL_NONE;
static unsigned int log_lock_init;
static pthread_mutex_t log_lock;
-static void
-_tdm_log_check_env(void)
-{
- const char *str;
- char *end;
+unsigned int tdm_log_debug_level = TDM_LOG_LEVEL_INFO;
- str = getenv("TDM_DEBUG_LEVEL");
- if (str)
- debug_level = strtol(str, &end, 10);
-
- str = getenv("TDM_DEBUG");
- if (str && (strstr(str, "1")))
- debug_level = TDM_LOG_LEVEL_DBG;
-
- str = getenv("TDM_DLOG");
- if (str && (strstr(str, "0")))
- dlog_enable = 0;
-}
+static int stdout_fd = -1;
EXTERN void
tdm_log_enable_color(unsigned int enable)
{
color_enable = enable;
+ TDM_INFO("color_enable: %d", color_enable);
}
EXTERN void
tdm_log_enable_dlog(unsigned int enable)
{
+ const char *str = getenv("TDM_DLOG");
+ if (str)
+ enable = (str[0] == '1') ? 1 : 0;
dlog_enable = enable;
+ TDM_INFO("dlog_enable: %d", dlog_enable);
}
EXTERN void
-tdm_log_enable_debug(unsigned int enable)
+tdm_log_set_debug_level(int level)
{
- if (enable)
- debug_level = TDM_LOG_LEVEL_DBG;
- else
- debug_level = TDM_LOG_LEVEL_INFO;
+ const char *str = getenv("TDM_DEBUG_LEVEL");
+ if (str)
+ level = str[0] - '0';
+ tdm_log_debug_level = level;
+ TDM_INFO("debug_level: %d", tdm_log_debug_level);
}
EXTERN void
-tdm_log_set_debug_level(int level)
+tdm_log_set_assert_level(int level)
{
- debug_level = level;
+ const char *str = getenv("TDM_ASSERT_LEVEL");
+ if (str)
+ level = str[0] - '0';
+ assert_level = level;
+ TDM_INFO("assert_level: %d", assert_level);
}
EXTERN void
-tdm_log_print(int level, const char *fmt, ...)
+tdm_log_set_path(const char *path)
{
- va_list arg;
+ TDM_INFO("log_path: %s", path);
+
+ if (!path) {
+ if (stdout_fd != -1) {
+ fflush(stdout);
+ close(STDOUT_FILENO);
+ dup2(stdout_fd, STDOUT_FILENO);
+ close(stdout_fd);
+ stdout_fd = -1;
+ }
+ } else {
+ char fd_name[TDM_PATH_LEN];
+ int log_fd = -1;
+ FILE *log_fl;
+
+ snprintf(fd_name, TDM_PATH_LEN, "%s", path);
+
+ log_fl = fopen(fd_name, "a");
+ if (!log_fl) {
+ TDM_ERR("failed: open file(%s)\n", fd_name);
+ return;
+ }
+
+ if (stdout_fd == -1) {
+ fflush(stdout);
+ stdout_fd = dup(STDOUT_FILENO);
+ if (stdout_fd < 0) {
+ TDM_ERR("dup failed: %m\n");
+ fclose(log_fl);
+ return;
+ }
+ }
+
+ setvbuf(log_fl, NULL, _IOLBF, 512);
+ log_fd = fileno(log_fl);
+ close(STDOUT_FILENO);
+ dup2(log_fd, STDOUT_FILENO);
+ fclose(log_fl);
+ TDM_INFO("log_path: %s done", path);
+ }
+}
+
+static void
+_tdm_log_vprint_stdout(int level, const char *fmt, va_list ap)
+{
if (!log_lock_init) {
log_lock_init = 1;
pthread_mutex_init(&log_lock, NULL);
-
}
- if (need_check_env) {
- need_check_env = 0;
- _tdm_log_check_env();
- }
+ if (level > tdm_log_debug_level)
+ return;
+
+ char *lvl_str[] = {"TDM_NON", "TDM_ERR", "TDM_WRN", "TDM_INF", "TDM_DBG"};
+ char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET};
+
+ pthread_mutex_lock(&log_lock);
+
+ if (color_enable)
+ printf("%s", color[level]);
+ printf("[%s]", lvl_str[level]);
+ if (color_enable)
+ printf(COLOR_RESET);
+ vprintf(fmt, ap);
+ printf("\n");
+ pthread_mutex_unlock(&log_lock);
+}
- if (level > debug_level)
+
+EXTERN void
+tdm_log_printf(int level, const char *fmt, ...)
+{
+ va_list arg;
+ va_start(arg, fmt);
+ _tdm_log_vprint_stdout(level, fmt, arg);
+ va_end(arg);
+}
+
+EXTERN void
+tdm_log_print(int level, const char *fmt, ...)
+{
+ va_list arg;
+
+ if (level > tdm_log_debug_level)
return;
if (dlog_enable) {
return;
}
va_start(arg, fmt);
- dlog_vprint(dlog_prio, LOG_TAG, fmt, arg);
+ __dlog_vprint(LOG_ID_SYSTEM, dlog_prio, LOG_TAG, fmt, arg);
va_end(arg);
} else {
- struct timespec ts;
- char *lvl_str[] = {"TDM_NON", "TDM_ERR", "TDM_WRN", "TDM_INF", "TDM_DBG"};
- char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET};
-
- clock_gettime(CLOCK_MONOTONIC, &ts);
-
- pthread_mutex_lock(&log_lock);
-
- if (color_enable)
- printf("%s", color[level]);
- printf("[%s]", lvl_str[level]);
- if (color_enable)
- printf(COLOR_RESET);
- printf("[%d.%06d]", (int)ts.tv_sec, (int)ts.tv_nsec / 1000);
va_start(arg, fmt);
- vprintf(fmt, arg);
+ _tdm_log_vprint_stdout(level, fmt, arg);
va_end(arg);
-
- pthread_mutex_unlock(&log_lock);
}
-#ifdef TDM_CONFIG_ASSERT
- if (level < 3)
- assert(0);
-#endif
+ assert(level > assert_level);
+}
+
+EXTERN void
+tdm_log_reset(void)
+{
+ pthread_mutex_unlock(&log_lock);
}