diff options
author | Spencer Janssen <spencer@well-typed.com> | 2011-04-14 01:11:05 -0500 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2011-05-18 11:14:27 +0100 |
commit | 58532eb46041aec8d4cbb48b054cb5b001edb43c (patch) | |
tree | 1fd878273e11b04045e48178acc8eaacd2ccace9 /rts/Trace.c | |
parent | 58339b06aff704834e8553faaa2db00d746b26f3 (diff) | |
download | haskell-58532eb46041aec8d4cbb48b054cb5b001edb43c.tar.gz |
Add capability sets to the event system. Contains code from Duncan Coutts.
Diffstat (limited to 'rts/Trace.c')
-rw-r--r-- | rts/Trace.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/rts/Trace.c b/rts/Trace.c index f2f9e81549..fb8e9226af 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -20,6 +20,10 @@ #include "Threads.h" #include "Printer.h" +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + #ifdef DEBUG // debugging flags, set with +RTS -D<something> int DEBUG_sched; @@ -251,6 +255,69 @@ void traceSchedEvent_ (Capability *cap, EventTypeNum tag, } } +void traceCapsetModify_ (EventTypeNum tag, + CapsetID capset, + StgWord32 other, + StgWord32 other2) +{ +#ifdef DEBUG + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) { + ACQUIRE_LOCK(&trace_utx); + + tracePreface(); + switch (tag) { + case EVENT_CAPSET_CREATE: // (capset, capset_type) + debugBelch("created capset %d of type %d\n", capset, other); + break; + case EVENT_CAPSET_DELETE: // (capset) + debugBelch("deleted capset %d\n", capset); + break; + case EVENT_CAPSET_ASSIGN_CAP: // (capset, capno) + debugBelch("assigned cap %d to capset %d\n", other, capset); + break; + case EVENT_CAPSET_REMOVE_CAP: // (capset, capno) + debugBelch("removed cap %d from capset %d\n", other, capset); + break; + } + RELEASE_LOCK(&trace_utx); + } else +#endif + { + if(eventlog_enabled) postCapsetModifyEvent(tag, capset, other, other2); + } +} + +extern char **environ; + +void traceCapsetDetails_(int *argc, char **argv[]){ + if(eventlog_enabled){ + postCapsetModifyEvent(EVENT_OSPROCESS_PID, + CAPSET_OSPROCESS_DEFAULT, + getpid(), + getppid()); + + char buf[256]; + snprintf(buf, sizeof(buf), "GHC-%s %s", ProjectVersion, RtsWay); + postCapsetStrEvent(EVENT_RTS_IDENTIFIER, + CAPSET_OSPROCESS_DEFAULT, + buf); + + if(argc != NULL && argv != NULL){ + postCapsetVecEvent(EVENT_PROGRAM_ARGS, + CAPSET_OSPROCESS_DEFAULT, + *argc, + *argv); + } + + int env_len; + for( env_len = 0; environ[env_len] != NULL; env_len++); + postCapsetVecEvent(EVENT_PROGRAM_ENV, + CAPSET_OSPROCESS_DEFAULT, + env_len, + environ); + } +} + void traceEvent_ (Capability *cap, EventTypeNum tag) { #ifdef DEBUG |