From: Antoine Busque Date: Mon, 2 May 2016 18:59:07 +0000 (-0400) Subject: Add intersect mode to python bindings X-Git-Tag: v1.4.0-rc1~79 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=64f1ebe55dce682bca1349b038e07f546693fec9 Add intersect mode to python bindings Signed-off-by: Antoine Busque Signed-off-by: Jérémie Galarneau --- diff --git a/bindings/python/babeltrace.i.in b/bindings/python/babeltrace.i.in index 3dc17910..914ea87f 100644 --- a/bindings/python/babeltrace.i.in +++ b/bindings/python/babeltrace.i.in @@ -100,6 +100,11 @@ const char *_bt_python_get_sequence_string(struct bt_definition *field); int _bt_python_field_integer_get_signedness(const struct bt_ctf_field *field); enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field); 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 @@ -134,8 +139,9 @@ class TraceCollection: The TraceCollection is the object that contains all currently opened traces. """ - def __init__(self): + def __init__(self, intersect_mode=False): self._tc = _bt_context_create() + self.intersect_mode = intersect_mode def __del__(self): _bt_context_put(self._tc) @@ -226,8 +232,9 @@ class TraceCollection: """ begin_pos_ptr = _bt_python_create_iter_pos() end_pos_ptr = _bt_python_create_iter_pos() - begin_pos_ptr.type = SEEK_BEGIN - end_pos_ptr.type = SEEK_LAST + if not self.intersection_mode: + begin_pos_ptr.type = SEEK_BEGIN + end_pos_ptr.type = SEEK_LAST for event in self._events(begin_pos_ptr, end_pos_ptr): yield event @@ -277,7 +284,20 @@ class TraceCollection: return ev.timestamp def _events(self, begin_pos_ptr, end_pos_ptr): - ctf_it_ptr = _bt_ctf_iter_create(self._tc, begin_pos_ptr, end_pos_ptr) + if self.intersect_mode: + has_intersection = _bt_python_has_intersection(self._tc) + if not has_intersection: + # There are no events to provide. + return + + ctf_it_ptr = _bt_python_ctf_iter_create_intersect( + self._tc, begin_pos_ptr, end_pos_ptr + ) + else: + ctf_it_ptr = _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.") @@ -803,7 +823,7 @@ class Event(collections.Mapping): def _field_list_with_scope(self, scope): fields = [] scope_ptr = _bt_ctf_get_top_level_scope(self._e, scope) - + # Returns a list [list_ptr, count]. If list_ptr is NULL, SWIG will only # provide the "count" return value count = 0 diff --git a/bindings/python/python-complements.c b/bindings/python/python-complements.c index 52465aa2..6b47ff9b 100644 --- a/bindings/python/python-complements.c +++ b/bindings/python/python-complements.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include /* FILE functions @@ -249,3 +251,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 bd225980..0e787d62 100644 --- a/bindings/python/python-complements.h +++ b/bindings/python/python-complements.h @@ -74,3 +74,8 @@ enum ctf_type_id _bt_python_get_field_type(const struct bt_ctf_field *field); /* 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);