X-Git-Url: http://git.efficios.com/?p=ctf.git;a=blobdiff_plain;f=common-trace-format-specification.txt;h=90a669b849a4fb45f7b47e66723f64e1c3217f12;hp=4ecf4b879e77e62f48afc822bcf2c7bbc43b9b91;hb=aed18b5ef592ac98d04d023cf40d38598bb062d8;hpb=4cac83ee85af3683bcce60ef83184aa49507e7bc diff --git a/common-trace-format-specification.txt b/common-trace-format-specification.txt index 4ecf4b8..90a669b 100644 --- a/common-trace-format-specification.txt +++ b/common-trace-format-specification.txt @@ -65,6 +65,7 @@ Table of Contents 7.3.1 Lexical Scope 7.3.2 Static and Dynamic Scopes 7.4 TSDL Examples +8. Clocks 1. Preliminary definitions @@ -752,7 +753,6 @@ struct event_packet_context { uint32_t cpu_id; uint32_t/uint16_t content_size; uint32_t/uint16_t packet_size; - uint8_t stream_packet_count_bits; /* Significant counter bits */ uint8_t compression_scheme; uint8_t encryption_scheme; uint8_t checksum_scheme; @@ -1129,9 +1129,11 @@ stream { }; event { - name = event_name; + name = "event_name"; id = value; /* Numeric identifier within the stream */ stream_id = stream_id; + loglevel.identifier = "loglevel_identifier"; + loglevel.value = value; context := struct { ... }; @@ -1243,6 +1245,82 @@ struct { } +8. Clocks + +Clock metadata allows to describe the clock topology of the system, as +well as to detail each clock parameter. In absence of clock description, +it is assumed that all fields named "timestamp" use the same clock +source, which increments once per nanosecond. + +Describing a clock and how it is used by streams is threefold: first, +the clock and clock topology should be described in a "clock" +description block, e.g.: + +typealias integer { size = 32; align = 32; signed = true } := uint32_t; + +enum clocks : uint32_t { + cycle_counter, +}; + +clock[cycle_counter] { + uuid = "62189bee-96dc-11e0-91a8-cfa3d89f3923"; + description = "Local CPU cycle counter"; + freq = 1000000000; /* frequency, in Hz */ + /* precision in seconds is: 1000 * (1/freq) */ + precision = 1000; + /* clock value offset from Epoch is: offset * (1/freq) */ + offset = 1326476837897235420; +}; + +The optional field "uuid" is the unique identifier of the clock. It can +be used to correlate different traces that use the same clock. An +optional textual description string can be added with the "description" +field. The "freq" field is the initial frequency of the clock, in Hz. If +the "freq" field is not present, the frequency is assumed to be +1000000000 (providing clock increment of 1 ns). The optional "precision" +field details the uncertainty on the clock measurements, in (1/freq) +units. The "offset" field indicates the offset from POSIX.1 Epoch, +1970-01-01 00:00:00 +0000 (UTC), to the zero of value of the clock, in +(1/freq) units. If the "offset" field is not present, it is assigned the +0 value. + +Secondly, a reference to this clock should be added within an integer +type: + +typealias integer { + size = 64; align = 1; signed = false; + map = clock[cycle_counter].value; +} := uint64_ccnt_t; + +Thirdly, stream declarations can reference the clock they use as a +time-stamp source: + +struct packet_context { + uint64_ccnt_t ccnt_begin; + uint64_ccnt_t ccnt_end; + /* ... */ +}; + +stream { + /* ... */ + event.header := struct { + uint64_ccnt_t timestamp; + /* ... */ + } + packet.context := struct packet_context; +}; + +For a N-bit integer type referring to a clock, if the integer overflows +compared to the N low order bits of the clock prior value, then it is +assumed that one, and only one, overflow occurred. It is therefore +important that events encoding time on a small number of bits happen +frequently enough to detect when more than one N-bit overflow occurs. + +In a packet context, clock field names ending with "_begin" and "_end" +have a special meaning: this refers to the time-stamps at, respectively, +the beginning and the end of each packet. + + A. Helper macros The two following macros keep track of the size of a GNU/C structure without @@ -1314,6 +1392,7 @@ keyword: is one of align const char +clock double enum event