Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / resource / csdk / logger / src / logger.c
index ad9afd2..b642464 100644 (file)
 //
 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 
+// Defining _POSIX_C_SOURCE macro with 199309L (or greater) as value
+// causes header files to expose definitions
+// corresponding to the POSIX.1b, Real-time extensions
+// (IEEE Std 1003.1b-1993) specification
+//
+// For this specific file, see use of clock_gettime,
+// Refer to http://pubs.opengroup.org/stage7tc1/functions/clock_gettime.html
+// and to http://man7.org/linux/man-pages/man2/clock_gettime.2.html
+#ifndef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809L
+#endif
+
+// Platform check can be extended to check and/or define more, or could be
+// moved into a config.h
+#if !defined(__ARDUINO__) && !defined(ARDUINO)
+#define HAVE_UNISTD_H 1
+#endif
+
+// Pull in _POSIX_TIMERS feature test macro to check for
+// clock_gettime() support.
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+
+// if we have unistd.h, we're a Unix system
+#include <time.h>
+#include <sys/time.h>
+#endif
 
 #include "logger.h"
 #include "string.h"
@@ -33,7 +60,7 @@ static const uint16_t LINE_BUFFER_SIZE = (16 * 2) + 16 + 1;  // Show 16 bytes, 2
 // Convert LogLevel to platform-specific severity level.  Store in PROGMEM on Arduino
 #ifdef __ANDROID__
     static android_LogPriority LEVEL[] = {ANDROID_LOG_DEBUG, ANDROID_LOG_INFO, ANDROID_LOG_WARN, ANDROID_LOG_ERROR, ANDROID_LOG_FATAL};
-#elif defined __linux__
+#elif defined(__linux__) || defined(__APPLE__)
     static const char * LEVEL[] __attribute__ ((unused)) = {"DEBUG", "INFO", "WARNING", "ERROR", "FATAL"};
 #elif defined ARDUINO
     #include <stdarg.h>
@@ -70,7 +97,7 @@ void OCLogInit() {
 }
 
 void OCLogShutdown() {
-#ifdef __linux__
+#if defined(__linux__) || defined(__APPLE__)
     if (logCtx && logCtx->destroy)
     {
         logCtx->destroy(logCtx);
@@ -99,6 +126,34 @@ void OCLogv(LogLevel level, const char * tag, const char * format, ...) {
     OCLog(level, tag, buffer);
 }
 
+static void osalGetTime(int *min,int *sec, int *ms)
+{
+    if (min && sec && ms)
+    {
+#if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
+        struct timespec when = {};
+        clockid_t clk = CLOCK_REALTIME;
+#ifdef CLOCK_REALTIME_COARSE
+        clk = CLOCK_REALTIME_COARSE;
+#endif
+        if (!clock_gettime(clk, &when))
+        {
+            *min = (when.tv_sec / 60) % 60;
+            *sec = when.tv_sec % 60;
+            *ms = when.tv_nsec / 1000000;
+        }
+#else
+        struct timeval now;
+        if (!gettimeofday(&now, NULL))
+        {
+            *min = (now.tv_sec / 60) % 60;
+            *sec = now.tv_sec % 60;
+            *ms = now.tv_usec * 1000;
+        }
+#endif
+    }
+}
+
 /**
  * Output a log string with the specified priority level.
  * Only defined for Linux and Android
@@ -112,19 +167,24 @@ void OCLog(LogLevel level, const char * tag, const char * logStr) {
         return;
     }
 
-    #ifdef __ANDROID__
-        __android_log_write(LEVEL[level], tag, logStr);
-    #elif defined __linux__
-        if (logCtx && logCtx->write_level)
-        {
-            logCtx->write_level(logCtx, LEVEL_XTABLE[level], logStr);
+#ifdef __ANDROID__
+    __android_log_write(LEVEL[level], tag, logStr);
+#elif defined(__linux__) || defined(__APPLE__)
+    if (logCtx && logCtx->write_level)
+    {
+        logCtx->write_level(logCtx, LEVEL_XTABLE[level], logStr);
+    }
+    else
+    {
 
-        }
-        else
-        {
-            printf("%s: %s: %s\n", LEVEL[level], tag, logStr);
-        }
-    #endif
+        int min = 0;
+        int sec = 0;
+        int ms = 0;
+        osalGetTime(&min,&sec,&ms);
+
+        printf("%02d:%02d.%03d %s: %s: %s\n", min, sec, ms, LEVEL[level], tag, logStr);
+    }
+#endif
 }
 
 /**
@@ -350,3 +410,4 @@ void OCLogBuffer(LogLevel level, const char * tag, const uint8_t * buffer, uint1
 #endif
 
 
+