From 93609949bd1ed18a447f9ec20301c2f1659f955f Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 29 Jul 2021 13:56:39 +0900 Subject: [PATCH] add hal-tdm-log.c file This provide the log functions to print logs via dlog and stdout. Change-Id: I7eac5f56303cee52d02eba0375e378faf09731f4 --- CMakeLists.txt | 3 +- include/hal-tdm-types.h | 1 + src/common.h | 72 ++++++++++++++++++++++++-- src/hal-api-tdm.c | 38 +++++++------- src/hal-tdm-log.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 225 insertions(+), 24 deletions(-) create mode 100644 src/hal-tdm-log.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 17c4620..d0e279f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/include/hal-tdm-types.h b/include/hal-tdm-types.h index 48ca3e2..5afef12 100644 --- a/include/hal-tdm-types.h +++ b/include/hal-tdm-types.h @@ -36,6 +36,7 @@ #define __HAL_TDM_TYPES_H__ #include +#include #include #ifdef __cplusplus diff --git a/src/common.h b/src/common.h index 419d506..35daf13 100644 --- a/src/common.h +++ b/src/common.h @@ -35,10 +35,74 @@ #ifndef __COMMON_H__ #define __COMMON_H__ +#include +#include #include -#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__ */ diff --git a/src/hal-api-tdm.c b/src/hal-api-tdm.c index d1fac87..728a337 100644 --- a/src/hal-api-tdm.c +++ b/src/hal-api-tdm.c @@ -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 index 0000000..981d90b --- /dev/null +++ b/src/hal-tdm-log.c @@ -0,0 +1,135 @@ +#include +#include +#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 -- 2.7.4