X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FTrace.h;h=f253280b260f349a33c199e3bfb32c7f443a5625;hb=43c7d555c8d7eea6ba0d76bce33be8d25a01c6fd;hp=4f3ebcec6368845c2d4f6fd6055b0939480769b4;hpb=51b85031ce99f1e9d4c72249d6d85672188f0fbd;p=ghc-hetmet.git diff --git a/rts/Trace.h b/rts/Trace.h index 4f3ebce..f253280 100644 --- a/rts/Trace.h +++ b/rts/Trace.h @@ -27,9 +27,17 @@ void initTracing (void); void endTracing (void); void freeTracing (void); +void resetTracing (void); #endif /* TRACING */ +typedef StgWord32 CapsetID; +typedef StgWord16 CapsetType; +enum CapsetType { CapsetTypeCustom = CAPSET_TYPE_CUSTOM, + CapsetTypeOsProcess = CAPSET_TYPE_OSPROCESS, + CapsetTypeClockdomain = CAPSET_TYPE_CLOCKDOMAIN }; +#define CAPSET_OSPROCESS_DEFAULT 0 + // ----------------------------------------------------------------------------- // Message classes // ----------------------------------------------------------------------------- @@ -77,11 +85,16 @@ void traceEnd (void); */ #define traceSchedEvent(cap, tag, tso, other) \ if (RTS_UNLIKELY(TRACE_sched)) { \ - traceSchedEvent_(cap, tag, tso, other); \ + traceSchedEvent_(cap, tag, tso, other, 0); \ + } + +#define traceSchedEvent2(cap, tag, tso, info1, info2) \ + if (RTS_UNLIKELY(TRACE_sched)) { \ + traceSchedEvent_(cap, tag, tso, info1, info2); \ } void traceSchedEvent_ (Capability *cap, EventTypeNum tag, - StgTSO *tso, StgWord64 other); + StgTSO *tso, StgWord info1, StgWord info2); /* @@ -154,15 +167,33 @@ void traceUserMsg(Capability *cap, char *msg); void traceThreadStatus_ (StgTSO *tso); +void traceEventStartup_ (int n_caps); + +/* + * Events for describing capability sets in the eventlog + * + * Note: unlike other events, these are not conditional on TRACE_sched or + * similar because they are not "real" events themselves but provide + * information and context for other "real" events. Other events depend on + * the capset info events so for simplicity, rather than working out if + * they're necessary we always emit them. They should be very low volume. + */ +void traceCapsetModify_ (EventTypeNum tag, + CapsetID capset, + StgWord32 other); + #else /* !TRACING */ #define traceSchedEvent(cap, tag, tso, other) /* nothing */ +#define traceSchedEvent2(cap, tag, tso, other, info) /* nothing */ #define traceEvent(cap, tag) /* nothing */ #define traceCap(class, cap, msg, ...) /* nothing */ #define trace(class, msg, ...) /* nothing */ #define debugTrace(class, str, ...) /* nothing */ #define debugTraceCap(class, cap, str, ...) /* nothing */ #define traceThreadStatus(class, tso) /* nothing */ +#define traceEventStartup_(n_caps) /* nothing */ +#define traceCapsetModify_(tag, capset, other) /* nothing */ #endif /* TRACING */ @@ -185,8 +216,8 @@ void dtraceUserMsgWrapper(Capability *cap, char *msg); HASKELLEVENT_CREATE_THREAD(cap, tid) #define dtraceRunThread(cap, tid) \ HASKELLEVENT_RUN_THREAD(cap, tid) -#define dtraceStopThread(cap, tid, status) \ - HASKELLEVENT_STOP_THREAD(cap, tid, status) +#define dtraceStopThread(cap, tid, status, info) \ + HASKELLEVENT_STOP_THREAD(cap, tid, status, info) #define dtraceThreadRunnable(cap, tid) \ HASKELLEVENT_THREAD_RUNNABLE(cap, tid) #define dtraceMigrateThread(cap, tid, new_cap) \ @@ -219,12 +250,20 @@ void dtraceUserMsgWrapper(Capability *cap, char *msg); HASKELLEVENT_GC_WORK(cap) #define dtraceGcDone(cap) \ HASKELLEVENT_GC_DONE(cap) +#define dtraceCapsetCreate(capset, capset_type) \ + HASKELLEVENT_CAPSET_CREATE(capset, capset_type) +#define dtraceCapsetDelete(capset) \ + HASKELLEVENT_CAPSET_DELETE(capset) +#define dtraceCapsetAssignCap(capset, capno) \ + HASKELLEVENT_CAPSET_ASSIGN_CAP(capset, capno) +#define dtraceCapsetRemoveCap(capset, capno) \ + HASKELLEVENT_CAPSET_REMOVE_CAP(capset, capno) #else /* !defined(DTRACE) */ #define dtraceCreateThread(cap, tid) /* nothing */ #define dtraceRunThread(cap, tid) /* nothing */ -#define dtraceStopThread(cap, tid, status) /* nothing */ +#define dtraceStopThread(cap, tid, status, info) /* nothing */ #define dtraceThreadRunnable(cap, tid) /* nothing */ #define dtraceMigrateThread(cap, tid, new_cap) /* nothing */ #define dtraceRunSpark(cap, tid) /* nothing */ @@ -241,6 +280,10 @@ void dtraceUserMsgWrapper(Capability *cap, char *msg); #define dtraceGcIdle(cap) /* nothing */ #define dtraceGcWork(cap) /* nothing */ #define dtraceGcDone(cap) /* nothing */ +#define dtraceCapsetCreate(capset, capset_type) /* nothing */ +#define dtraceCapsetDelete(capset) /* nothing */ +#define dtraceCapsetAssignCap(capset, capno) /* nothing */ +#define dtraceCapsetRemoveCap(capset, capno) /* nothing */ #endif @@ -264,7 +307,7 @@ void dtraceUserMsgWrapper(Capability *cap, char *msg); INLINE_HEADER void traceEventCreateThread(Capability *cap STG_UNUSED, StgTSO *tso STG_UNUSED) { - traceSchedEvent(cap, EVENT_CREATE_THREAD, tso, tso->stack_size); + traceSchedEvent(cap, EVENT_CREATE_THREAD, tso, tso->stackobj->stack_size); dtraceCreateThread((EventCapNo)cap->no, (EventThreadID)tso->id); } @@ -277,11 +320,12 @@ INLINE_HEADER void traceEventRunThread(Capability *cap STG_UNUSED, INLINE_HEADER void traceEventStopThread(Capability *cap STG_UNUSED, StgTSO *tso STG_UNUSED, - StgThreadReturnCode status STG_UNUSED) + StgThreadReturnCode status STG_UNUSED, + StgWord32 info STG_UNUSED) { - traceSchedEvent(cap, EVENT_STOP_THREAD, tso, status); + traceSchedEvent2(cap, EVENT_STOP_THREAD, tso, status, info); dtraceStopThread((EventCapNo)cap->no, (EventThreadID)tso->id, - (EventThreadStatus)status); + (EventThreadStatus)status, (EventThreadID)info); } // needs to be EXTERN_INLINE as it is used in another EXTERN_INLINE function @@ -366,17 +410,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) @@ -397,6 +442,33 @@ INLINE_HEADER void traceEventGcDone(Capability *cap STG_UNUSED) dtraceGcDone((EventCapNo)cap->no); } +INLINE_HEADER void traceCapsetCreate(CapsetID capset STG_UNUSED, + CapsetType capset_type STG_UNUSED) +{ + traceCapsetModify_(EVENT_CAPSET_CREATE, capset, capset_type); + dtraceCapsetCreate(capset, capset_type); +} + +INLINE_HEADER void traceCapsetDelete(CapsetID capset STG_UNUSED) +{ + traceCapsetModify_(EVENT_CAPSET_DELETE, capset, 0); + dtraceCapsetDelete(capset); +} + +INLINE_HEADER void traceCapsetAssignCap(CapsetID capset STG_UNUSED, + nat capno STG_UNUSED) +{ + traceCapsetModify_(EVENT_CAPSET_ASSIGN_CAP, capset, capno); + dtraceCapsetAssignCap(capset, capno); +} + +INLINE_HEADER void traceCapsetRemoveCap(CapsetID capset STG_UNUSED, + nat capno STG_UNUSED) +{ + traceCapsetModify_(EVENT_CAPSET_REMOVE_CAP, capset, capno); + dtraceCapsetRemoveCap(capset, capno); +} + #include "EndPrivate.h" #endif /* TRACE_H */