]> granicus.if.org Git - gc/commitdiff
Improve logging for Android differentiating messages by log level
authorIvan Maidanski <ivmai@mail.ru>
Thu, 15 Nov 2012 19:06:14 +0000 (23:06 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 15 Nov 2012 19:06:14 +0000 (23:06 +0400)
* include/private/gc_priv.h (VERBOSE): Move definition to be upper
than GC_print_stats.
* include/private/gc_priv.h (GC_print_stats): Define as macro (to
VERBOSE) if GC_ANDROID_LOG.
* include/private/gc_priv.h (GC_real_print_stats): New macro defined
to GC_print_stats if not GC_ANDROID_LOG otherwise declared as global
variable replacing GC_print_stats.
* include/private/gc_priv.h (GC_stats_log_printf,
GC_verbose_log_printf): Declare as GC_INNER function instead of
macro if GC_ANDROID_LOG.
* misc.c (GC_print_stats): Replace to GC_real_print_stats.
* misc.c (GC_init): Set GC_real_print_stats instead of GC_print_stats.
* misc.c (GC_log_printf): Use DEBUG log level instead of INFO (only if
GC_ANDROID_LOG).
* misc.c (GC_warn_printf): New macro (if not GC_ANDROID_LOG) or static
routine (that writes to Android log at WARN level).
* misc.c (GC_stats_log_printf, GC_verbose_log_printf): New GC_INNER
function definition (only if GC_ANDROID_LOG) using INFO/VERBOSE
Android log levels.
* misc.c (GC_default_warn_proc): Use GC_warn_printf instead of
GC_err_printf.

include/private/gc_priv.h
misc.c

index 4ea9cf8ebd28322de05d0b91ab916fef93ffac0a..146ccfb664eac0b2ce4f6808c46eb6385f155d6b 100644 (file)
@@ -1885,16 +1885,25 @@ GC_EXTERN GC_bool GC_have_errors; /* We saw a smashed or leaked object. */
                                   /* occasionally.  It is ok to read it */
                                   /* without acquiring the lock.        */
 
+#define VERBOSE 2
 #ifndef SMALL_CONFIG
   /* GC_print_stats should be visible to extra/MacOS.c. */
-  extern int GC_print_stats;    /* Nonzero generates basic GC log.      */
+# ifndef GC_ANDROID_LOG
+    extern int GC_print_stats;  /* Nonzero generates basic GC log.      */
                                 /* VERBOSE generates add'l messages.    */
+#   define GC_real_print_stats GC_print_stats
+# else
+#   ifndef GC_print_stats
+#     define GC_print_stats VERBOSE
+#   endif
+    extern int GC_real_print_stats;
+                /* Influences logging only if redirected to a file.     */
+# endif
 #else /* SMALL_CONFIG */
 # define GC_print_stats 0
   /* Will this remove the message character strings from the executable? */
   /* With a particular level of optimizations, it should...              */
 #endif
-#define VERBOSE 2
 
 #ifdef KEEP_BACK_PTRS
   GC_EXTERN long GC_backtraces;
@@ -2040,10 +2049,17 @@ GC_API_PRIV void GC_log_printf(const char * format, ...)
   }
 #endif
 
+#ifndef GC_ANDROID_LOG
   /* GC_stats_log_printf should be called only if GC_print_stats.       */
 # define GC_stats_log_printf GC_log_printf
   /* GC_verbose_log_printf is called only if GC_print_stats is VERBOSE. */
 # define GC_verbose_log_printf GC_log_printf
+#else
+  GC_INNER void GC_stats_log_printf(const char *format, ...)
+                        GC_ATTR_FORMAT_PRINTF(1, 2);
+  GC_INNER void GC_verbose_log_printf(const char *format, ...)
+                        GC_ATTR_FORMAT_PRINTF(1, 2);
+#endif /* GC_ANDROID_LOG */
 
 /* Convenient macros for GC_stats/verbose_log_printf invocation.        */
 #define GC_COND_LOG_PRINTF if (!GC_print_stats) {} else GC_stats_log_printf
diff --git a/misc.c b/misc.c
index 77c78ce8d95f379d9bd0e96988ea9f8a4dd5bf05..2c197ff6cb3e0f2509909d574a3e30a6bab6ef84 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -91,7 +91,7 @@ int GC_dont_precollect = FALSE;
 GC_bool GC_quiet = 0; /* used also in pcr_interface.c */
 
 #ifndef SMALL_CONFIG
-  int GC_print_stats = 0;
+  int GC_real_print_stats = 0;
 #endif
 
 #ifdef GC_PRINT_BACK_HEIGHT
@@ -860,12 +860,12 @@ GC_API void GC_CALL GC_init(void)
 #     ifdef GC_PRINT_VERBOSE_STATS
         /* This is useful for debugging and profiling on platforms with */
         /* missing getenv() (like WinCE).                               */
-        GC_print_stats = VERBOSE;
+        GC_real_print_stats = VERBOSE;
 #     else
         if (0 != GETENV("GC_PRINT_VERBOSE_STATS")) {
-          GC_print_stats = VERBOSE;
+          GC_real_print_stats = VERBOSE;
         } else if (0 != GETENV("GC_PRINT_STATS")) {
-          GC_print_stats = 1;
+          GC_real_print_stats = 1;
         }
 #     endif
 #     if defined(UNIX_LIKE) || defined(CYGWIN32) || defined(SYMBIAN)
@@ -1514,6 +1514,8 @@ void GC_err_printf(const char *format, ...)
       ABORT("write to GC log failed");
   }
 
+# define GC_warn_printf GC_err_printf
+
 #else
 
 # define GC_LOG_PRINTF_IMPL(loglevel, fileLogCond, format) \
@@ -1528,7 +1530,29 @@ void GC_err_printf(const char *format, ...)
 
   void GC_log_printf(const char *format, ...)
   {
-    GC_LOG_PRINTF_IMPL(ANDROID_LOG_INFO, TRUE, format);
+    GC_LOG_PRINTF_IMPL(ANDROID_LOG_DEBUG, TRUE, format);
+  }
+
+  GC_INNER void GC_stats_log_printf(const char *format, ...)
+  {
+    GC_LOG_PRINTF_IMPL(ANDROID_LOG_INFO, GC_real_print_stats != 0, format);
+  }
+
+  GC_INNER void GC_verbose_log_printf(const char *format, ...)
+  {
+    GC_LOG_PRINTF_IMPL(ANDROID_LOG_VERBOSE, GC_real_print_stats == VERBOSE,
+                       format);
+  }
+
+  STATIC void GC_warn_printf(const char *format, ...)
+  {
+    char buf[BUFSZ + 1];
+
+    GC_PRINTF_FILLBUF(buf, format);
+    __android_log_write(ANDROID_LOG_WARN, GC_ANDROID_LOG_TAG, buf);
+    if (GC_real_print_stats && GC_stderr != GC_DEFAULT_STDERR_FD
+        && WRITE(GC_stderr, buf, strlen(buf)) < 0)
+      ABORT("write to stderr failed");
   }
 
 #endif /* GC_ANDROID_LOG */
@@ -1546,7 +1570,7 @@ void GC_err_puts(const char *s)
 STATIC void GC_CALLBACK GC_default_warn_proc(char *msg, GC_word arg)
 {
     /* TODO: Add assertion on arg comply with msg (format).     */
-    GC_err_printf(msg, arg);
+    GC_warn_printf(msg, arg);
 }
 
 GC_INNER GC_warn_proc GC_current_warn_proc = GC_default_warn_proc;