add hal-tdm-log.c file 78/261978/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 29 Jul 2021 04:56:39 +0000 (13:56 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 29 Jul 2021 04:57:25 +0000 (13:57 +0900)
This provide the log functions to print logs via
dlog and stdout.

Change-Id: I7eac5f56303cee52d02eba0375e378faf09731f4

CMakeLists.txt
include/hal-tdm-types.h
src/common.h
src/hal-api-tdm.c
src/hal-tdm-log.c [new file with mode: 0644]

index 17c4620..d0e279f 100644 (file)
@@ -38,7 +38,8 @@ SET(CMAKE_EXE_LINKER_FLAGS "-pie")
 ADD_DEFINITIONS("-DLOG_TAG=\"HALAPI_TDM\"")
 
 SET(SRCS
-        src/hal-api-tdm.c)
+        src/hal-api-tdm.c
+        src/hal-tdm-log.c)
 
 ADD_LIBRARY(           ${PROJECT_NAME} SHARED ${SRCS})
 TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl -lm -Wl,-z,nodelete,--no-undefined)
index 48ca3e2..5afef12 100644 (file)
@@ -36,6 +36,7 @@
 #define __HAL_TDM_TYPES_H__
 
 #include <stdint.h>
+#include <unistd.h>
 #include <tbm_surface.h>
 
 #ifdef __cplusplus
index 419d506..35daf13 100644 (file)
 #ifndef __COMMON_H__
 #define __COMMON_H__
 
+#include <sys/syscall.h>
+#include <time.h>
 #include <dlog.h>
