/* ----------------------------------------------------------------------------- * * (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 /* (thread) */ #define EVENT_RUN_THREAD 1 /* (thread) */ #define EVENT_STOP_THREAD 2 /* (thread, status) */ #define EVENT_THREAD_RUNNABLE 3 /* (thread) */ #define EVENT_MIGRATE_THREAD 4 /* (thread, new_cap) */ #define EVENT_RUN_SPARK 5 /* (thread) */ #define EVENT_STEAL_SPARK 6 /* (thread, victim_cap) */ #define EVENT_SHUTDOWN 7 /* () */ #define EVENT_THREAD_WAKEUP 8 /* (thread, other_cap) */ #define EVENT_GC_START 9 /* () */ #define EVENT_GC_END 10 /* () */ #define EVENT_REQUEST_SEQ_GC 11 /* () */ #define EVENT_REQUEST_PAR_GC 12 /* () */ #define EVENT_CREATE_SPARK_THREAD 15 /* (spark_thread) */ #define EVENT_LOG_MSG 16 /* (message ...) */ #define EVENT_STARTUP 17 /* (num_capabilities) */ #define EVENT_BLOCK_MARKER 18 /* (size, end_time, capability) */ #define EVENT_USER_MSG 19 /* (message ...) */ #define EVENT_VERSION 23 /* (version_string) */ #define EVENT_PROGRAM_INVOCATION 24 /* (commandline_string) */ /* range 25 - 59 reserved for sequential trace events */ /* start of parallel trace events */ #define EVENT_EDEN_START_RECEIVE 60 /* () */ #define EVENT_EDEN_END_RECEIVE 61 /* () */ #define EVENT_CREATE_PROCESS 62 /* (process) */ #define EVENT_KILL_PROCESS 63 /* (process) */ #define EVENT_ASSIGN_THREAD_TO_PROCESS 64 /* (thread, process) */ #define EVENT_CREATE_MACHINE 65 /* (machine, startupTime(in 10^-8 seconds after 19xx)) */ #define EVENT_KILL_MACHINE 66 /* (machine) */ #define EVENT_SEND_MESSAGE 67 /* (tag, sender_process, sender_thread, receiver_machine, receiver_process, receiver_inport) */ #define EVENT_RECEIVE_MESSAGE 68 /* (tag, receiver_process, receiver_inport, sender_machine, sender_process, sender_outport, message_size) */ /* following events defined here but not yet anywhere else realised (i.e. EventLog.c) */ #define EVENT_GUM_THREAD_END 69 /* (thread, spark_name, start_time, heap_allocations, run_time, block_time, block_count, fetch_time, local_spark_count, global_spark_count) */ #define EVENT_GUM_CREATE_THREAD_INFO 70 /* (thread, expression_location, spark_site) */ #define EVENT_GUM_BLOCKED_ON 71 /* (thread, global_address) */ #define EVENT_GUM_FETCH 72 /* (thread, global_address) */ #define EVENT_GUM_RESUME 73 /* (thread, global_address) */ #define EVENT_GUM_MIGRATE_THREAD 74 /* (thread, pe) */ #define EVENT_GUM_THREAD_STOLEN 75 /* (new_thread_id, old_pe) */ #define EVENT_GUM_CREATE_SPARK 76 /* (expression_location) */ #define EVENT_GUM_PRUNE_SPARK 77 /* (expression_location) *) */ #define EVENT_GUM_EXPORT_SPARK 78 /* (expression_location, target_pe) */ #define EVENT_GUM_ACQUIRE_SPARK 79 /* (expression_location, source_pe) */ #define EVENT_GUM_SYSTEM_CENSUS 80 /* (spark_count, runnable_thread_count, load) */ #define NUM_EVENT_TAGS 69 // !!! NOTE: switch to 81 when realising the GUM events !!! #if 0 /* DEPRECATED EVENTS: */ #define EVENT_CREATE_SPARK 13 /* (cap, thread) */ #define EVENT_SPARK_TO_THREAD 14 /* (cap, thread, spark_thread) */ #endif /* * 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; typedef StgWord16 EventPayloadSize; // variable-size events typedef StgWord16 EventThreadStatus; // status for EVENT_STOP_THREAD typedef StgWord32 EventProcessID; typedef StgWord16 EventMachineID; typedef EventThreadID EventPortID; #endif #endif /* RTS_EVENTLOGFORMAT_H */