[API/Log] Add Logging API for users with custom tag
authorDongju Chae <dongju.chae@samsung.com>
Mon, 14 Jun 2021 05:36:08 +0000 (14:36 +0900)
committer채동주/On-Device Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Mon, 14 Jun 2021 07:41:14 +0000 (16:41 +0900)
This patch adds logging API for users with custom tag.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
include/common/typedef.h
include/host/libnpuhost.h
src/core/utils/meson.build
src/core/utils/ne-utils.cc
src/core/utils/ne-utils.h
src/host/ne-host.cc
tests/unittests/ne_core_utils_test.cc

index 77d50c9..c39a039 100644 (file)
@@ -401,4 +401,12 @@ typedef struct {
   /* TODO: Add more options if needed */
 } npu_profile_opt;
 
+typedef enum {
+  NPU_LOG_NONE = 0,
+  NPU_LOG_ERROR,
+  NPU_LOG_WARN,
+  NPU_LOG_INFO,
+  NPU_LOG_END,
+} npu_loglevel;
+
 #endif /* NPU_TYPEDEF_H__ */
index 59dffff..8188513 100644 (file)
@@ -27,6 +27,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <stdbool.h>
+#include <stdarg.h>
 #include <typedef.h>
 #include <npubinfmt.h>
 
@@ -471,6 +472,22 @@ int getNPU_statReqs (npudev_h dev, int app_id, npu_stat_reqs *stat);
  */
 void putNPU_statReqs (npu_stat_reqs *stat);
 
+/**
+ * @brief Write logs
+ * @param[in] level log severity level
+ * @param[in] tag log tag for users
+ * @param[in] format log format string
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int writeNPU_log (npu_loglevel level, const char *tag, const char *format, ...);
+
+#define writeNPU_logInfo(tag, format, ...) \
+  writeNPU_log (NPU_LOG_INFO, tag, format, ##__VA_ARGS__)
+#define writeNPU_logWarn(tag, format, ...) \
+  writeNPU_log (NPU_LOG_WARN, tag, format, ##__VA_ARGS__)
+#define writeNPU_logError(tag, format, ...) \
+  writeNPU_log (NPU_LOG_ERROR, tag, format, ##__VA_ARGS__)
+
 #if defined(__cplusplus)
 }
 #endif
index 0ddd1a9..19f9e98 100644 (file)
@@ -14,5 +14,5 @@ endif
 ne_core_utils_dep = declare_dependency (
   sources : ne_core_utils_src,
   dependencies : ne_core_utils_deps,
-  include_directories : ne_core_utils_inc
+  include_directories : [ne_core_utils_inc, ne_common_inc]
 )
index c9c0fb3..ae552fb 100644 (file)
 /**
  * @brief Log Level String in 5 characters
  */