-#define _D(fmt, args...)       SLOGD(fmt, ##args)
-#define _I(fmt, args...)       SLOGI(fmt, ##args)
-#define _W(fmt, args...)       SLOGW(fmt, ##args)
-#define _E(fmt, args...)       SLOGE(fmt, ##args)
+
+/* log level */
+void hal_tdm_log_print(int level, const char *fmt, ...);
+
+#define HAL_TDM_DBG(fmt, args...) \
+       do { \
+               struct timespec ts; \
+               clock_gettime(CLOCK_MONOTONIC, &ts); \
+               hal_tdm_log_print(HAL_TDM_LOG_LEVEL_DBG, "[%5d.%06d][%d][%s %d]"fmt, \
+                                         (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                         (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+       } while (0)
+
+#define HAL_TDM_INFO(fmt, args...) \
+       do { \
+               struct timespec ts; \
+               clock_gettime(CLOCK_MONOTONIC, &ts); \
+               hal_tdm_log_print(HAL_TDM_LOG_LEVEL_INFO, "[%5d.%06d][%d][%s %d]"fmt, \
+                                         (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                         (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+       } while (0)
+
+#define HAL_TDM_WRN(fmt, args...) \
+       do { \
+               struct timespec ts; \
+               clock_gettime(CLOCK_MONOTONIC, &ts); \
+               hal_tdm_log_print(HAL_TDM_LOG_LEVEL_WRN, "[%5d.%06d][%d][%s %d]"fmt, \
+                                         (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                         (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+       } while (0)
+
+#define HAL_TDM_ERR(fmt, args...) \
+       do { \
+               struct timespec ts; \
+               clock_gettime(CLOCK_MONOTONIC, &ts); \
+               hal_tdm_log_print(HAL_TDM_LOG_LEVEL_ERR, "[%5d.%06d][%d][%s %d]"fmt, \
+                                         (int)ts.tv_sec, (int)ts.tv_nsec / 1000, \
+                                         (int)syscall(SYS_gettid), __FUNCTION__, __LINE__, ##args);  \
+       } while (0)
+
+#define HAL_TDM_RETURN_IF_FAIL(cond) {\
+       if (!(cond)) {\
+               HAL_TDM_ERR("'%s' failed.\n", #cond);\
+               return;\
+       } \
+}
+#define HAL_TDM_RETURN_VAL_IF_FAIL(cond, val) {\
+       if (!(cond)) {\
+               HAL_TDM_ERR("'%s' failed.\n", #cond);\
+               return val;\
+       } \
+}
+#define HAL_TDM_GOTO_VAL_IF_FAIL(cond, val) {\
+       if (!(cond)) {\
+               HAL_TDM_ERR("'%s' failed.\n", #cond);\
+               goto val;\
+       } \
+}
+
+enum {
+       HAL_TDM_LOG_LEVEL_NONE,
+       HAL_TDM_LOG_LEVEL_ERR,
+       HAL_TDM_LOG_LEVEL_WRN,
+       HAL_TDM_LOG_LEVEL_INFO,
+       HAL_TDM_LOG_LEVEL_DBG,
+};
 
 #endif /* __COMMON_H__ */
index d1fac87..728a337 100644 (file)
@@ -193,7 +193,7 @@ hal_tdm_get_backend(hal_tdm_error *error)
 
        ret = hal_common_get_backend(HAL_MODULE_TDM, (void **)&backend_data);
        if (ret < 0) {
-                _E("Failed to get backend\n");
+                HAL_TDM_ERR("Failed to get backend\n");
                 if (error)
                        *error = HAL_TDM_ERROR_NO_MODULE;
                return NULL;
@@ -204,7 +204,7 @@ hal_tdm_get_backend(hal_tdm_error *error)
        if (error)
                *error = HAL_TDM_ERROR_NONE;
 
-       _I("hal_tdm_get_backend");
+       HAL_TDM_INFO("hal_tdm_get_backend");
 
        return (hal_tdm_backend *)backend_data;
 }
@@ -216,19 +216,19 @@ hal_tdm_put_backend(hal_tdm_backend *backend)
        int ret;
 
        if (!backend_data && g_hal_tdm_backend_data != backend) {
-               _E("no backend_data\n");
+               HAL_TDM_ERR("no backend_data\n");
                return HAL_TDM_ERROR_NO_MODULE;
        }
 
        ret = hal_common_put_backend(HAL_MODULE_TDM, backend_data);
        if (ret < 0) {
-                _E("Failed to put backend\n");
+                HAL_TDM_ERR("Failed to put backend\n");
                 return HAL_TDM_ERROR_OPERATION_FAILED;
        }
 
        g_hal_tdm_backend_data = NULL;
 
-       _I("hal_tdm_put_backend");
+       HAL_TDM_INFO("hal_tdm_put_backend");
 
        return HAL_TDM_ERROR_NONE;
 }
@@ -240,7 +240,7 @@ hal_tdm_backend_get_display(hal_tdm_backend *backend, hal_tdm_error *error)
        hal_tdm_display *display;
 
        if (!backend_data || g_hal_tdm_backend_data != backend) {
-               _E("no backend_data\n");
+               HAL_TDM_ERR("no backend_data\n");
                if (error)
                        *error = HAL_TDM_ERROR_NO_MODULE;
                return NULL;
@@ -248,7 +248,7 @@ hal_tdm_backend_get_display(hal_tdm_backend *backend, hal_tdm_error *error)
 
        display = backend_data->display;
        if (!display) {
-               _E("no display\n");
+               HAL_TDM_ERR("no display\n");
                if (error)
                        *error = HAL_TDM_ERROR_OPERATION_FAILED;
                return NULL;
@@ -266,7 +266,7 @@ hal_tdm_backend_has_drm_device(hal_tdm_backend *backend, hal_tdm_error *error)
        hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
 
        if (!backend_data || g_hal_tdm_backend_data != backend) {
-               _E("no backend_data\n");
+               HAL_TDM_ERR("no backend_data\n");
                if (error)
                        *error = HAL_TDM_ERROR_OPERATION_FAILED;
                return 0;
@@ -281,18 +281,18 @@ hal_tdm_backend_get_master_drm_fd(hal_tdm_backend *backend, hal_tdm_error *error
        hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
 
        if (!backend_data || g_hal_tdm_backend_data != backend) {
-               _E("no backend_data\n");
+               HAL_TDM_ERR("no backend_data\n");
                if (error)
                        *error = HAL_TDM_ERROR_OPERATION_FAILED;
                return -1;
        }
 
        if (!backend_data->drm_info.is_master) {
-               _I("no master_drm_fd");
+               HAL_TDM_INFO("no master_drm_fd");
                return -1;
        }
 
-       _I("master_drm_fd is %d", backend_data->drm_info.drm_fd);
+       HAL_TDM_INFO("master_drm_fd is %d", backend_data->drm_info.drm_fd);
 
        return backend_data->drm_info.drm_fd;
 }
@@ -304,18 +304,18 @@ hal_tdm_backend_set_master_drm_fd(hal_tdm_backend *backend, hal_tdm_fd master_dr
        int ret;
 
        if (!backend_data || g_hal_tdm_backend_data != backend) {
-               _E("no backend_data\n");
+               HAL_TDM_ERR("no backend_data\n");
                return HAL_TDM_ERROR_OPERATION_FAILED;
        }
 
        if (!backend_data->drm_info.master_drm_fd_func) {
-               _E("no backend_data->drm_info.auth_fd_func\n");
+               HAL_TDM_ERR("no backend_data->drm_info.auth_fd_func\n");
                return HAL_TDM_ERROR_OPERATION_FAILED;
        }
 
        ret = backend_data->drm_info.master_drm_fd_func(master_drm_fd, backend_data->drm_info.user_data);
        if (ret != HAL_TDM_ERROR_NONE) {
-               _E("backend_data->drm_info.master_drm_fd_func failed\n");
+               HAL_TDM_ERR("backend_data->drm_info.master_drm_fd_func failed\n");
                return ret;
        }
 
@@ -329,7 +329,7 @@ hal_tdm_backend_get_event_sources(hal_tdm_backend *backend, int *num_event_sourc
        hal_tdm_event_source **event_source;
 
        if (!backend_data || g_hal_tdm_backend_data != backend) {
-               _E("no backend_data\n");
+               HAL_TDM_ERR("no backend_data\n");
                if (error)
                        *error = HAL_TDM_ERROR_NO_MODULE;
                return NULL;
@@ -350,13 +350,13 @@ hal_tdm_backend_get_name(hal_tdm_backend *backend)
 
        name = calloc(HAL_TDM_NAME_LEN, sizeof(char));
        if (!name) {
-               _E("no memory");
+               HAL_TDM_ERR("no memory");
                return NULL;
        }
 
        ret = hal_common_get_backend_name(HAL_MODULE_TDM, name, HAL_TDM_NAME_LEN);
        if (ret < 0) {
-               _E("hal_common_get_backend_name failed.\n");
+               HAL_TDM_ERR("hal_common_get_backend_name failed.\n");
                free(name);
                return NULL;
        }
@@ -372,13 +372,13 @@ hal_tdm_backend_get_vendor(hal_tdm_backend *backend)
 
        vendor = calloc(HAL_TDM_NAME_LEN, sizeof(char));
        if (!vendor) {
-               _E("no memory");
+               HAL_TDM_ERR("no memory");
                return NULL;
        }
 
        ret = hal_common_get_backend_vendor(HAL_MODULE_TDM, vendor, HAL_TDM_NAME_LEN);
        if (ret < 0) {
-               _E("hal_common_get_backend_name failed.\n");
+               HAL_TDM_ERR("hal_common_get_backend_name failed.\n");
                free(vendor);
                return NULL;
        }
diff --git a/src/hal-tdm-log.c b/src/hal-tdm-log.c
new file mode 100644 (file)
index 0000000..981d90b
--- /dev/null
@@ -0,0 +1,135 @@
+#include <stdio.h>
+#include <dlog.h>
+#include "hal-tdm-types.h"
+#include "common.h"
+
+#define TDM_PATH_LEN        1024
+
+#define COLOR_RED "\x1b[31m"      /* for error */
+#define COLOR_YELLOW "\x1b[33m"   /* for warning */
+#define COLOR_GREEN "\x1b[32m"    /* for info */
+#define COLOR_RESET "\x1b[0m"
+
+#if ENABLE_DLOG
+static unsigned int dlog_enable = 1;
+#else
+static unsigned int dlog_enable = 0;
+#endif
+static unsigned int color_enable = 1;
+
+unsigned int tdm_log_debug_level = HAL_TDM_LOG_LEVEL_INFO;
+
+static int stdout_fd = -1;
+
+void
+tdm_log_set_path(const char *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) {
+                       HAL_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) {
+                               HAL_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);
+       }
+}
+
+static void
+_tdm_log_vprint_stdout(int level, const char *fmt, va_list arg)
+{
+       char *lvl_str[] = {"HAL_TDM_NON", "HAL_TDM_ERR", "HAL_TDM_WRN", "HAL_TDM_INF", "HAL_TDM_DBG"};
+       char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET};
+
+       if (level > tdm_log_debug_level)
+               return;
+
+       if (color_enable)
+               printf("%s", color[level]);
+       printf("[%s]", lvl_str[level]);
+       if (color_enable)
+               printf(COLOR_RESET);
+       vprintf(fmt, arg);
+       printf("\n");
+}
+
+void
+tdm_log_print_stdout(int level, const char *fmt, ...)
+{
+       va_list arg;
+       va_start(arg, fmt);
+       _tdm_log_vprint_stdout(level, fmt, arg);
+       va_end(arg);
+}
+
+static void
+_tdm_log_dlog_print(int level, const char *fmt, va_list arg)
+{
+       log_priority dlog_prio;
+
+       switch (level) {
+       case HAL_TDM_LOG_LEVEL_ERR:
+               dlog_prio = DLOG_ERROR;
+               break;
+       case HAL_TDM_LOG_LEVEL_WRN:
+               dlog_prio = DLOG_WARN;
+               break;
+       case HAL_TDM_LOG_LEVEL_INFO:
+               dlog_prio = DLOG_INFO;
+               break;
+       case HAL_TDM_LOG_LEVEL_DBG:
+               dlog_prio = DLOG_DEBUG;
+               break;
+       default:
+               return;
+       }
+       __dlog_vprint(LOG_ID_SYSTEM, dlog_prio, LOG_TAG, fmt, arg);
+}
+
+void
+hal_tdm_log_print(int level, const char *fmt, ...)
+{
+       va_list arg;
+
+       if (level > tdm_log_debug_level)
+               return;
+
+       if (dlog_enable) {
+               va_start(arg, fmt);
+               _tdm_log_dlog_print(level, fmt, arg);
+               va_end(arg);
+       } else {
+               va_start(arg, fmt);
+               _tdm_log_vprint_stdout(level, fmt, arg);
+               va_end(arg);
+       }
+}
\ No newline at end of file