diff options
Diffstat (limited to 'rts/Trace.c')
| -rw-r--r-- | rts/Trace.c | 174 |
1 files changed, 138 insertions, 36 deletions
diff --git a/rts/Trace.c b/rts/Trace.c index 70f4a39742..1dce968490 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -47,6 +47,9 @@ int DEBUG_sparks; // events int TRACE_sched; +int TRACE_gc; +int TRACE_spark_sampled; +int TRACE_spark_full; #ifdef THREADED_RTS static Mutex trace_utx; @@ -90,8 +93,25 @@ void initTracing (void) RtsFlags.TraceFlags.scheduler || RtsFlags.DebugFlags.scheduler; + // -Dg turns on gc tracing too + TRACE_gc = + RtsFlags.TraceFlags.gc || + RtsFlags.DebugFlags.gc; + + TRACE_spark_sampled = + RtsFlags.TraceFlags.sparks_sampled; + + // -Dr turns on full spark tracing + TRACE_spark_full = + RtsFlags.TraceFlags.sparks_full || + RtsFlags.DebugFlags.sparks; + eventlog_enabled = RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG; + /* Note: we can have TRACE_sched or TRACE_spark turned on even when + eventlog_enabled is off. In the DEBUG way we may be tracing to stderr. + */ + if (eventlog_enabled) { initEventLogging(); } @@ -179,22 +199,10 @@ static void traceSchedEvent_stderr (Capability *cap, EventTypeNum tag, debugBelch("cap %d: thread %lu appended to run queue\n", cap->no, (lnat)tso->id); break; - case EVENT_RUN_SPARK: // (cap, thread) - debugBelch("cap %d: thread %lu running a spark\n", - cap->no, (lnat)tso->id); - break; - case EVENT_CREATE_SPARK_THREAD: // (cap, spark_thread) - debugBelch("cap %d: creating spark thread %lu\n", - cap->no, (long)info1); - break; case EVENT_MIGRATE_THREAD: // (cap, thread, new_cap) debugBelch("cap %d: thread %lu migrating to cap %d\n", cap->no, (lnat)tso->id, (int)info1); break; - case EVENT_STEAL_SPARK: // (cap, thread, victim_cap) - debugBelch("cap %d: thread %lu stealing a spark from cap %d\n", - cap->no, (lnat)tso->id, (int)info1); - break; case EVENT_THREAD_WAKEUP: // (cap, thread, info1_cap) debugBelch("cap %d: waking up thread %lu on cap %d\n", cap->no, (lnat)tso->id, (int)info1); @@ -212,27 +220,6 @@ static void traceSchedEvent_stderr (Capability *cap, EventTypeNum tag, case EVENT_SHUTDOWN: // (cap) debugBelch("cap %d: shutting down\n", cap->no); break; - case EVENT_REQUEST_SEQ_GC: // (cap) - debugBelch("cap %d: requesting sequential GC\n", cap->no); - break; - case EVENT_REQUEST_PAR_GC: // (cap) - debugBelch("cap %d: requesting parallel GC\n", cap->no); - break; - case EVENT_GC_START: // (cap) - debugBelch("cap %d: starting GC\n", cap->no); - break; - case EVENT_GC_END: // (cap) - debugBelch("cap %d: finished GC\n", cap->no); - break; - case EVENT_GC_IDLE: // (cap) - debugBelch("cap %d: GC idle\n", cap->no); - break; - case EVENT_GC_WORK: // (cap) - debugBelch("cap %d: GC working\n", cap->no); - break; - case EVENT_GC_DONE: // (cap) - debugBelch("cap %d: GC done\n", cap->no); - break; default: debugBelch("cap %d: thread %lu: event %d\n\n", cap->no, (lnat)tso->id, tag); @@ -256,6 +243,56 @@ void traceSchedEvent_ (Capability *cap, EventTypeNum tag, } } +#ifdef DEBUG +static void traceGcEvent_stderr (Capability *cap, EventTypeNum tag) +{ + ACQUIRE_LOCK(&trace_utx); + + tracePreface(); + switch (tag) { + case EVENT_REQUEST_SEQ_GC: // (cap) + debugBelch("cap %d: requesting sequential GC\n", cap->no); + break; + case EVENT_REQUEST_PAR_GC: // (cap) + debugBelch("cap %d: requesting parallel GC\n", cap->no); + break; + case EVENT_GC_START: // (cap) + debugBelch("cap %d: starting GC\n", cap->no); + break; + case EVENT_GC_END: // (cap) + debugBelch("cap %d: finished GC\n", cap->no); + break; + case EVENT_GC_IDLE: // (cap) + debugBelch("cap %d: GC idle\n", cap->no); + break; + case EVENT_GC_WORK: // (cap) + debugBelch("cap %d: GC working\n", cap->no); + break; + case EVENT_GC_DONE: // (cap) + debugBelch("cap %d: GC done\n", cap->no); + break; + default: + barf("traceGcEvent: unknown event tag %d", tag); + break; + } + + RELEASE_LOCK(&trace_utx); +} +#endif + +void traceGcEvent_ (Capability *cap, EventTypeNum tag) +{ +#ifdef DEBUG + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) { + traceGcEvent_stderr(cap, tag); + } else +#endif + { + /* currently all GC events are nullary events */ + postEvent(cap, tag); + } +} + void traceCapsetModify_ (EventTypeNum tag, CapsetID capset, StgWord32 other) @@ -335,15 +372,80 @@ void traceOSProcessInfo_(void) { } } -void traceEvent_ (Capability *cap, EventTypeNum tag) +#ifdef DEBUG +static void traceSparkEvent_stderr (Capability *cap, EventTypeNum tag, + StgWord info1) +{ + ACQUIRE_LOCK(&trace_utx); + + tracePreface(); + switch (tag) { + + case EVENT_CREATE_SPARK_THREAD: // (cap, spark_thread) + debugBelch("cap %d: creating spark thread %lu\n", + cap->no, (long)info1); + break; + case EVENT_SPARK_CREATE: // (cap) + debugBelch("cap %d: added spark to pool\n", + cap->no); + break; + case EVENT_SPARK_DUD: // (cap) + debugBelch("cap %d: discarded dud spark\n", + cap->no); + break; + case EVENT_SPARK_OVERFLOW: // (cap) + debugBelch("cap %d: discarded overflowed spark\n", + cap->no); + break; + case EVENT_SPARK_RUN: // (cap) + debugBelch("cap %d: running a spark\n", + cap->no); + break; + case EVENT_SPARK_STEAL: // (cap, victim_cap) + debugBelch("cap %d: stealing a spark from cap %d\n", + cap->no, (int)info1); + break; + case EVENT_SPARK_FIZZLE: // (cap) + debugBelch("cap %d: fizzled spark removed from pool\n", + cap->no); + break; + case EVENT_SPARK_GC: // (cap) + debugBelch("cap %d: GCd spark removed from pool\n", + cap->no); + break; + default: + barf("traceSparkEvent: unknown event tag %d", tag); + break; + } + + RELEASE_LOCK(&trace_utx); +} +#endif + +void traceSparkEvent_ (Capability *cap, EventTypeNum tag, StgWord info1) +{ +#ifdef DEBUG + if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) { + traceSparkEvent_stderr(cap, tag, info1); + } else +#endif + { + postSparkEvent(cap,tag,info1); + } +} + +void traceSparkCounters_ (Capability *cap, + SparkCounters counters, + StgWord remaining) { #ifdef DEBUG if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) { - traceSchedEvent_stderr(cap, tag, 0, 0, 0); + /* we currently don't do debug tracing of spark stats but we must + test for TRACE_STDERR because of the !eventlog_enabled case. */ } else #endif { - postEvent(cap,tag); + postSparkCountersEvent(cap, counters, remaining); } } |
