LTT_EVENT_FACILITY_LOAD,
LTT_EVENT_FACILITY_UNLOAD,
LTT_EVENT_HEARTBEAT,
+ LTT_EVENT_HEARTBEAT_FULL,
LTT_EVENT_STATE_DUMP_FACILITY_LOAD
};
struct LttFacilityLoad {
guint32 checksum;
guint32 id;
- guint32 int_size;
+ guint32 int_size;
guint32 long_size;
guint32 pointer_size;
guint32 size_t_size;
- guint32 has_alignment;
+ guint32 has_alignment;
} LTT_PACKED_STRUCT;
struct LttFacilityUnload {
struct LttStateDumpFacilityLoad {
guint32 checksum;
guint32 id;
- guint32 int_size;
+ guint32 int_size;
guint32 long_size;
guint32 pointer_size;
guint32 size_t_size;
- guint32 has_alignment;
+ guint32 has_alignment;
} LTT_PACKED_STRUCT;
/* Empty event */
typedef struct _TimeHeartbeat {
} LTT_PACKED_STRUCT TimeHeartbeat;
+typedef struct _TimeHeartbeatFull {
+ guint64 tsc;
+} LTT_PACKED_STRUCT TimeHeartbeatFull;
+
struct ltt_event_header_hb {
uint32_t timestamp;
unsigned char facility_id;
uint8_t flight_recorder;
uint8_t has_heartbeat;
uint8_t has_alignment; /* Event header alignment */
- uint32_t freq_scale;
+ uint32_t freq_scale;
} LTT_PACKED_STRUCT;
uint8_t flight_recorder;
uint8_t has_heartbeat;
uint8_t has_alignment; /* Event header alignment */
- uint32_t freq_scale;
+ uint32_t freq_scale;
} LTT_PACKED_STRUCT;
/* For version 0.7 */
uint64_t start_time_usec;
} LTT_PACKED_STRUCT;
+/* For version 0.8 */
+
+struct ltt_trace_header_0_8 {
+ uint32_t magic_number;
+ uint32_t arch_type;
+ uint32_t arch_variant;
+ uint32_t float_word_order;
+ uint8_t arch_size;
+ uint8_t major_version;
+ uint8_t minor_version;
+ uint8_t flight_recorder;
+ uint8_t has_heartbeat;
+ uint8_t has_alignment; /* Event header alignment */
+ uint8_t tsc_lsb_truncate;
+ uint8_t tscbits;
+ uint32_t freq_scale;
+ uint64_t start_freq;
+ uint64_t start_tsc;
+ uint64_t start_monotonic;
+ uint64_t start_time_sec;
+ uint64_t start_time_usec;
+} LTT_PACKED_STRUCT;
+
struct ltt_block_start_header {
struct {
guint size;
LttTypeEnum type_class; //which type
GHashTable *enum_map; //maps enum labels to numbers.
+ gint32 highest_value; //For enum
+ gint32 lowest_value; //For enum
GArray *fields; // Array of LttFields, for array, sequence, union, struct.
GData *fields_by_name;
- guint network; // Is the type in network byte order ?
+ guint network; // Is the type in network byte order ?
};
struct _LttEventType{
LttFacility * facility; //the facility that contains the event type
GArray * fields; //event's fields (LttField)
GData *fields_by_name;
+ int has_compact_data; //event header contains compact data (first field)
};
/* Structure LttEvent and LttEventPosition must begin with the _exact_ same
/* End of LttEventPosition fields */
- guint32 timestamp; /* truncated timestamp */
+ guint32 timestamp; /* truncated timestamp */
- unsigned char facility_id; /* facility ID are never reused. */
+ unsigned char facility_id; /* facility ID are never reused. */
unsigned char event_id;
LttTime event_time;
guint data_size;
guint event_size; //event_size field of the header :
//used to verify data_size from facility.
+ uint32_t compact_data;
int count; //the number of overflow of cycle count
gint64 overflow_nsec; //precalculated nsec for overflows
// (it's variable), then the field_size should be
// dynamically calculated while reading the trace
// and put here. Otherwise, the field_size always
- // equels the type size.
+ // equals the type size.
off_t array_offset; // offset of the beginning of the array (for array
// and sequences)
GArray * dynamic_offsets; // array of offsets calculated dynamically at
GQuark long_name; //tracefile complete filename
GQuark name; //tracefile name
guint cpu_num; //cpu number of the tracefile
- guint tid; //Usertrace tid, else 0
- guint pgid; //Usertrace pgid, else 0
- guint64 creation; //Usertrace creation, else 0
+ guint tid; //Usertrace tid, else 0
+ guint pgid; //Usertrace pgid, else 0
+ guint64 creation; //Usertrace creation, else 0
LttTrace * trace; //trace containing the tracefile
int fd; //file descriptor
off_t file_size; //file size
guint num_blocks; //number of blocks in the file
gboolean reverse_bo; //must we reverse byte order ?
gboolean float_word_order; //what is the byte order of floats ?
- size_t has_alignment; //alignment of events in the tracefile.
- // 0 or the architecture size in bytes.
+ size_t has_alignment; //alignment of events in the tracefile.
+ // 0 or the architecture size in bytes.
+ guint8 has_heartbeat;
size_t buffer_header_size;
-
- /* Current event */
+ int compact; //compact tracefile ?
+ uint8_t tsc_lsb_truncate;
+ uint8_t tscbits;
+ uint8_t tsc_msb_cutoff;
+ uint64_t tsc_mask;
+ uint64_t tsc_mask_next_bit; //next MSB after the mask
+
+ /* Current event */
LttEvent event; //Event currently accessible in the trace
- /* Current block */
+ /* Current block */
LttBuffer buffer; //current buffer
guint32 buf_size; /* The size of blocks */
- /* Time flow */
+ /* Time flow */
//unsigned int count; //the number of overflow of cycle count
//double nsec_per_cycle; //Nsec per cycle
//TimeHeartbeat * last_heartbeat; //last heartbeat
guint8 ltt_major_version;
guint8 ltt_minor_version;
guint8 flight_recorder;
- guint8 has_heartbeat;
- guint32 freq_scale;
+ guint32 freq_scale;
uint64_t start_freq;
uint64_t start_tsc;
uint64_t start_monotonic;
LttTime start_time;
LttTime start_time_from_tsc;
+ GArray *compact_facilities;
+ uint8_t compact_event_bits;
GData *tracefiles; //tracefiles groups
};
size_t size_of_type,
size_t has_alignment)
{
- size_t alignment = min(has_alignment, size_of_type);
-
- if(!has_alignment) return 0;
-
- g_assert(size_of_type != 0);
- return ((alignment - align_drift) & (alignment-1));
+ size_t alignment = min(has_alignment, size_of_type);
+
+ if(!has_alignment) return 0;
+
+ g_assert(size_of_type != 0);
+ return ((alignment - align_drift) & (alignment-1));
}