diff options
author | Manuel M T Chakravarty <chak@cse.unsw.edu.au> | 2009-12-12 10:08:09 +0000 |
---|---|---|
committer | Manuel M T Chakravarty <chak@cse.unsw.edu.au> | 2009-12-12 10:08:09 +0000 |
commit | 015d3d46b6de2f95386a515a7d166d996a0416db (patch) | |
tree | da6c07854ca7ac899f08d56e5185ba55b6b854ac /rts/Trace.c | |
parent | dcba7784a1af5fd0c054031c49fe159d69af4f86 (diff) | |
download | haskell-015d3d46b6de2f95386a515a7d166d996a0416db.tar.gz |
Expose all EventLog events as DTrace probes
- Defines a DTrace provider, called 'HaskellEvent', that provides a probe
for every event of the eventlog framework.
- In contrast to the original eventlog, the DTrace probes are available in
all flavours of the runtime system (DTrace probes have virtually no
overhead if not enabled); when -DTRACING is defined both the regular
event log as well as DTrace probes can be used.
- Currently, Mac OS X only. User-space DTrace probes are implemented
differently on Mac OS X than in the original DTrace implementation.
Nevertheless, it shouldn't be too hard to enable these probes on other
platforms, too.
- Documentation is at http://hackage.haskell.org/trac/ghc/wiki/DTrace
Diffstat (limited to 'rts/Trace.c')
-rw-r--r-- | rts/Trace.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/rts/Trace.c b/rts/Trace.c index 7cfb78cc9a..a1da9911a7 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -9,10 +9,11 @@ // external headers #include "Rts.h" -#ifdef TRACING - // internal headers #include "Trace.h" + +#ifdef TRACING + #include "GetTime.h" #include "Stats.h" #include "eventlog/EventLog.h" @@ -310,6 +311,7 @@ void traceUserMsg(Capability *cap, char *msg) postUserMsg(cap, msg); } } + dtraceUserMsg(cap->no, msg); } void traceThreadStatus_ (StgTSO *tso USED_IF_DEBUG) @@ -345,3 +347,15 @@ void traceEnd (void) #endif /* DEBUG */ #endif /* TRACING */ + +// If DTRACE is enabled, but neither DEBUG nor TRACING, we need a C land +// wrapper for the user-msg probe (as we can't expand that in PrimOps.cmm) +// +#if !defined(DEBUG) && !defined(TRACING) && defined(DTRACE) + +void dtraceUserMsgWrapper(Capability *cap, char *msg) +{ + dtraceUserMsg(cap->no, msg); +} + +#endif /* !defined(DEBUG) && !defined(TRACING) && defined(DTRACE) */ |