Add macros to sgen meant to replace DEBUG
authorRodrigo Kumpera <kumpera@gmail.com>
Mon, 19 Nov 2012 19:45:15 +0000 (14:45 -0500)
committerRodrigo Kumpera <kumpera@gmail.com>
Mon, 19 Nov 2012 22:02:09 +0000 (17:02 -0500)
* sgen-gc.h: Add log and assertions macros so we can have different logging levels
for them and so we can better abstract the logging medium.

mono/metadata/sgen-conf.h
mono/metadata/sgen-gc.h

index 19f28cde038411ae6f1248b73232c3353d8942d7..8221812cc895a93096e3901b71c268aa2cad2d7a 100644 (file)
@@ -82,11 +82,17 @@ typedef guint64 mword;
 
 /*
  * Maximum level of debug to enable on this build.
- * Making this a static variable enables us to put logging in a lot of places.
- * FIXME decouple logging from assertions
+ * Making this a constant enables us to put logging in a lot of places and
+ * not pay its cost on release builds.
  */
 #define SGEN_MAX_DEBUG_LEVEL 2
 
+/*
+ * Maximum level of asserts to enable on this build.
+ * FIXME replace all magic numbers with defines.
+ */
+#define SGEN_MAX_ASSERT_LEVEL 2
+
 
 #define GC_BITS_PER_WORD (sizeof (mword) * 8)
 
index 0a946d0b2afdadef834986954894056a70e77f0d..32d33ec795de42c6177092e290af5b8239643fe1 100644 (file)
@@ -244,6 +244,28 @@ extern long long stat_objects_copied_major;
 
 #define DEBUG(level,a) do {if (G_UNLIKELY ((level) <= SGEN_MAX_DEBUG_LEVEL && (level) <= gc_debug_level)) { a; fflush (gc_debug_file); } } while (0)
 
+#define SGEN_ASSERT(level, a, ...) do {        \
+       if (G_UNLIKELY ((level) <= SGEN_MAX_ASSERT_LEVEL && !(a))) {    \
+               g_error (__VA_ARGS__);  \
+} } while (0)
+
+
+#define SGEN_LOG(level, format, ...) do {      \
+       if (G_UNLIKELY ((level) <= SGEN_MAX_DEBUG_LEVEL && (level) <= gc_debug_level)) {        \
+               fprintf (gc_debug_file, format "\n", ##__VA_ARGS__); fflush (gc_debug_file);    \
+} } while (0)
+
+#define SGEN_COND_LOG(level, cond, format, ...) do {   \
+       if (G_UNLIKELY ((level) <= SGEN_MAX_DEBUG_LEVEL && (level) <= gc_debug_level)) {        \
+               if (cond)       \
+                       fprintf (gc_debug_file, format "\n", ##__VA_ARGS__); fflush (gc_debug_file);    \
+} } while (0)
+
+#define SGEN_LOG_DO(level, fun) do {   \
+       if (G_UNLIKELY ((level) <= SGEN_MAX_DEBUG_LEVEL && (level) <= gc_debug_level)) {        \
+               fun;    \
+} } while (0)
+
 extern int gc_debug_level;
 extern FILE* gc_debug_file;