diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Capability.c | 7 | ||||
-rw-r--r-- | rts/RtsFlags.c | 29 | ||||
-rw-r--r-- | rts/RtsProbes.d | 10 | ||||
-rw-r--r-- | rts/Sparks.c | 11 | ||||
-rw-r--r-- | rts/Trace.c | 86 | ||||
-rw-r--r-- | rts/Trace.h | 128 | ||||
-rw-r--r-- | rts/eventlog/EventLog.c | 70 | ||||
-rw-r--r-- | rts/eventlog/EventLog.h | 5 |
8 files changed, 268 insertions, 78 deletions
diff --git a/rts/Capability.c b/rts/Capability.c index e03a1f2936..91c5e2d98e 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -95,13 +95,14 @@ findSpark (Capability *cap) spark = tryStealSpark(cap->sparks); while (spark != NULL && fizzledSpark(spark)) { cap->spark_stats.fizzled++; + traceEventSparkFizzle(cap); spark = tryStealSpark(cap->sparks); } if (spark != NULL) { cap->spark_stats.converted++; // Post event for running a spark from capability's own pool. - traceEventRunSpark(cap, cap->r.rCurrentTSO); + traceEventSparkRun(cap); return spark; } @@ -128,6 +129,7 @@ findSpark (Capability *cap) spark = tryStealSpark(robbed->sparks); while (spark != NULL && fizzledSpark(spark)) { cap->spark_stats.fizzled++; + traceEventSparkFizzle(cap); spark = tryStealSpark(robbed->sparks); } if (spark == NULL && !emptySparkPoolCap(robbed)) { @@ -138,8 +140,7 @@ findSpark (Capability *cap) if (spark != NULL) { cap->spark_stats.converted++; - - traceEventStealSpark(cap, cap->r.rCurrentTSO, robbed->no); + traceEventSparkSteal(cap, robbed->no); return spark; } diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index 2a1f4040a7..7fdf28f8c4 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -164,7 +164,8 @@ void initRtsFlagsDefaults(void) RtsFlags.TraceFlags.timestamp = rtsFalse; RtsFlags.TraceFlags.scheduler = rtsFalse; RtsFlags.TraceFlags.gc = rtsFalse; - RtsFlags.TraceFlags.sparks = rtsFalse; + RtsFlags.TraceFlags.sparks_sampled= rtsFalse; + RtsFlags.TraceFlags.sparks_full = rtsFalse; #endif RtsFlags.MiscFlags.tickInterval = 20; /* In milliseconds */ @@ -291,7 +292,8 @@ usage_text[] = { " where [flags] can contain:", " s scheduler events", " g GC events", -" p par spark events", +" p par spark events (sampled)", +" f par spark events (full detail)", # ifdef DEBUG " t add time stamps (only useful with -v)", # endif @@ -1449,13 +1451,13 @@ static void read_trace_flags(char *arg) /* Start by turning on the default tracing flags. * - * Currently this is all the trace classes, but might not be in - * future, for example we might default to slightly less verbose + * Currently this is all the trace classes, except full-detail sparks. + * Similarly, in future we might default to slightly less verbose * scheduler or GC tracing. */ - RtsFlags.TraceFlags.scheduler = rtsTrue; - RtsFlags.TraceFlags.gc = rtsTrue; - RtsFlags.TraceFlags.sparks = rtsTrue; + RtsFlags.TraceFlags.scheduler = rtsTrue; + RtsFlags.TraceFlags.gc = rtsTrue; + RtsFlags.TraceFlags.sparks_sampled = rtsTrue; for (c = arg; *c != '\0'; c++) { switch(*c) { @@ -1465,9 +1467,10 @@ static void read_trace_flags(char *arg) enabled = rtsFalse; break; case 'a': - RtsFlags.TraceFlags.scheduler = enabled; - RtsFlags.TraceFlags.gc = enabled; - RtsFlags.TraceFlags.sparks = enabled; + RtsFlags.TraceFlags.scheduler = enabled; + RtsFlags.TraceFlags.gc = enabled; + RtsFlags.TraceFlags.sparks_sampled = enabled; + RtsFlags.TraceFlags.sparks_full = enabled; enabled = rtsTrue; break; @@ -1476,7 +1479,11 @@ static void read_trace_flags(char *arg) enabled = rtsTrue; break; case 'p': - RtsFlags.TraceFlags.sparks = enabled; + RtsFlags.TraceFlags.sparks_sampled = enabled; + enabled = rtsTrue; + break; + case 'f': + RtsFlags.TraceFlags.sparks_full = enabled; enabled = rtsTrue; break; case 't': diff --git a/rts/RtsProbes.d b/rts/RtsProbes.d index cd3c0f73e6..755b25525b 100644 --- a/rts/RtsProbes.d +++ b/rts/RtsProbes.d @@ -43,8 +43,6 @@ provider HaskellEvent { probe stop__thread (EventCapNo, EventThreadID, EventThreadStatus, EventThreadID); probe thread__runnable (EventCapNo, EventThreadID); probe migrate__thread (EventCapNo, EventThreadID, EventCapNo); - probe run__spark (EventCapNo, EventThreadID); - probe steal__spark (EventCapNo, EventThreadID, EventCapNo); probe shutdown (EventCapNo); probe thread_wakeup (EventCapNo, EventThreadID, EventCapNo); probe gc__start (EventCapNo); @@ -71,4 +69,12 @@ provider HaskellEvent { StgWord, StgWord, StgWord StgWord, StgWord, StgWord StgWord); + + probe spark__create (EventCapNo); + probe spark__dud (EventCapNo); + probe spark__overflow (EventCapNo); + probe spark__run (EventCapNo); + probe spark__steal (EventCapNo, EventCapNo); + probe spark__fizzle (EventCapNo); + probe spark__gc (EventCapNo); }; diff --git a/rts/Sparks.c b/rts/Sparks.c index 6ce2e68094..4241656795 100644 --- a/rts/Sparks.c +++ b/rts/Sparks.c @@ -61,13 +61,16 @@ newSpark (StgRegTable *reg, StgClosure *p) if (!fizzledSpark(p)) { if (pushWSDeque(pool,p)) { - cap->spark_stats.created++; + cap->spark_stats.created++; + traceEventSparkCreate(cap); } else { /* overflowing the spark pool */ cap->spark_stats.overflowed++; + traceEventSparkOverflow(cap); } } else { cap->spark_stats.dud++; + traceEventSparkDud(cap); } return 1; @@ -174,6 +177,7 @@ pruneSparkQueue (Capability *cap) // robustness. pruned_sparks++; cap->spark_stats.fizzled++; + traceEventSparkFizzle(cap); } else { info = spark->header.info; if (IS_FORWARDING_PTR(info)) { @@ -186,6 +190,7 @@ pruneSparkQueue (Capability *cap) } else { pruned_sparks++; // discard spark cap->spark_stats.fizzled++; + traceEventSparkFizzle(cap); } } else if (HEAP_ALLOCED(spark)) { if ((Bdescr((P_)spark)->flags & BF_EVACUATED)) { @@ -196,10 +201,12 @@ pruneSparkQueue (Capability *cap) } else { pruned_sparks++; // discard spark cap->spark_stats.fizzled++; + traceEventSparkFizzle(cap); } } else { pruned_sparks++; // discard spark cap->spark_stats.gcd++; + traceEventSparkGC(cap); } } else { if (INFO_PTR_TO_STRUCT(info)->type == THUNK_STATIC) { @@ -210,10 +217,12 @@ pruneSparkQueue (Capability *cap) } else { pruned_sparks++; // discard spark cap->spark_stats.gcd++; + traceEventSparkGC(cap); } } else { pruned_sparks++; // discard spark cap->spark_stats.fizzled++; + traceEventSparkFizzle(cap); } } } diff --git a/rts/Trace.c b/rts/Trace.c index 7f70957fcf..1dce968490 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -48,7 +48,8 @@ int DEBUG_sparks; // events int TRACE_sched; int TRACE_gc; -int TRACE_spark; +int TRACE_spark_sampled; +int TRACE_spark_full; #ifdef THREADED_RTS static Mutex trace_utx; @@ -97,9 +98,12 @@ void initTracing (void) RtsFlags.TraceFlags.gc || RtsFlags.DebugFlags.gc; - // -Dr turns on spark tracing - TRACE_spark = - RtsFlags.TraceFlags.sparks || + 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; @@ -195,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); @@ -380,6 +372,68 @@ void traceOSProcessInfo_(void) { } } +#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) diff --git a/rts/Trace.h b/rts/Trace.h index 676fa58515..40a4522a26 100644 --- a/rts/Trace.h +++ b/rts/Trace.h @@ -63,7 +63,8 @@ extern int DEBUG_sparks; // events extern int TRACE_sched; extern int TRACE_gc; -extern int TRACE_spark; +extern int TRACE_spark_sampled; +extern int TRACE_spark_full; // ----------------------------------------------------------------------------- // Posting events @@ -95,11 +96,6 @@ void traceEnd (void); traceSchedEvent_(cap, tag, tso, info1, info2); \ } -#define traceSparkEvent(cap, tag, tso, other) \ - if (RTS_UNLIKELY(TRACE_spark)) { \ - traceSchedEvent_(cap, tag, tso, other, 0); \ - } - void traceSchedEvent_ (Capability *cap, EventTypeNum tag, StgTSO *tso, StgWord info1, StgWord info2); @@ -113,6 +109,21 @@ void traceSchedEvent_ (Capability *cap, EventTypeNum tag, void traceGcEvent_ (Capability *cap, EventTypeNum tag); +/* + * Record a spark event + */ +#define traceSparkEvent(cap, tag) \ + if (RTS_UNLIKELY(TRACE_spark_full)) { \ + traceSparkEvent_(cap, tag, 0); \ + } + +#define traceSparkEvent2(cap, tag, other) \ + if (RTS_UNLIKELY(TRACE_spark_full)) { \ + traceSparkEvent_(cap, tag, other); \ + } + +void traceSparkEvent_ (Capability *cap, EventTypeNum tag, StgWord info1); + // variadic macros are C99, and supported by gcc. However, the // ##__VA_ARGS syntax is a gcc extension, which allows the variable // argument list to be empty (see gcc docs for details). @@ -199,7 +210,8 @@ void traceSparkCounters_ (Capability *cap, #define traceSchedEvent(cap, tag, tso, other) /* nothing */ #define traceSchedEvent2(cap, tag, tso, other, info) /* nothing */ #define traceGcEvent(cap, tag) /* nothing */ -#define traceSparkEvent(cap, tag, tso, other) /* nothing */ +#define traceSparkEvent(cap, tag) /* nothing */ +#define traceSparkEvent2(cap, tag, other) /* nothing */ #define traceCap(class, cap, msg, ...) /* nothing */ #define trace(class, msg, ...) /* nothing */ #define debugTrace(class, str, ...) /* nothing */ @@ -237,10 +249,6 @@ void dtraceUserMsgWrapper(Capability *cap, char *msg); HASKELLEVENT_THREAD_RUNNABLE(cap, tid) #define dtraceMigrateThread(cap, tid, new_cap) \ HASKELLEVENT_MIGRATE_THREAD(cap, tid, new_cap) -#define dtraceRunSpark(cap, tid) \ - HASKELLEVENT_RUN_SPARK(cap, tid) -#define dtraceStealSpark(cap, tid, victim_cap) \ - HASKELLEVENT_STEAL_SPARK(cap, tid, victim_cap) #define dtraceShutdown(cap) \ HASKELLEVENT_SHUTDOWN(cap) #define dtraceThreadWakeup(cap, tid, other_cap) \ @@ -276,6 +284,20 @@ INLINE_HEADER void dtraceStartup (int num_caps) { HASKELLEVENT_CAPSET_REMOVE_CAP(capset, capno) #define dtraceSparkCounters(cap, a, b, c, d, e, f, g) \ HASKELLEVENT_SPARK_COUNTERS(cap, a, b, c, d, e, f, g) +#define dtraceSparkCreate(cap) \ + HASKELLEVENT_SPARK_CREATE(cap) +#define dtraceSparkDud(cap) \ + HASKELLEVENT_SPARK_DUD(cap) +#define dtraceSparkOverflow(cap) \ + HASKELLEVENT_SPARK_OVERFLOW(cap) +#define dtraceSparkRun(cap) \ + HASKELLEVENT_SPARK_RUN(cap) +#define dtraceSparkSteal(cap, victim_cap) \ + HASKELLEVENT_SPARK_STEAL(cap, victim_cap) +#define dtraceSparkFizzle(cap) \ + HASKELLEVENT_SPARK_FIZZLE(cap) +#define dtraceSparkGc(cap) \ + HASKELLEVENT_SPARK_GC(cap) #else /* !defined(DTRACE) */ @@ -284,8 +306,6 @@ INLINE_HEADER void dtraceStartup (int num_caps) { #define dtraceStopThread(cap, tid, status, info) /* nothing */ #define dtraceThreadRunnable(cap, tid) /* nothing */ #define dtraceMigrateThread(cap, tid, new_cap) /* nothing */ -#define dtraceRunSpark(cap, tid) /* nothing */ -#define dtraceStealSpark(cap, tid, victim_cap) /* nothing */ #define dtraceShutdown(cap) /* nothing */ #define dtraceThreadWakeup(cap, tid, other_cap) /* nothing */ #define dtraceGcStart(cap) /* nothing */ @@ -303,6 +323,13 @@ INLINE_HEADER void dtraceStartup (int num_caps STG_UNUSED) {}; #define dtraceCapsetAssignCap(capset, capno) /* nothing */ #define dtraceCapsetRemoveCap(capset, capno) /* nothing */ #define dtraceSparkCounters(cap, a, b, c, d, e, f, g) /* nothing */ +#define dtraceSparkCreate(cap) /* nothing */ +#define dtraceSparkDud(cap) /* nothing */ +#define dtraceSparkOverflow(cap) /* nothing */ +#define dtraceSparkRun(cap) /* nothing */ +#define dtraceSparkSteal(cap, victim_cap) /* nothing */ +#define dtraceSparkFizzle(cap) /* nothing */ +#define dtraceSparkGc(cap) /* nothing */ #endif @@ -424,30 +451,6 @@ INLINE_HEADER void traceEventGcDone(Capability *cap STG_UNUSED) dtraceGcDone((EventCapNo)cap->no); } - -INLINE_HEADER void traceEventRunSpark(Capability *cap STG_UNUSED, - StgTSO *tso STG_UNUSED) -{ - traceSparkEvent(cap, EVENT_RUN_SPARK, tso, 0); - dtraceRunSpark((EventCapNo)cap->no, (EventThreadID)tso->id); -} - -INLINE_HEADER void traceEventStealSpark(Capability *cap STG_UNUSED, - StgTSO *tso STG_UNUSED, - nat victim_cap STG_UNUSED) -{ - traceSparkEvent(cap, EVENT_STEAL_SPARK, tso, victim_cap); - dtraceStealSpark((EventCapNo)cap->no, (EventThreadID)tso->id, - (EventCapNo)victim_cap); -} - -INLINE_HEADER void traceEventCreateSparkThread(Capability *cap STG_UNUSED, - StgThreadID spark_tid STG_UNUSED) -{ - traceSparkEvent(cap, EVENT_CREATE_SPARK_THREAD, 0, spark_tid); - dtraceCreateSparkThread((EventCapNo)cap->no, (EventThreadID)spark_tid); -} - INLINE_HEADER void traceEventStartup(void) { int n_caps; @@ -496,10 +499,17 @@ INLINE_HEADER void traceOSProcessInfo(void) * is available to DTrace directly */ } +INLINE_HEADER void traceEventCreateSparkThread(Capability *cap STG_UNUSED, + StgThreadID spark_tid STG_UNUSED) +{ + traceSparkEvent2(cap, EVENT_CREATE_SPARK_THREAD, spark_tid); + dtraceCreateSparkThread((EventCapNo)cap->no, (EventThreadID)spark_tid); +} + INLINE_HEADER void traceSparkCounters(Capability *cap STG_UNUSED) { #ifdef THREADED_RTS - if (RTS_UNLIKELY(TRACE_spark)) { + if (RTS_UNLIKELY(TRACE_spark_sampled)) { traceSparkCounters_(cap, cap->spark_stats, sparkPoolSize(cap->sparks)); } #endif @@ -513,6 +523,48 @@ INLINE_HEADER void traceSparkCounters(Capability *cap STG_UNUSED) sparkPoolSize(cap->sparks)); } +INLINE_HEADER void traceEventSparkCreate(Capability *cap STG_UNUSED) +{ + traceSparkEvent(cap, EVENT_SPARK_CREATE); + dtraceSparkCreate((EventCapNo)cap->no); +} + +INLINE_HEADER void traceEventSparkDud(Capability *cap STG_UNUSED) +{ + traceSparkEvent(cap, EVENT_SPARK_DUD); + dtraceSparkDud((EventCapNo)cap->no); +} + +INLINE_HEADER void traceEventSparkOverflow(Capability *cap STG_UNUSED) +{ + traceSparkEvent(cap, EVENT_SPARK_OVERFLOW); + dtraceSparkOverflow((EventCapNo)cap->no); +} + +INLINE_HEADER void traceEventSparkRun(Capability *cap STG_UNUSED) +{ + traceSparkEvent(cap, EVENT_SPARK_RUN); + dtraceSparkRun((EventCapNo)cap->no); +} + +INLINE_HEADER void traceEventSparkSteal(Capability *cap STG_UNUSED, + nat victim_cap STG_UNUSED) +{ + traceSparkEvent2(cap, EVENT_SPARK_STEAL, victim_cap); + dtraceSparkSteal((EventCapNo)cap->no, (EventCapNo)victim_cap); +} + +INLINE_HEADER void traceEventSparkFizzle(Capability *cap STG_UNUSED) +{ + traceSparkEvent(cap, EVENT_SPARK_FIZZLE); + dtraceSparkFizzle((EventCapNo)cap->no); +} + +INLINE_HEADER void traceEventSparkGC(Capability *cap STG_UNUSED) +{ + traceSparkEvent(cap, EVENT_SPARK_GC); + dtraceSparkGc((EventCapNo)cap->no); +} #include "EndPrivate.h" diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index 54e4cb4096..c6ab86d736 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -60,8 +60,6 @@ char *EventDesc[] = { [EVENT_STOP_THREAD] = "Stop thread", [EVENT_THREAD_RUNNABLE] = "Thread runnable", [EVENT_MIGRATE_THREAD] = "Migrate thread", - [EVENT_RUN_SPARK] = "Run spark", - [EVENT_STEAL_SPARK] = "Steal spark", [EVENT_SHUTDOWN] = "Shutdown", [EVENT_THREAD_WAKEUP] = "Wakeup thread", [EVENT_GC_START] = "Starting GC", @@ -85,7 +83,14 @@ char *EventDesc[] = { [EVENT_PROGRAM_ENV] = "Program environment variables", [EVENT_OSPROCESS_PID] = "Process ID", [EVENT_OSPROCESS_PPID] = "Parent process ID", - [EVENT_SPARK_COUNTERS] = "Spark counters" + [EVENT_SPARK_COUNTERS] = "Spark counters", + [EVENT_SPARK_CREATE] = "Spark create", + [EVENT_SPARK_DUD] = "Spark dud", + [EVENT_SPARK_OVERFLOW] = "Spark overflow", + [EVENT_SPARK_RUN] = "Spark run", + [EVENT_SPARK_STEAL] = "Spark steal", + [EVENT_SPARK_FIZZLE] = "Spark fizzle", + [EVENT_SPARK_GC] = "Spark GC", }; // Event type. @@ -254,13 +259,11 @@ initEventLogging(void) case EVENT_CREATE_THREAD: // (cap, thread) case EVENT_RUN_THREAD: // (cap, thread) case EVENT_THREAD_RUNNABLE: // (cap, thread) - case EVENT_RUN_SPARK: // (cap, thread) case EVENT_CREATE_SPARK_THREAD: // (cap, spark_thread) eventTypes[t].size = sizeof(EventThreadID); break; case EVENT_MIGRATE_THREAD: // (cap, thread, new_cap) - case EVENT_STEAL_SPARK: // (cap, thread, victim_cap) case EVENT_THREAD_WAKEUP: // (cap, thread, other_cap) eventTypes[t].size = sizeof(EventThreadID) + sizeof(EventCapNo); @@ -296,6 +299,11 @@ initEventLogging(void) sizeof(EventCapsetID) + sizeof(StgWord32); break; + case EVENT_SPARK_STEAL: // (cap, victim_cap) + eventTypes[t].size = + sizeof(EventCapNo); + break; + case EVENT_SHUTDOWN: // (cap) case EVENT_REQUEST_SEQ_GC: // (cap) case EVENT_REQUEST_PAR_GC: // (cap) @@ -304,6 +312,12 @@ initEventLogging(void) case EVENT_GC_IDLE: case EVENT_GC_WORK: case EVENT_GC_DONE: + case EVENT_SPARK_CREATE: // (cap) + case EVENT_SPARK_DUD: // (cap) + case EVENT_SPARK_OVERFLOW: // (cap) + case EVENT_SPARK_RUN: // (cap) + case EVENT_SPARK_FIZZLE: // (cap) + case EVENT_SPARK_GC: // (cap) eventTypes[t].size = 0; break; @@ -440,7 +454,6 @@ postSchedEvent (Capability *cap, case EVENT_CREATE_THREAD: // (cap, thread) case EVENT_RUN_THREAD: // (cap, thread) case EVENT_THREAD_RUNNABLE: // (cap, thread) - case EVENT_RUN_SPARK: // (cap, thread) { postThreadID(eb,thread); break; @@ -453,7 +466,6 @@ postSchedEvent (Capability *cap, } case EVENT_MIGRATE_THREAD: // (cap, thread, new_cap) - case EVENT_STEAL_SPARK: // (cap, thread, victim_cap) case EVENT_THREAD_WAKEUP: // (cap, thread, other_cap) { postThreadID(eb,thread); @@ -480,6 +492,50 @@ postSchedEvent (Capability *cap, } void +postSparkEvent (Capability *cap, + EventTypeNum tag, + StgWord info1) +{ + EventsBuf *eb; + + eb = &capEventBuf[cap->no]; + + if (!hasRoomForEvent(eb, tag)) { + // Flush event buffer to make room for new event. + printAndClearEventBuf(eb); + } + + postEventHeader(eb, tag); + + switch (tag) { + case EVENT_CREATE_SPARK_THREAD: // (cap, spark_thread) + { + postThreadID(eb,info1 /* spark_thread */); + break; + } + + case EVENT_SPARK_STEAL: // (cap, victim_cap) + { + postCapNo(eb,info1 /* victim_cap */); + break; + } + + case EVENT_SPARK_CREATE: // (cap) + case EVENT_SPARK_DUD: // (cap) + case EVENT_SPARK_OVERFLOW: // (cap) + case EVENT_SPARK_RUN: // (cap) + case EVENT_SPARK_FIZZLE: // (cap) + case EVENT_SPARK_GC: // (cap) + { + break; + } + + default: + barf("postSparkEvent: unknown event tag %d", tag); + } +} + +void postSparkCountersEvent (Capability *cap, SparkCounters counters, StgWord remaining) diff --git a/rts/eventlog/EventLog.h b/rts/eventlog/EventLog.h index 431292732f..6bb1404e92 100644 --- a/rts/eventlog/EventLog.h +++ b/rts/eventlog/EventLog.h @@ -69,6 +69,11 @@ void postCapsetVecEvent (EventTypeNum tag, int argc, char *msg[]); +/* + * Post a `par` spark event + */ +void postSparkEvent(Capability *cap, EventTypeNum tag, StgWord info1); + /* * Post an event with several counters relating to `par` sparks. */ |