From c4f9b989c605776c1f07929672a856f07d9b4b44 Mon Sep 17 00:00:00 2001 From: Duncan Coutts Date: Thu, 26 May 2011 16:01:24 +0100 Subject: [PATCH] Make the tracing of the startup event more regular Rather than doing it differently for the eventlog and Dtrace cases. --- rts/RtsStartup.c | 4 ++-- rts/Trace.c | 6 ++++++ rts/Trace.h | 16 ++++++++++------ rts/eventlog/EventLog.c | 20 ++++++++++++++++---- rts/eventlog/EventLog.h | 2 ++ 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index 952e806..0dacd61 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -144,9 +144,9 @@ hs_init(int *argc, char **argv[]) #ifdef TRACING initTracing(); #endif - /* Dtrace events are always enabled + /* Trace the startup event */ - dtraceEventStartup(); + traceEventStartup(); /* initialise scheduler data structures (needs to be done before * initStorage()). diff --git a/rts/Trace.c b/rts/Trace.c index f2f9e81..6c69cbc 100644 --- a/rts/Trace.c +++ b/rts/Trace.c @@ -359,6 +359,12 @@ void traceThreadStatus_ (StgTSO *tso USED_IF_DEBUG) } } +void traceEventStartup_(int nocaps) +{ + if (eventlog_enabled) { + postEventStartup(nocaps); + } +} #ifdef DEBUG void traceBegin (const char *str, ...) diff --git a/rts/Trace.h b/rts/Trace.h index 6209156..b264394 100644 --- a/rts/Trace.h +++ b/rts/Trace.h @@ -160,6 +160,8 @@ void traceUserMsg(Capability *cap, char *msg); void traceThreadStatus_ (StgTSO *tso); +void traceEventStartup_ (int n_caps); + #else /* !TRACING */ #define traceSchedEvent(cap, tag, tso, other) /* nothing */ @@ -170,6 +172,7 @@ void traceThreadStatus_ (StgTSO *tso); #define debugTrace(class, str, ...) /* nothing */ #define debugTraceCap(class, cap, str, ...) /* nothing */ #define traceThreadStatus(class, tso) /* nothing */ +#define traceEventStartup_(n_caps) /* nothing */ #endif /* TRACING */ @@ -374,17 +377,18 @@ INLINE_HEADER void traceEventCreateSparkThread(Capability *cap STG_UNUSED, dtraceCreateSparkThread((EventCapNo)cap->no, (EventThreadID)spark_tid); } -// This applies only to dtrace as EVENT_STARTUP in the logging framework is -// handled specially in 'EventLog.c'. -// -INLINE_HEADER void dtraceEventStartup(void) +INLINE_HEADER void traceEventStartup(void) { + int n_caps; #ifdef THREADED_RTS // XXX n_capabilities hasn't been initislised yet - dtraceStartup(RtsFlags.ParFlags.nNodes); + n_caps = RtsFlags.ParFlags.nNodes; #else - dtraceStartup(1); + n_caps = 1; #endif + + traceEventStartup_(n_caps); + dtraceStartup(n_caps); } INLINE_HEADER void traceEventGcIdle(Capability *cap STG_UNUSED) diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index a77c257..2884ad9 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -296,10 +296,6 @@ initEventLogging(void) // Prepare event buffer for events (data). postInt32(&eventBuf, EVENT_DATA_BEGIN); - - // Post a STARTUP event with the number of capabilities - postEventHeader(&eventBuf, EVENT_STARTUP); - postCapNo(&eventBuf, n_caps); // Flush capEventBuf with header. /* @@ -498,6 +494,22 @@ void postUserMsg(Capability *cap, char *msg, va_list ap) postLogMsg(&capEventBuf[cap->no], EVENT_USER_MSG, msg, ap); } +void postEventStartup(EventCapNo n_caps) +{ + ACQUIRE_LOCK(&eventBufMutex); + + if (!hasRoomForEvent(&eventBuf, EVENT_STARTUP)) { + // Flush event buffer to make room for new event. + printAndClearEventBuf(&eventBuf); + } + + // Post a STARTUP event with the number of capabilities + postEventHeader(&eventBuf, EVENT_STARTUP); + postCapNo(&eventBuf, n_caps); + + RELEASE_LOCK(&eventBufMutex); +} + void closeBlockMarker (EventsBuf *ebuf) { StgInt8* save_pos; diff --git a/rts/eventlog/EventLog.h b/rts/eventlog/EventLog.h index 0cfab5c..22a034c 100644 --- a/rts/eventlog/EventLog.h +++ b/rts/eventlog/EventLog.h @@ -45,6 +45,8 @@ void postUserMsg(Capability *cap, char *msg, va_list ap); void postCapMsg(Capability *cap, char *msg, va_list ap); +void postEventStartup(EventCapNo n_caps); + #else /* !TRACING */ INLINE_HEADER void postSchedEvent (Capability *cap STG_UNUSED, -- 1.7.10.4