-static const char *loglevelstr[LOG_END] = {
-    [LOG_NONE] = "NONE",
-    [LOG_ERROR] = "ERROR",
-    [LOG_WARN] = "WARN ",
-    [LOG_INFO] = "INFO ",
+static const char *loglevelstr[NPU_LOG_END] = {
+    [NPU_LOG_NONE] = "NONE",
+    [NPU_LOG_ERROR] = "ERROR",
+    [NPU_LOG_WARN] = "WARN ",
+    [NPU_LOG_INFO] = "INFO ",
 };
 
 /**
@@ -74,23 +74,35 @@ Logger::getInstance () {
  *        a negative value is returned. Note that 0 is not regarded as an error.
  */
 int
-Logger::logwrite (loglevel l, module m, const char *format, ...) {
+Logger::logwrite (npu_loglevel l, module m, const char *format, ...) {
+  va_list args;
   int ret;
 
-  if (l <= LOG_NONE || l >= LOG_END)
+  if (l <= NPU_LOG_NONE || l >= NPU_LOG_END)
     return -EINVAL;
 
-  if (m < _N1 || m >= _NEND)
+  if (format == nullptr)
     return -EINVAL;
 
-  if (format == nullptr)
+  if (m < _N1 || m >= _NEND)
     return -EINVAL;
 
+  va_start (args, format);
+  ret = logwrite_args (l, modulestr[m], format, args);
+  va_end (args);
+
+  return ret;
+}
+
+int
+Logger::logwrite_args (npu_loglevel l, const char *tag, const char *format,
+                       va_list args) {
+  int ret;
+
   std::unique_lock<std::mutex> lock (m_);
 
   time_t ltime = time (nullptr);
   char *time_str;
-  va_list args;
 
   /**
    * localtime() and asctime() are not MT-safe. There are alternatives,
@@ -102,11 +114,9 @@ Logger::logwrite (loglevel l, module m, const char *format, ...) {
 
   char log_msg[MAX_LOG_MSG];
   int log_len = snprintf (log_msg, MAX_LOG_MSG, "[%s][%s][%s] ", loglevelstr[l],
-                          modulestr[m], time_str);
+                          tag, time_str);
 
-  va_start (args, format);
   log_len += vsnprintf (log_msg + log_len, MAX_LOG_MSG - log_len, format, args);
-  va_end (args);
 
   if (Conf::getInstance ().getLogLevel () >= l) {
     fprintf (stderr, "%s\n", log_msg);
@@ -114,11 +124,11 @@ Logger::logwrite (loglevel l, module m, const char *format, ...) {
   }
 
 #ifdef __TIZEN__
-  if (l == LOG_ERROR)
+  if (l == NPU_LOG_ERROR)
     ml_loge ("%s", log_msg);
-  else if (l == LOG_WARN)
+  else if (l == NPU_LOG_WARN)
     ml_logw ("%s", log_msg);
-  else if (l == LOG_INFO)
+  else if (l == NPU_LOG_INFO)
     ml_logi ("%s", log_msg);
 #endif
 
index 9dd567d..0d1e2d3 100644 (file)
@@ -21,6 +21,7 @@
 #include <condition_variable>
 #include <functional>
 
+#include <typedef.h>
 #include <sys/user.h> /* PAGE_SIZE */
 
 #ifndef PAGE_SHIFT
 #define ml_logf(...) dlog_print (DLOG_FATAL, TAG_NAME, __VA_ARGS__)
 #endif
 
-typedef enum {
-  LOG_NONE = 0,
-  LOG_ERROR,
-  LOG_WARN,
-  LOG_INFO,
-  LOG_END,
-} loglevel;
-
 /**
  * @brief Module definitions
  * @detail
@@ -98,7 +91,9 @@ class Logger {
  public:
   static Logger &getInstance ();
 
-  int logwrite (loglevel l, module m, const char *format, ...);
+  int logwrite (npu_loglevel l, module m, const char *format, ...);
+  int logwrite_args (npu_loglevel l, const char *tag, const char *format,
+                     va_list args);
 
   ~Logger ();
 
@@ -115,15 +110,15 @@ class Logger {
 /** @brief log macros with different log levels */
 #define __FILENAME__ \
   (strrchr (__FILE__, '/') ? strrchr (__FILE__, '/') + 1 : __FILE__)
-#define logerr(m, fmt, ...)                                                    \
-  Logger::getInstance ().logwrite (LOG_ERROR, m, "(%s:%d) " fmt, __FILENAME__, \
-                                   __LINE__, ##__VA_ARGS__)
-#define logwarn(m, fmt, ...)                                                  \
-  Logger::getInstance ().logwrite (LOG_WARN, m, "(%s:%d) " fmt, __FILENAME__, \
-                                   __LINE__, ##__VA_ARGS__)
-#define loginfo(m, fmt, ...)                                                  \
-  Logger::getInstance ().logwrite (LOG_INFO, m, "(%s:%d) " fmt, __FILENAME__, \
-                                   __LINE__, ##__VA_ARGS__)
+#define logerr(m, fmt, ...)                                          \
+  Logger::getInstance ().logwrite (NPU_LOG_ERROR, m, "(%s:%d) " fmt, \
+                                   __FILENAME__, __LINE__, ##__VA_ARGS__)
+#define logwarn(m, fmt, ...)                                        \
+  Logger::getInstance ().logwrite (NPU_LOG_WARN, m, "(%s:%d) " fmt, \
+                                   __FILENAME__, __LINE__, ##__VA_ARGS__)
+#define loginfo(m, fmt, ...)                                        \
+  Logger::getInstance ().logwrite (NPU_LOG_INFO, m, "(%s:%d) " fmt, \
+                                   __FILENAME__, __LINE__, ##__VA_ARGS__)
 
 /** @brief thread-safe map */
 template <typename K, typename V>
index 8cd7561..768fe3a 100644 (file)
@@ -700,3 +700,28 @@ exit_err:
 
   return nullptr;
 }
+
+/**
+ * @brief Write logs
+ * @param[in] level log severity level
+ * @param[in] tag log tag for identification
+ * @param[in] format log format string
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+writeNPU_log (npu_loglevel level, const char *tag, const char *format, ...) {
+  va_list args;
+  int ret;
+
+  if (level <= NPU_LOG_NONE || level >= NPU_LOG_END)
+    return -EINVAL;
+
+  if (tag == nullptr || format == nullptr)
+    return -EINVAL;
+
+  va_start (args, format);
+  ret = Logger::getInstance ().logwrite_args (level, tag, format, args);
+  va_end (args);
+
+  return ret;
+}
index f1d5040..c51fedb 100644 (file)
@@ -290,11 +290,11 @@ TEST (ne_core_utils_test, log_write) {
   Logger &logger = Logger::getInstance ();
 
   int ret;
-  ret = logger.logwrite (LOG_ERROR, _N1, "test error\n");
+  ret = logger.logwrite (NPU_LOG_ERROR, _N1, "test error\n");
   EXPECT_GE (ret, 0);
-  ret = logger.logwrite (LOG_WARN, _N1, "test warn\n");
+  ret = logger.logwrite (NPU_LOG_WARN, _N1, "test warn\n");
   EXPECT_GE (ret, 0);
-  ret = logger.logwrite (LOG_INFO, _N1, "test info\n");
+  ret = logger.logwrite (NPU_LOG_INFO, _N1, "test info\n");
   EXPECT_GE (ret, 0);
 }
 
@@ -306,13 +306,13 @@ TEST (ne_core_utils_test, log_write_n) {
 
   /** logwrite is ignored for invalid arguments */
   int ret;
-  ret = logger.logwrite (LOG_END, _NEND, "invalid\n");
+  ret = logger.logwrite (NPU_LOG_END, _NEND, "invalid\n");
   EXPECT_LT (ret, 0);
-  ret = logger.logwrite (LOG_END, _N1, "invalid\n");
+  ret = logger.logwrite (NPU_LOG_END, _N1, "invalid\n");
   EXPECT_LT (ret, 0);
-  ret = logger.logwrite (LOG_INFO, _NEND, "invalid\n");
+  ret = logger.logwrite (NPU_LOG_INFO, _NEND, "invalid\n");
   EXPECT_LT (ret, 0);
-  ret = logger.logwrite (LOG_INFO, _N1, nullptr);
+  ret = logger.logwrite (NPU_LOG_INFO, _N1, nullptr);
   EXPECT_LT (ret, 0);
 }