summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorDuncan Coutts <duncan@well-typed.com>2011-05-26 16:01:24 +0100
committerDuncan Coutts <duncan@well-typed.com>2011-05-26 18:47:38 +0100
commitc4f9b989c605776c1f07929672a856f07d9b4b44 (patch)
tree9316caee81d203db930b1c8460d6fd694b3bc142 /rts
parent68b76e0e49d4d95e1bfe9343697e2abc99470791 (diff)
downloadhaskell-c4f9b989c605776c1f07929672a856f07d9b4b44.tar.gz
Make the tracing of the startup event more regular
Rather than doing it differently for the eventlog and Dtrace cases.
Diffstat (limited to 'rts')
-rw-r--r--rts/RtsStartup.c4
-rw-r--r--rts/Trace.c6
-rw-r--r--rts/Trace.h16
-rw-r--r--rts/eventlog/EventLog.c20
-rw-r--r--rts/eventlog/EventLog.h2
5 files changed, 36 insertions, 12 deletions
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index 952e806345..0dacd61984 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 f2f9e81549..6c69cbc6dc 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 620915665b..b264394399 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 a77c257e1b..2884ad9f10 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 0cfab5c091..22a034c2d4 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,