summaryrefslogtreecommitdiff
path: root/rts/Trace.h
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2006-06-08 14:42:10 +0000
committerSimon Marlow <simonmar@microsoft.com>2006-06-08 14:42:10 +0000
commit5a2769f0273dd389977e8283375e7920d183bdd4 (patch)
treecc5ffb1521eca3fb4f8c59ba649c8c16b852f125 /rts/Trace.h
parent3f10646cfe2c3409056a49d1ef1c4507af522573 (diff)
downloadhaskell-5a2769f0273dd389977e8283375e7920d183bdd4.tar.gz
New tracing interface
A simple interface for generating trace messages with timestamps and thread IDs attached to them. Most debugging output goes through this interface now, so it is straightforward to get timestamped debugging traces with +RTS -vt. Also, we plan to use this to generate parallelism profiles from the trace output.
Diffstat (limited to 'rts/Trace.h')
-rw-r--r--rts/Trace.h123
1 files changed, 123 insertions, 0 deletions
diff --git a/rts/Trace.h b/rts/Trace.h
new file mode 100644
index 0000000000..19e492c26e
--- /dev/null
+++ b/rts/Trace.h
@@ -0,0 +1,123 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team 2006
+ *
+ * Debug and performance tracing.
+ *
+ * This is a layer over RtsMessages, which provides for generating
+ * trace messages with timestamps and thread Ids attached
+ * automatically. Also, multiple classes of messages are supported,
+ * which can be enabled separately via RTS flags.
+ *
+ * All debug trace messages go through here. Additionally, we
+ * generate timestamped trace messages for consumption by profiling
+ * tools using this API.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef TRACE_H
+#define TRACE_H
+
+// -----------------------------------------------------------------------------
+// Tracing functions
+// -----------------------------------------------------------------------------
+
+void initTracing (void);
+
+// The simple way:
+void trace (StgWord32 class, const char *str, ...)
+ GNUC3_ATTRIBUTE(format (printf, 2, 3));
+
+// The harder way: sometimes we want to generate a trace message that
+// consists of multiple components generated by different functions.
+// So we provide the functionality of trace() split into 3 parts:
+// - traceClass(): a check that the required class is enabled
+// - traceBegin(): print the beginning of the trace message
+// - traceEnd(): complete the trace message (release the lock too).
+//
+INLINE_HEADER rtsBool traceClass (StgWord32 class);
+
+void traceBegin (const char *str, ...)
+ GNUC3_ATTRIBUTE(format (printf, 1, 2));
+
+void traceEnd (void);
+
+#ifdef DEBUG
+#define debugTrace(class, str, ...) trace(class,str, ## __VA_ARGS__)
+// variable arg macros are C99, and supported by gcc.
+#define debugTraceBegin(class, str, ...) traceBegin(class,str, ## __VA_ARGS__)
+#define debugTraceEnd() traceEnd()
+#else
+#define debugTrace(class, str, ...) /* nothing */
+#define debugTraceBegin(class, str, ...) /* nothing */
+#define debugTraceEnd() /* nothing */
+#endif
+
+
+// -----------------------------------------------------------------------------
+// Message classes, these may be OR-ed together
+// -----------------------------------------------------------------------------
+
+// debugging flags, set with +RTS -D<something>
+#define DEBUG_sched (1<<0)
+#define DEBUG_interp (1<<1)
+#define DEBUG_weak (1<<2)
+#define DEBUG_gccafs (1<<3)
+#define DEBUG_gc (1<<4)
+#define DEBUG_block_alloc (1<<5)
+#define DEBUG_sanity (1<<6)
+#define DEBUG_stable (1<<7)
+#define DEBUG_stm (1<<8)
+#define DEBUG_prof (1<<9)
+#define DEBUG_gran (1<<10)
+#define DEBUG_par (1<<11)
+#define DEBUG_linker (1<<12)
+#define DEBUG_squeeze (1<<13)
+
+// PAR debugging flags, set with +RTS -qD<something>
+#define PAR_DEBUG_verbose (1<<14)
+#define PAR_DEBUG_bq (1<<15)
+#define PAR_DEBUG_schedule (1<<16)
+#define PAR_DEBUG_free (1<<17)
+#define PAR_DEBUG_resume (1<<18)
+#define PAR_DEBUG_weight (1<<19)
+#define PAR_DEBUG_fetch (1<<21)
+#define PAR_DEBUG_fish (1<<22)
+#define PAR_DEBUG_tables (1<<23)
+#define PAR_DEBUG_packet (1<<24)
+#define PAR_DEBUG_pack (1<<25)
+#define PAR_DEBUG_paranoia (1<<26)
+
+// GRAN and PAR don't coexist, so we re-use the PAR values for GRAN.
+#define GRAN_DEBUG_event_trace (1<<14)
+#define GRAN_DEBUG_event_stats (1<<15)
+#define GRAN_DEBUG_bq (1<<16)
+#define GRAN_DEBUG_pack (1<<17)
+#define GRAN_DEBUG_checkSparkQ (1<<18)
+#define GRAN_DEBUG_thunkStealing (1<<19)
+#define GRAN_DEBUG_randomSteal (1<<20)
+#define GRAN_DEBUG_findWork (1<<21)
+#define GRAN_DEBUG_unused (1<<22)
+#define GRAN_DEBUG_pri (1<<23)
+#define GRAN_DEBUG_checkLight (1<<24)
+#define GRAN_DEBUG_sortedQ (1<<25)
+#define GRAN_DEBUG_blockOnFetch (1<<26)
+#define GRAN_DEBUG_packBuffer (1<<27)
+#define GRAN_DEBUG_BOF_sanity (1<<28)
+
+// Profiling flags
+#define TRACE_sched (1<<29)
+
+
+// -----------------------------------------------------------------------------
+// PRIVATE below here
+// -----------------------------------------------------------------------------
+
+extern StgWord32 classes_enabled;
+
+INLINE_HEADER rtsBool
+traceClass (StgWord32 class) { return (classes_enabled & class); }
+
+// -----------------------------------------------------------------------------
+
+#endif /* TRACE_H */