From 9b93351a50fa730a8e0676521b0d036f981960da Mon Sep 17 00:00:00 2001 From: Antoine Busque Date: Wed, 6 Apr 2016 17:21:16 -0400 Subject: [PATCH] Add intersect mode to python bindings MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Antoine Busque Signed-off-by: Jérémie Galarneau --- bindings/python/nativebt.i | 5 +++++ bindings/python/python-complements.c | 21 +++++++++++++++++++++ bindings/python/python-complements.h | 5 +++++ bindings/python/reader.py | 23 +++++++++++++++++++---- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/bindings/python/nativebt.i b/bindings/python/nativebt.i index 368952b3..bb67cd58 100644 --- a/bindings/python/nativebt.i +++ b/bindings/python/nativebt.i @@ -113,6 +113,11 @@ int _bt_python_ctf_clock_get_uuid_index(struct bt_ctf_clock *clock, int _bt_python_ctf_clock_set_uuid_index(struct bt_ctf_clock *clock, size_t index, unsigned char value); struct bt_iter_pos *_bt_python_create_iter_pos(void); +struct bt_ctf_iter *_bt_python_ctf_iter_create_intersect( + struct bt_context *ctx, + struct bt_iter_pos *inter_begin_pos, + struct bt_iter_pos *inter_end_pos); +int _bt_python_has_intersection(struct bt_context *ctx); /* context.h, context-internal.h */ %rename("_bt_context_create") bt_context_create(void); diff --git a/bindings/python/python-complements.c b/bindings/python/python-complements.c index 2622542b..756c5469 100644 --- a/bindings/python/python-complements.c +++ b/bindings/python/python-complements.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include /* List-related functions @@ -400,3 +402,22 @@ struct bt_iter_pos *_bt_python_create_iter_pos(void) { return g_new0(struct bt_iter_pos, 1); } + +struct bt_ctf_iter *_bt_python_ctf_iter_create_intersect( + struct bt_context *ctx, + struct bt_iter_pos *inter_begin_pos, + struct bt_iter_pos *inter_end_pos) +{ + return bt_ctf_iter_create_intersect(ctx, &inter_begin_pos, + &inter_end_pos); +} + +int _bt_python_has_intersection(struct bt_context *ctx) +{ + int ret; + uint64_t begin = 0, end = ULLONG_MAX; + + ret = ctf_find_packets_intersection(ctx, &begin, &end); + + return ret == 0 ? 1 : 0; +} diff --git a/bindings/python/python-complements.h b/bindings/python/python-complements.h index 0cfcc9c3..e7e1a411 100644 --- a/bindings/python/python-complements.h +++ b/bindings/python/python-complements.h @@ -100,3 +100,8 @@ int _bt_python_ctf_clock_set_uuid_index(struct bt_ctf_clock *clock, /* iterator */ struct bt_iter_pos *_bt_python_create_iter_pos(void); +struct bt_ctf_iter *_bt_python_ctf_iter_create_intersect( + struct bt_context *ctx, + struct bt_iter_pos *inter_begin_pos, + struct bt_iter_pos *inter_end_pos); +int _bt_python_has_intersection(struct bt_context *ctx); diff --git a/bindings/python/reader.py b/bindings/python/reader.py index ab0b2c3e..3b5374f5 100644 --- a/bindings/python/reader.py +++ b/bindings/python/reader.py @@ -45,12 +45,13 @@ class TraceCollection: trace from a trace collection. """ - def __init__(self): + def __init__(self, intersect_mode=False): """ Creates an empty trace collection. """ self._tc = nbt._bt_context_create() + self.intersect_mode = intersect_mode def __del__(self): nbt._bt_context_put(self._tc) @@ -147,8 +148,10 @@ class TraceCollection: begin_pos_ptr = nbt._bt_python_create_iter_pos() end_pos_ptr = nbt._bt_python_create_iter_pos() - begin_pos_ptr.type = nbt.SEEK_BEGIN - end_pos_ptr.type = nbt.SEEK_LAST + + if not self.intersect_mode: + begin_pos_ptr.type = nbt.SEEK_BEGIN + end_pos_ptr.type = nbt.SEEK_LAST for event in self._events(begin_pos_ptr, end_pos_ptr): yield event @@ -219,7 +222,19 @@ class TraceCollection: return ev.timestamp def _events(self, begin_pos_ptr, end_pos_ptr): - ctf_it_ptr = nbt._bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr) + if self.intersect_mode: + has_intersection = nbt._bt_python_has_intersection(self._tc) + if not has_intersection: + # There are no events to provide. + return + + ctf_it_ptr = nbt._bt_python_ctf_iter_create_intersect( + self._tc, begin_pos_ptr, end_pos_ptr + ) + else: + ctf_it_ptr = nbt._bt_ctf_iter_create( + self._tc, begin_pos_ptr, end_pos_ptr + ) if ctf_it_ptr is None: raise NotImplementedError("Creation of multiple iterators is unsupported.") -- 2.34.1