change trace version to 0.4 : use monotonic time at ns precision
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Mon, 12 Sep 2005 16:08:44 +0000 (16:08 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Mon, 12 Sep 2005 16:08:44 +0000 (16:08 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@1167 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/ltt/facility.c
ltt/branches/poly/ltt/ltt-private.h
ltt/branches/poly/ltt/tracefile.c

index 98ca73714ef422184d6345dc7fb6c220573dd95d..f4c0acae6c939f6f488a31cbc6c9fd40d908c1fd 100644 (file)
@@ -148,8 +148,11 @@ int ltt_facility_open(LttFacility *f, LttTrace * t, gchar * pathname)
   fclose(in.fp);
 open_error:
 
-  if(!generated)
-    g_warning("Cannot find facility %s, checksum 0x%X", f->name, f->checksum);
+  if(!generated) {
+    g_warning("Cannot find facility %s, checksum 0x%X",
+        g_quark_to_string(f->name), f->checksum);
+    ret = 1;
+  }
 
   return ret;
 }
index bf659e02e19f30c7aea236851f98ceb11f6e0ce8..1bbe0a10ddcf9e56f0367e4785a77c0aceb19b13 100644 (file)
@@ -170,16 +170,35 @@ struct ltt_trace_header_0_3 {
        uint8_t                          has_tsc;
 } LTT_PACKED_STRUCT;
 
+/* For version 0.4 */
+
+struct ltt_trace_header_0_4 {
+  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         has_tsc;
+  uint64_t        start_monotonic;
+  struct timespec start_time;
+} LTT_PACKED_STRUCT;
 
 
 struct ltt_block_start_header {
   struct { 
-    struct timeval          timestamp;
+    uint64_t                timestamp;
     uint64_t                cycle_count;
+    uint64_t                freq;
   } begin;
   struct {
-    struct timeval          timestamp;
+    uint64_t                timestamp;
     uint64_t                cycle_count;
+    uint64_t                freq;
   } end;
   uint32_t                lost_size;  /* Size unused at the end of the buffer */
   uint32_t                buf_size;   /* The size of this sub-buffer */
@@ -323,16 +342,19 @@ typedef struct _LttBuffer {
   struct {
     LttTime                 timestamp;
     uint64_t                cycle_count;
+    uint64_t                freq; /* Frequency in khz */
   } begin;
   struct {
     LttTime                 timestamp;
     uint64_t                cycle_count;
+    uint64_t                freq; /* Frequency in khz */
   } end;
   uint32_t                lost_size; /* Size unused at the end of the buffer */
 
   /* Timekeeping */
   uint64_t                tsc;       /* Current timestamp counter */
-  double                  nsecs_per_cycle;
+  uint64_t                freq; /* Frequency in khz */
+  double                  nsecs_per_cycle;  /* Precalculated from freq */
 } LttBuffer;
 
 struct _LttTracefile{
@@ -389,6 +411,8 @@ struct _LttTrace{
   guint8    has_heartbeat;
   guint8    has_alignment;
        guint8          has_tsc;
+  uint64_t  start_monotonic;
+  LttTime   start_time;
 
   GData     *tracefiles;                    //tracefiles groups
 };
index b9ab0b71f2f5d79defa33b0c0e36f08f96ddbc29..6500a2d2e229dd88c73dbded7f9ed773a33fa7a2 100644 (file)
@@ -235,10 +235,28 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t)
         tf->buffer_header_size =
          sizeof(struct ltt_block_start_header) 
             + sizeof(struct ltt_trace_header_0_3);
+        g_warning("Unsupported trace version : %hhu.%hhu",
+              any->major_version, any->minor_version);
+        return 1;
+      }
+      break;
+    case 4:
+      {
+        struct ltt_trace_header_0_4 *vheader =
+          (struct ltt_trace_header_0_4 *)header;
+        tf->buffer_header_size =
+         sizeof(struct ltt_block_start_header) 
+            + sizeof(struct ltt_trace_header_0_4);
+        if(t) {
+          t->start_monotonic = ltt_get_uint64(LTT_GET_BO(tf),
+                                              &vheader->start_monotonic);
+          t->start_time = ltt_get_time(LTT_GET_BO(tf),
+                                       &vheader->start_time);
+        }
       }
       break;
     default:
-        g_warning("Unsupported trace version : %hhu.%hhu",
+      g_warning("Unsupported trace version : %hhu.%hhu",
             any->major_version, any->minor_version);
       return 1;
     }
@@ -1723,25 +1741,37 @@ static gint map_block(LttTracefile * tf, guint block_num)
 
   header = (struct ltt_block_start_header*)tf->buffer.head;
 
-  tf->buffer.begin.timestamp = ltt_get_time(LTT_GET_BO(tf),
-                                              &header->begin.timestamp);
-  tf->buffer.begin.timestamp.tv_nsec *= NSEC_PER_USEC;
+  tf->buffer.begin.timestamp = ltt_time_add(
+                                ltt_time_from_uint64(
+                                 ltt_get_uint64(LTT_GET_BO(tf),
+                                  &header->begin.timestamp)
+                                    - tf->trace->start_monotonic),
+                                  tf->trace->start_time);
   //g_debug("block %u begin : %lu.%lu", block_num,
   //    tf->buffer.begin.timestamp.tv_sec, tf->buffer.begin.timestamp.tv_nsec);
   tf->buffer.begin.cycle_count = ltt_get_uint64(LTT_GET_BO(tf),
                                               &header->begin.cycle_count);
-  tf->buffer.end.timestamp = ltt_get_time(LTT_GET_BO(tf),
-                                              &header->end.timestamp);
-  tf->buffer.end.timestamp.tv_nsec *= NSEC_PER_USEC;
+  tf->buffer.begin.freq = ltt_get_uint64(LTT_GET_BO(tf),
+                                         &header->begin.freq);
+  tf->buffer.end.timestamp = ltt_time_add(
+                                ltt_time_from_uint64(
+                                 ltt_get_uint64(LTT_GET_BO(tf),
+                                  &header->end.timestamp)
+                                    - tf->trace->start_monotonic),
+                                  tf->trace->start_time);
+
   //g_debug("block %u end : %lu.%lu", block_num,
   //    tf->buffer.end.timestamp.tv_sec, tf->buffer.end.timestamp.tv_nsec);
   tf->buffer.end.cycle_count = ltt_get_uint64(LTT_GET_BO(tf),
                                               &header->end.cycle_count);
+  tf->buffer.end.freq = ltt_get_uint64(LTT_GET_BO(tf),
+                                       &header->end.freq);
   tf->buffer.lost_size = ltt_get_uint32(LTT_GET_BO(tf),
-                                              &header->lost_size);
+                                        &header->lost_size);
   
   tf->buffer.tsc =  tf->buffer.begin.cycle_count;
   tf->event.tsc = tf->buffer.tsc;
