Initial port of the state system to the LTTng 2.0 trace format
[lttv.git] / lttv / lttv / traceset-process.c
diff --git a/lttv/lttv/traceset-process.c b/lttv/lttv/traceset-process.c
new file mode 100644 (file)
index 0000000..3f6554d
--- /dev/null
@@ -0,0 +1,198 @@
+/* This file is part of the Linux Trace Toolkit viewer
+ * Copyright (C) 2003-2004 Michel Dagenais
+ * Copyright (C) 2012 Yannick Brosseau
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License Version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, 
+ * MA 02111-1307, USA.
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <lttv/traceset-process.h>
+#include <lttv/traceset.h>
+#include <lttv/event.h>
+#include <babeltrace/context.h>
+#include <babeltrace/iterator.h>
+
+#include <babeltrace/ctf/events.h>
+#include <babeltrace/ctf/iterator.h>
+
+void lttv_process_traceset_begin(LttvTraceset *traceset,
+               LttvHooks *before_traceset,
+               LttvHooks *before_trace,
+               LttvHooks *event)
+{
+
+       /* simply add hooks in context. _before hooks are called by add_hooks. */
+       /* It calls all before_traceset, before_trace, and before_tracefile hooks. */
+       lttv_traceset_add_hooks(traceset,
+                               before_traceset,
+                               before_trace,
+                               event);
+       
+
+}
+
+guint lttv_process_traceset_middle(LttvTraceset *traceset,
+               LttTime end,
+               gulong nb_events,
+               const LttvTracesetPosition *end_position)
+{
+       
+       unsigned count = 0;
+               
+       struct bt_ctf_event *bt_event;
+       
+       LttvEvent event;
+        struct bt_iter_pos begin_pos;
+
+       begin_pos.type = BT_SEEK_BEGIN;
+
+       if(!traceset->iter) {
+        traceset->iter = bt_ctf_iter_create(lttv_traceset_get_context(traceset),
+                                        &begin_pos,
+                                        NULL);
+       }
+       while(TRUE) {
+
+               if((count >= nb_events) && (nb_events != G_MAXULONG)) {
+                       break;
+               }
+
+               if((bt_event = bt_ctf_iter_read_event(traceset->iter)) != NULL) {
+                       
+                       count++;
+
+                       event.bt_event = bt_event;
+                       /* TODO ybrosseau 2012-04-01: use bt_ctf_get_trace_handle 
+                          to retrieve the right state container */
+                       event.state = traceset->tmpState;
+                       
+                       lttv_hooks_call(traceset->event_hooks, &event);
+
+                       if(bt_iter_next(bt_ctf_get_iter(traceset->iter)) < 0) {
+                               printf("ERROR NEXT\n");
+                               break;
+                       }
+               } else {
+                       /* READ FAILED */
+                       
+                       break;
+               
+               }
+       }
+       
+
+
+       return count;
+}
+
+void lttv_process_traceset_end(LttvTraceset *traceset,
+                              LttvHooks *after_traceset,
+                              LttvHooks *after_trace,  
+                              LttvHooks *event)
+{
+       /* Remove hooks from context. _after hooks are called by remove_hooks. */
+       /* It calls all after_traceset, after_trace, and after_tracefile hooks. */
+       lttv_traceset_remove_hooks(traceset,
+                                  after_traceset,
+                                  after_trace,
+                                  event);
+
+}
+
+
+void lttv_traceset_add_hooks(LttvTraceset *traceset,
+                            LttvHooks *before_traceset,
+                            LttvHooks *before_trace,
+                            LttvHooks *event)
+{
+       
+       guint i, nb_trace;
+
+       LttvTrace *trace;
+
+       lttv_hooks_call(before_traceset, traceset);
+       
+       lttv_hooks_add_list(traceset->event_hooks, event);
+
+       nb_trace = lttv_traceset_number(traceset);
+
+       for(i = 0 ; i < nb_trace ; i++) {
+               trace = (LttvTrace *)g_ptr_array_index(traceset->traces,i);
+               lttv_trace_add_hooks(trace,
+                                            before_trace,
+                                            event
+                                            );
+       }
+}
+void lttv_traceset_remove_hooks(LttvTraceset *traceset,
+                               LttvHooks *after_traceset,
+                               LttvHooks *after_trace,
+                               LttvHooks *event)
+{
+
+       guint i, nb_trace;
+
+       LttvTrace *trace;
+
+       nb_trace = lttv_traceset_number(traceset);
+
+       for(i = 0 ; i < nb_trace ; i++) {
+               trace = (LttvTrace *)g_ptr_array_index(traceset->traces,i);
+               lttv_trace_remove_hooks(trace,
+                                               after_trace,
+                                               event);
+
+       }
+
+       lttv_hooks_call(after_traceset, traceset);
+
+
+}
+
+
+void lttv_trace_add_hooks(LttvTrace *trace,
+                         LttvHooks *before_trace,
+                         LttvHooks *event)
+{
+       lttv_hooks_call(before_trace, trace);
+}
+
+void lttv_trace_remove_hooks(LttvTrace *trace,
+                            LttvHooks *after_trace,
+                            LttvHooks *event)
+
+{
+       lttv_hooks_call(after_trace, trace);
+
+}
+
+void lttv_process_traceset_seek_time(LttvTraceset *traceset, LttTime start)
+{
+#ifdef WAIT_FOR_BABELTRACE_FIX_SEEK_ZERO
+        struct bt_iter_pos seekpos;
+        int ret;
+        seekpos.type = BT_SEEK_TIME;
+        seekpos.u.seek_time = ltt_time_to_uint64(start);
+        ret = bt_iter_set_pos(bt_ctf_get_iter(self->iter), &seekpos);
+        if(ret < 0) {
+                printf("Seek by time error: %s,\n",strerror(-ret));
+        }
+#else
+#warning Seek time disabled because of babeltrace bugs
+#endif
+}
This page took 0.023701 seconds and 4 git commands to generate.