tracecontext.c: start conversion
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.h
index 6afff0ffca55ce34e8aee3b907054fedff220754..af65046378cdc819394fe96c7cdc1c8bd1f4160f 100644 (file)
@@ -23,6 +23,7 @@
 #include <lttv/attribute.h>
 #include <lttv/hook.h>
 #include <ltt/ltt.h>
+#include <ltt/markers.h>
 
 /* This is the generic part of trace processing. All events within a
    certain time interval are accessed and processing hooks are called for
@@ -74,6 +75,14 @@ typedef struct _LttvTraceContextClass LttvTraceContextClass;
 typedef struct _LttvTracefileContext LttvTracefileContext;
 typedef struct _LttvTracefileContextClass LttvTracefileContextClass;
 
+typedef struct _LttvTracesetContextPosition LttvTracesetContextPosition;
+typedef struct _LttvTraceContextPosition LttvTraceContextPosition;
+
+#ifndef LTTVFILTER_TYPE_DEFINED
+typedef struct _LttvFilter LttvFilter;
+#define LTTVFILTER_TYPE_DEFINED
+#endif
+
 #define LTTV_TRACESET_CONTEXT_TYPE  (lttv_traceset_context_get_type ())
 #define LTTV_TRACESET_CONTEXT(obj)  (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACESET_CONTEXT_TYPE, LttvTracesetContext))
 #define LTTV_TRACESET_CONTEXT_CLASS(vtable)  (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACESET_CONTEXT_TYPE, LttvTracesetContextClass))
@@ -85,13 +94,14 @@ struct _LttvTracesetContext {
   GObject parent;
 
   LttvTraceset *ts;
-  LttvHooks *before;
-  LttvHooks *after;
   LttvTraceContext **traces;
   LttvAttribute *a;
   LttvAttribute *ts_a;
-  TimeInterval *Time_Span;
+  TimeInterval time_span;
   GTree *pqueue;
+
+  LttvTracesetContextPosition *sync_position;   /* position at which to sync the
+                                                   trace context */
 };
 
 struct _LttvTracesetContextClass {
@@ -134,12 +144,11 @@ struct _LttvTraceContext {
   guint index;                /* in ts_context->traces */
   LttTrace *t;
   LttvTrace *vt;
-  LttvHooks *check;
-  LttvHooks *before;
-  LttvHooks *after;
-  LttvTracefileContext **tracefiles;
+  //LttvTracefileContext **tracefiles;
+  GArray *tracefiles;
   LttvAttribute *a;
   LttvAttribute *t_a;
+  TimeInterval time_span;
 };
 
 struct _LttvTraceContextClass {
@@ -159,20 +168,16 @@ struct _LttvTracefileContext {
   GObject parent;
 
   LttvTraceContext *t_context;
-  gboolean control;
// gboolean control;
   guint index;                /* in ts_context->tracefiles */
   LttTracefile *tf;
-  LttvHooks *check;
-  LttvHooks *before;
-  LttvHooks *after;
-  LttEvent *e;
-  LttvHooks *check_event;
-  LttvHooks *before_event;
-  LttvHooksById *before_event_by_id;
-  LttvHooks *after_event;
-  LttvHooksById *after_event_by_id;
+ // LttEvent *e;
+  LttvHooks *event;
+  LttvHooksById *event_by_id;
   LttTime timestamp;
   LttvAttribute *a;
+  gint target_pid;          /* Target PID of the event.
+                               Updated by state.c. -1 means unset. */
 };
 
 struct _LttvTracefileContextClass {
@@ -188,93 +193,101 @@ GType lttv_tracefile_context_get_type (void);
 void lttv_process_traceset(LttvTracesetContext *self, LttTime end, 
     unsigned nb_events);
 
-/* Process traceset can also be done in smaller pieces calling begin, middle
-   repeatedly, and end. The middle function return the number of events 
-   processed. It may be larger than nb_events if several events have the 
-   same timestamp. It will be smaller than nb_events if the end time
-   is reached. */
+/* Process traceset can also be done in smaller pieces calling begin,
+ * then seek and middle repeatedly, and end. The middle function return the
+ * number of events processed. It will be smaller than nb_events if the end time
+ * or end position is reached. */
 
-void lttv_process_traceset_begin(LttvTracesetContext *self, LttTime end);
 
-guint lttv_process_traceset_middle(LttvTracesetContext *self, LttTime end, 
-    unsigned nb_events);
+void lttv_process_traceset_begin(LttvTracesetContext *self,
+                                 LttvHooks       *before_traceset,
+                                 LttvHooks       *before_trace,
+                                 LttvHooks       *before_tracefile,
+                                 LttvHooks       *event,
+                                 LttvHooksById   *event_by_id);
+
+
+guint lttv_process_traceset_middle(LttvTracesetContext *self,
+                              LttTime end, 
+                              guint nb_events,
+                              const LttvTracesetContextPosition *end_position);
 
-void lttv_process_traceset_end(LttvTracesetContext *self);
+void lttv_process_traceset_end(LttvTracesetContext *self,
+                               LttvHooks           *after_traceset,
+                               LttvHooks           *after_trace,
+                               LttvHooks           *after_tracefile,
+                               LttvHooks           *event,
+                               LttvHooksById       *event_by_id);
 
 
 void lttv_process_traceset_seek_time(LttvTracesetContext *self, LttTime start);
 
+gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self, 
+                                        const LttvTracesetContextPosition *pos);
+
 void lttv_process_trace_seek_time(LttvTraceContext *self, LttTime start);
 
 void lttv_traceset_context_add_hooks(LttvTracesetContext *self,
-    LttvHooks *before_traceset, 
-    LttvHooks *after_traceset,
-    LttvHooks *check_trace, 
+    LttvHooks *before_traceset,
     LttvHooks *before_trace, 
-    LttvHooks *after_trace, 
-    LttvHooks *check_tracefile,
     LttvHooks *before_tracefile,
-    LttvHooks *after_tracefile,
-    LttvHooks *check_event, 
-    LttvHooks *before_event, 
-    LttvHooks *after_event);
+    LttvHooks *event,
+    LttvHooksById *event_by_id);
 
 void lttv_traceset_context_remove_hooks(LttvTracesetContext *self,
-    LttvHooks *before_traceset, 
     LttvHooks *after_traceset,
-    LttvHooks *check_trace, 
-    LttvHooks *before_trace, 
     LttvHooks *after_trace, 
-    LttvHooks *check_tracefile,
-    LttvHooks *before_tracefile,
     LttvHooks *after_tracefile,
-    LttvHooks *check_event, 
-    LttvHooks *before_event, 
-    LttvHooks *after_event);
+    LttvHooks *event, 
+    LttvHooksById *event_by_id);
 
 void lttv_trace_context_add_hooks(LttvTraceContext *self,
-                                 LttvHooks *check_trace, 
-                                 LttvHooks *before_trace, 
-                                 LttvHooks *after_trace);
+    LttvHooks *before_trace, 
+    LttvHooks *before_tracefile,
+    LttvHooks *event, 
+    LttvHooksById *event_by_id);
 
 void lttv_trace_context_remove_hooks(LttvTraceContext *self,
-                                    LttvHooks *check_trace, 
-                                    LttvHooks *before_trace, 
-                                    LttvHooks *after_trace);
+    LttvHooks *after_trace, 
+    LttvHooks *after_tracefile,
+    LttvHooks *event, 
+    LttvHooksById *event_by_id);
 
 void lttv_tracefile_context_add_hooks(LttvTracefileContext *self,
-                                     LttvHooks *check_tracefile,
-                                     LttvHooks *before_tracefile,
-                                     LttvHooks *after_tracefile,
-                                     LttvHooks *check_event, 
-                                     LttvHooks *before_event, 
-                                     LttvHooks *after_event);
+          LttvHooks *before_tracefile,
+          LttvHooks *event, 
+          LttvHooksById *event_by_id);
+
 
 void lttv_tracefile_context_remove_hooks(LttvTracefileContext *self,
-                                        LttvHooks *check_tracefile,
-                                        LttvHooks *before_tracefile,
-                                        LttvHooks *after_tracefile,
-                                        LttvHooks *check_event, 
-                                        LttvHooks *before_event, 
-                                        LttvHooks *after_event);
+           LttvHooks *after_tracefile,
+           LttvHooks *event, 
+           LttvHooksById *event_by_id);
+
 
 void lttv_tracefile_context_add_hooks_by_id(LttvTracefileContext *self,
                                            unsigned i,
-                                           LttvHooks *before_event_by_id, 
-                                           LttvHooks *after_event_by_id);
+                                           LttvHooks *event_by_id);
 
 void lttv_tracefile_context_remove_hooks_by_id(LttvTracefileContext *self,
                                               unsigned i);
 
 typedef struct _LttvTraceHook {
   LttvHook h;
-  guint id;
-  LttField *f1;
-  LttField *f2;
-  LttField *f3;
+  guint id;  /* id of the event associated with this hook */
+  struct marker_field *f1;
+  struct marker_field *f2;
+  struct marker_field *f3;
+  gpointer hook_data;
 } LttvTraceHook;
 
 
