LRN: Fix automake deps to allow -j* builds again
[oweals/gnunet.git] / src / util / common_logging.c
index e0560098610098317df968721b5603d9cab3eef0..46393674178cc4d11be0550087e8c5b5ad05a1e6 100644 (file)
@@ -31,7 +31,7 @@
 #include "gnunet_time_lib.h"
 
 /**
- * After how many seconds do we always print
+ * After how many milliseconds do we always print
  * that "message X was repeated N times"?  Use 12h.
  */
 #define BULK_DELAY_THRESHOLD (12 * 60 * 60 * 1000)
@@ -134,6 +134,13 @@ static unsigned int skip_log;
  */
 static FILE *GNUNET_stderr;
 
+#ifdef WINDOWS
+/**
+ * Contains the number of performance counts per second.
+ */
+LARGE_INTEGER performance_frequency;
+#endif
+
 /**
  * Convert a textual description of a loglevel
  * to the respective GNUNET_GE_KIND.
@@ -152,6 +159,8 @@ get_type (const char *log)
     return GNUNET_ERROR_TYPE_WARNING;
   if (0 == strcasecmp (log, _("ERROR")))
     return GNUNET_ERROR_TYPE_ERROR;
+  if (0 == strcasecmp (log, _("NONE")))
+    return GNUNET_ERROR_TYPE_NONE;
   return GNUNET_ERROR_TYPE_INVALID;
 }
 
@@ -170,13 +179,29 @@ GNUNET_log_setup (const char *comp, const char *loglevel, const char *logfile)
   FILE *altlog;
   int dirwarn;
   char *fn;
+  const char *env_loglevel;
+  int env_minlevel = 0;
+  int env_min_force_level = 100000;
 
+#ifdef WINDOWS
+  QueryPerformanceFrequency (&performance_frequency);
+#endif
   GNUNET_free_non_null (component);
   GNUNET_asprintf (&component,
                   "%s-%d",
                   comp,
                   getpid());
+  env_loglevel = getenv ("GNUNET_LOGLEVEL");
+  if (env_loglevel != NULL)
+    env_minlevel = get_type (env_loglevel);
+  env_loglevel = getenv ("GNUNET_FORCE_LOGLEVEL");
+  if (env_loglevel != NULL)
+    env_min_force_level = get_type (env_loglevel);
   min_level = get_type (loglevel);
+  if (env_minlevel > min_level)
+    min_level = env_minlevel;
+  if (env_min_force_level < min_level)
+    min_level = env_min_force_level;
   if (logfile == NULL)
     return GNUNET_OK;
   fn = GNUNET_STRINGS_filename_expand (logfile);
@@ -289,7 +314,7 @@ flush_bulk (const char *datestr)
   char *last;
   char *ft;
 
-  if ((last_bulk_time.value == 0) || (last_bulk_repeat == 0))
+  if ((last_bulk_time.abs_value == 0) || (last_bulk_repeat == 0))
     return;
   rev = 0;
   last = memchr (last_bulk, '\0', BULK_TRACK_SIZE);
@@ -353,7 +378,9 @@ mylog (enum GNUNET_ErrorType kind,
        const char *comp, const char *message, va_list va)
 {
   char date[DATE_STR_SIZE];
+  char date2[DATE_STR_SIZE];
   time_t timetmp;
+  struct timeval timeofday;
   struct tm *tmptr;
   size_t size;
   char *buf;
@@ -376,16 +403,28 @@ mylog (enum GNUNET_ErrorType kind,
   time (&timetmp);
   memset (date, 0, DATE_STR_SIZE);
   tmptr = localtime (&timetmp);
+  gettimeofday(&timeofday, NULL);
   if (NULL != tmptr)
-    strftime (date, DATE_STR_SIZE, "%b %d %H:%M:%S", tmptr);
+  {
+#ifdef WINDOWS
+    LARGE_INTEGER pc;
+    pc.QuadPart = 0;
+    QueryPerformanceCounter (&pc);
+    strftime (date2, DATE_STR_SIZE, "%b %d %H:%M:%S-%%020llu", tmptr);
+    snprintf (date, sizeof (date), date2, (long long) (pc.QuadPart / (performance_frequency.QuadPart / 1000)));
+#else
+    strftime (date2, DATE_STR_SIZE, "%b %d %H:%M:%S-%%06u", tmptr);
+    snprintf (date, sizeof (date), date2, timeofday.tv_usec);
+#endif
+  }
   else
     strcpy (date, "localtime error");
   if ((0 != (kind & GNUNET_ERROR_TYPE_BULK)) &&
-      (last_bulk_time.value != 0) &&
+      (last_bulk_time.abs_value != 0) &&
       (0 == strncmp (buf, last_bulk, sizeof (last_bulk))))
     {
       last_bulk_repeat++;
-      if ((GNUNET_TIME_absolute_get_duration (last_bulk_time).value >
+      if ((GNUNET_TIME_absolute_get_duration (last_bulk_time).rel_value >
            BULK_DELAY_THRESHOLD)
           || (last_bulk_repeat > BULK_REPEAT_THRESHOLD))
         flush_bulk (date);
@@ -434,8 +473,15 @@ GNUNET_log_from (enum GNUNET_ErrorType kind,
                  const char *comp, const char *message, ...)
 {
   va_list va;
+  char comp_w_pid[128];
+
   va_start (va, message);
-  mylog (kind, comp, message, va);
+  GNUNET_snprintf (comp_w_pid,
+                  sizeof (comp_w_pid),
+                  "%s-%d",
+                  comp,
+                  getpid());
+  mylog (kind, comp_w_pid, message, va);
   va_end (va);
 }
 
@@ -591,7 +637,7 @@ void __attribute__ ((constructor)) GNUNET_util_cl_init ()
 {
   GNUNET_stderr = stderr;
 #ifdef MINGW
-  InitWinEnv (NULL);
+  GNInitWinEnv (NULL);
 #endif
 }
 
@@ -602,7 +648,7 @@ void __attribute__ ((constructor)) GNUNET_util_cl_init ()
 void __attribute__ ((destructor)) GNUNET_util_cl_fini ()
 {
 #ifdef MINGW
-  ShutdownWinEnv ();
+  GNShutdownWinEnv ();
 #endif
 }