clock: show that enumerations need to have their type declared
[ctf.git] / common-trace-format-specification.txt
index 4ecf4b879e77e62f48afc822bcf2c7bbc43b9b91..90a669b849a4fb45f7b47e66723f64e1c3217f12 100644 (file)
@@ -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
This page took 0.023587 seconds and 4 git commands to generate.