+/* Get the head of marker list correcponding to the given trace hook.
+ */
+struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th);
+
+void lttv_trace_hook_destroy(LttvTraceHook *th);
+
 /* Search in the trace for the id of the named event type within the named
    facility. Then, find the three (if non null) named fields. All that
    information is then used to fill the LttvTraceHook structure. This
@@ -282,7 +295,75 @@ typedef struct _LttvTraceHook {
    registering a hook using this structure as event data;
    it already contains the (up to three) needed fields handles. */
  
-void lttv_trace_find_hook(LttTrace *t, char *facility, char *event_type,
-    char *field1, char *field2, char *field3, LttvHook h, LttvTraceHook *th);
+gint lttv_trace_find_hook(LttTrace *t, GQuark event_type,
+    GQuark field1, GQuark field2, GQuark field3, LttvHook h,
+    gpointer hook_data, LttvTraceHook *th);
+
+LttvTracefileContext *lttv_traceset_context_get_current_tfc(
+                             LttvTracesetContext *self);
+
+
+LttvTracesetContextPosition *lttv_traceset_context_position_new(
+    const LttvTracesetContext *self);
+
+void lttv_traceset_context_position_save(const LttvTracesetContext *self,
+                                    LttvTracesetContextPosition *pos);
+
+void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *pos);
+
+void lttv_traceset_context_position_copy(LttvTracesetContextPosition *dest,
+                                   const LttvTracesetContextPosition *src);
+
+gint lttv_traceset_context_pos_pos_compare(
+                          const LttvTracesetContextPosition *pos1,
+                          const LttvTracesetContextPosition *pos2);
+
+gint lttv_traceset_context_ctx_pos_compare(const LttvTracesetContext *self,
+                                    const LttvTracesetContextPosition *pos2);
+
+LttTime lttv_traceset_context_position_get_time(
+                                      const LttvTracesetContextPosition *pos);
+
+gint compare_tracefile(gconstpointer a, gconstpointer b);
+
+
+/* Synchronisation helpers : save/restore synchronization between ltt traces and
+ * a traceset context. */
+void lttv_process_traceset_synchronize_tracefiles(LttvTracesetContext *tsc);
+
+void lttv_process_traceset_get_sync_data(LttvTracesetContext *tsc);
+
+/* Seek n events forward and backward (without filtering) : only use these where
+ * necessary : the seek backward is costy. */
+
+#define BACKWARD_SEEK_MUL 2 /* Multiplication factor of time_offset between
+                               backward seek iterations */
+
+static const LttTime seek_back_default_offset = { 1, 0 };
+
+typedef gboolean check_handler(guint count, gboolean *stop_flag, gpointer data);
+
+guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self,
+                                           guint n,
+                                          check_handler *check,
+                                          gboolean *stop_flag,
+                                          LttvFilter *filter1,
+                                          LttvFilter *filter2,
+                                          LttvFilter *filter3,
+                                          gpointer data);
+typedef void (*seek_time_fct)(LttvTracesetContext *self, LttTime start);
+
+/* If first_offset is ltt_time_zero, it will choose a default value */
+guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
+                                            guint n,
+                                            LttTime first_offset,
+                                            seek_time_fct,
+                                           check_handler *check,
+                                           gboolean *stop_flag,
+                                           LttvFilter *filter1,
+                                           LttvFilter *filter2,
+                                           LttvFilter *filter3,
+                                           gpointer data);
+
 
 #endif // PROCESSTRACE_H
This page took 0.026219 seconds and 4 git commands to generate.