+  tf->buffer.freq = tf->buffer.begin.freq;
 
   /* FIXME
    * eventually support variable buffer size : will need a partial pre-read of
@@ -1905,29 +1935,21 @@ error:
 /*****************************************************************************
  *Function name
  *    calc_nsecs_per_cycle : calculate nsecs per cycle for current block
+ *
+ *    1.0 / (freq(khz) *1000)  * 1000000000
  *Input Params
  *    t               : tracefile
  ****************************************************************************/
-
+/* from timer_tsc.c */
+#define CYC2NS_SCALE_FACTOR 10
 static double calc_nsecs_per_cycle(LttTracefile * tf)
 {
-  LttTime           lBufTotalTime; /* Total time for this buffer */
-  double            lBufTotalNSec; /* Total time for this buffer in nsecs */
-  LttCycleCount     lBufTotalCycle;/* Total cycles for this buffer */
-
-  /* Calculate the total time for this buffer */
-  lBufTotalTime = ltt_time_sub(tf->buffer.end.timestamp,
-                               tf->buffer.begin.timestamp);
-
-  /* Calculate the total cycles for this bufffer */
-  lBufTotalCycle  = tf->buffer.end.cycle_count;
-  lBufTotalCycle -= tf->buffer.begin.cycle_count;
-
-  /* Convert the total time to double */
-  lBufTotalNSec  = ltt_time_to_double(lBufTotalTime);
+  //return 1e6 / (double)tf->buffer.freq;
+  guint64 cpu_mhz = tf->buffer.freq / 1000;
+  guint64 cyc2ns_scale = (1000 << CYC2NS_SCALE_FACTOR)/cpu_mhz;
   
-  return lBufTotalNSec / (double)lBufTotalCycle;
-
+  return cyc2ns_scale >> CYC2NS_SCALE_FACTOR;
+ // return 1e6 / (double)tf->buffer.freq;
 }
 #if 0
 void setFieldsOffset(LttTracefile *tf, LttEventType *evT,void *evD)
This page took 0.030542 seconds and 4 git commands to generate.