diff options
Diffstat (limited to 'includes/rts/EventLogFormat.h')
-rw-r--r-- | includes/rts/EventLogFormat.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/includes/rts/EventLogFormat.h b/includes/rts/EventLogFormat.h new file mode 100644 index 0000000000..363c1ca1cf --- /dev/null +++ b/includes/rts/EventLogFormat.h @@ -0,0 +1,143 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 2008-2009 + * + * Event log format + * + * The log format is designed to be extensible: old tools should be + * able to parse (but not necessarily understand all of) new versions + * of the format, and new tools will be able to understand old log + * files. + * + * Each event has a specific format. If you add new events, give them + * new numbers: we never re-use old event numbers. + * + * - The format is endian-independent: all values are represented in + * bigendian order. + * + * - The format is extensible: + * + * - The header describes each event type and its length. Tools + * that don't recognise a particular event type can skip those events. + * + * - There is room for extra information in the event type + * specification, which can be ignored by older tools. + * + * - Events can have extra information added, but existing fields + * cannot be changed. Tools should ignore extra fields at the + * end of the event record. + * + * - Old event type ids are never re-used; just take a new identifier. + * + * + * The format + * ---------- + * + * log : EVENT_HEADER_BEGIN + * EventType* + * EVENT_HEADER_END + * EVENT_DATA_BEGIN + * Event* + * EVENT_DATA_END + * + * EventType : + * EVENT_ET_BEGIN + * Word16 -- unique identifier for this event + * Int16 -- >=0 size of the event in bytes (minus the header) + * -- -1 variable size + * Word32 -- length of the next field in bytes + * Word8* -- string describing the event + * Word32 -- length of the next field in bytes + * Word8* -- extra info (for future extensions) + * EVENT_ET_END + * + * Event : + * Word16 -- event_type + * Word64 -- time (nanosecs) + * [Word16] -- length of the rest (for variable-sized events only) + * ... extra event-specific info ... + * + * + * To add a new event + * ------------------ + * + * - In this file: + * - give it a new number, add a new #define EVENT_XXX below + * - In EventLog.c + * - add it to the EventDesc array + * - emit the event type in initEventLogging() + * - emit the new event in postEvent_() + * - generate the event itself by calling postEvent() somewhere + * - In the Haskell code to parse the event log file: + * - add types and code to read the new event + * + * -------------------------------------------------------------------------- */ + +#ifndef RTS_EVENTLOGFORMAT_H +#define RTS_EVENTLOGFORMAT_H + +/* + * Markers for begin/end of the Header. + */ +#define EVENT_HEADER_BEGIN 0x68647262 /* 'h' 'd' 'r' 'b' */ +#define EVENT_HEADER_END 0x68647265 /* 'h' 'd' 'r' 'e' */ + +#define EVENT_DATA_BEGIN 0x64617462 /* 'd' 'a' 't' 'b' */ +#define EVENT_DATA_END 0xffff + +/* + * Markers for begin/end of the list of Event Types in the Header. + * Header, Event Type, Begin = hetb + * Header, Event Type, End = hete + */ +#define EVENT_HET_BEGIN 0x68657462 /* 'h' 'e' 't' 'b' */ +#define EVENT_HET_END 0x68657465 /* 'h' 'e' 't' 'e' */ + +#define EVENT_ET_BEGIN 0x65746200 /* 'e' 't' 'b' 0 */ +#define EVENT_ET_END 0x65746500 /* 'e' 't' 'e' 0 */ + +/* + * Types of event + */ +#define EVENT_CREATE_THREAD 0 /* (cap, thread) */ +#define EVENT_RUN_THREAD 1 /* (cap, thread) */ +#define EVENT_STOP_THREAD 2 /* (cap, thread, status) */ +#define EVENT_THREAD_RUNNABLE 3 /* (cap, thread) */ +#define EVENT_MIGRATE_THREAD 4 /* (cap, thread, new_cap) */ +#define EVENT_RUN_SPARK 5 /* (cap, thread) */ +#define EVENT_STEAL_SPARK 6 /* (cap, thread, victim_cap) */ +#define EVENT_SHUTDOWN 7 /* (cap) */ +#define EVENT_THREAD_WAKEUP 8 /* (cap, thread, other_cap) */ +#define EVENT_GC_START 9 /* (cap) */ +#define EVENT_GC_END 10 /* (cap) */ +#define EVENT_REQUEST_SEQ_GC 11 /* (cap) */ +#define EVENT_REQUEST_PAR_GC 12 /* (cap) */ +#define EVENT_CREATE_SPARK 13 /* (cap, thread) */ +#define EVENT_SPARK_TO_THREAD 14 /* DEPRECATED! (cap, thread, spark_thread) */ +#define EVENT_CREATE_SPARK_THREAD 15 /* (cap, thread, spark_thread) */ + +#define NUM_EVENT_TAGS 16 + +/* + * Status values for EVENT_STOP_THREAD + * + * 1-5 are the StgRun return values (from includes/Constants.h): + * + * #define HeapOverflow 1 + * #define StackOverflow 2 + * #define ThreadYielding 3 + * #define ThreadBlocked 4 + * #define ThreadFinished 5 + */ +#define THREAD_SUSPENDED_FOREIGN_CALL 6 + +#ifndef EVENTLOG_CONSTANTS_ONLY + +typedef StgWord16 EventTypeNum; +typedef StgWord64 EventTimestamp; // in nanoseconds +typedef StgWord64 EventThreadID; +typedef StgWord16 EventCapNo; + +#endif + +#endif /* RTS_EVENTLOGFORMAT_H */ |