[lttng-dev] [PATCH babeltrace 1/2] python: Add stream event context support
Jérémie Galarneau
jeremie.galarneau at efficios.com
Mon Jul 25 22:50:00 UTC 2016
Both patches were merged in master.
Thanks!
Jérémie
On Sat, Jun 18, 2016 at 10:54 PM, Simon Marchi <simon.marchi at polymtl.ca> wrote:
> This patch adds the possibility to get/set the event context type of a
> stream class and set the stream context value of an event from Python.
>
> From my experience, the value setter (Event.stream_context.setter) is
> not so useful, since it looks like the context is already instanciated
> when you create the event. So in order to set the values in it, you
> only need to get the existing instance and set its fields. There is no
> need to to re-assign the stream context instance to the event. I still
> put it there for completeness.
>
> I added an example of the usage to the existing CTF writer Python
> example.
>
> Signed-off-by: Simon Marchi <simon.marchi at polymtl.ca>
> ---
> bindings/python/babeltrace/examples/ctf_writer.py | 7 +++
> bindings/python/babeltrace/nativebt.i | 8 +++
> bindings/python/babeltrace/writer.py | 61 +++++++++++++++++++++++
> 3 files changed, 76 insertions(+)
>
> diff --git a/bindings/python/babeltrace/examples/ctf_writer.py b/bindings/python/babeltrace/examples/ctf_writer.py
> index d60eb3d..03e01ea 100644
> --- a/bindings/python/babeltrace/examples/ctf_writer.py
> +++ b/bindings/python/babeltrace/examples/ctf_writer.py
> @@ -71,6 +71,11 @@ for field in packet_context_type.fields:
> packet_context_type.add_field(uint16_type, "a_custom_packet_context_field")
> stream_class.packet_context_type = packet_context_type
>
> +# Set a stream event context
> +stream_event_context_type = btw.StructureFieldDeclaration()
> +stream_event_context_type.add_field(int32_type, "field_in_stream_event_context")
> +stream_class.event_context_type = stream_event_context_type
> +
> # Create a string type
> string_type = btw.StringFieldDeclaration()
>
> @@ -135,6 +140,8 @@ for i in range(100):
> integer_field = enumeration_field.container
> enumeration_field.value = i % 10
>
> + event.stream_context.field("field_in_stream_event_context").value = i * 10
> +
> stream.append_event(event)
>
> # Populate custom packet context field before flushing
> diff --git a/bindings/python/babeltrace/nativebt.i b/bindings/python/babeltrace/nativebt.i
> index 15726ba..ad20c13 100644
> --- a/bindings/python/babeltrace/nativebt.i
> +++ b/bindings/python/babeltrace/nativebt.i
> @@ -560,6 +560,8 @@ void bt_ctf_event_class_put(struct bt_ctf_event_class *event_class);
> %rename("_bt_ctf_event_get_payload_by_index") bt_ctf_event_get_payload_by_index(struct bt_ctf_event *event, int index);
> %rename("_bt_ctf_event_get") bt_ctf_event_get(struct bt_ctf_event *event);
> %rename("_bt_ctf_event_put") bt_ctf_event_put(struct bt_ctf_event *event);
> +%rename("_bt_ctf_event_get_stream_event_context") bt_ctf_event_get_stream_event_context(struct bt_ctf_event *event);
> +%rename("_bt_ctf_event_set_stream_event_context") bt_ctf_event_set_stream_event_context(struct bt_ctf_event *event, struct bt_ctf_field *stream_event_context);
>
> struct bt_ctf_event *bt_ctf_event_create(struct bt_ctf_event_class *event_class);
> struct bt_ctf_event_class *bt_ctf_event_get_class(struct bt_ctf_event *event);
> @@ -569,6 +571,8 @@ int bt_ctf_event_set_payload(struct bt_ctf_event *event, const char *name, struc
> struct bt_ctf_field *bt_ctf_event_get_payload_by_index(struct bt_ctf_event *event, int index);
> void bt_ctf_event_get(struct bt_ctf_event *event);
> void bt_ctf_event_put(struct bt_ctf_event *event);
> +struct bt_ctf_field *bt_ctf_event_get_stream_event_context(struct bt_ctf_event *event);
> +int bt_ctf_event_set_stream_event_context(struct bt_ctf_event *event, struct bt_ctf_field *stream_event_context);
>
>
> /* stream-class.h */
> @@ -584,6 +588,8 @@ void bt_ctf_event_put(struct bt_ctf_event *event);
> %rename("_bt_ctf_stream_class_get_event_class_by_name") bt_ctf_stream_class_get_event_class_by_name(struct bt_ctf_stream_class *stream_class, const char *name);
> %rename("_bt_ctf_stream_class_get_packet_context_type") bt_ctf_stream_class_get_packet_context_type(struct bt_ctf_stream_class *stream_class);
> %rename("_bt_ctf_stream_class_set_packet_context_type") bt_ctf_stream_class_set_packet_context_type(struct bt_ctf_stream_class *stream_class, struct bt_ctf_field_type *packet_context_type);
> +%rename("_bt_ctf_stream_class_get_event_context_type") bt_ctf_stream_class_get_event_context_type(struct bt_ctf_stream_class *stream_class);
> +%rename("_bt_ctf_stream_class_set_event_context_type") bt_ctf_stream_class_set_event_context_type(struct bt_ctf_stream_class *stream_class, struct bt_ctf_field_type *event_context_type);
> %rename("_bt_ctf_stream_class_get") bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
> %rename("_bt_ctf_stream_class_put") bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
>
> @@ -599,6 +605,8 @@ struct bt_ctf_event_class *bt_ctf_stream_class_get_event_class(struct bt_ctf_str
> struct bt_ctf_event_class *bt_ctf_stream_class_get_event_class_by_name(struct bt_ctf_stream_class *stream_class, const char *name);
> struct bt_ctf_field_type *bt_ctf_stream_class_get_packet_context_type(struct bt_ctf_stream_class *stream_class);
> int bt_ctf_stream_class_set_packet_context_type(struct bt_ctf_stream_class *stream_class, struct bt_ctf_field_type *packet_context_type);
> +struct bt_ctf_field_type *bt_ctf_stream_class_get_event_context_type(struct bt_ctf_stream_class *stream_class);
> +int bt_ctf_stream_class_set_event_context_type(struct bt_ctf_stream_class *stream_class, struct bt_ctf_field_type *event_context_type);
> void bt_ctf_stream_class_get(struct bt_ctf_stream_class *stream_class);
> void bt_ctf_stream_class_put(struct bt_ctf_stream_class *stream_class);
>
> diff --git a/bindings/python/babeltrace/writer.py b/bindings/python/babeltrace/writer.py
> index dc65b24..cd609af 100644
> --- a/bindings/python/babeltrace/writer.py
> +++ b/bindings/python/babeltrace/writer.py
> @@ -1747,6 +1747,34 @@ class Event:
> if ret < 0:
> raise ValueError("Could not set event field payload.")
>
> + @property
> + def stream_context(self):
> + """
> + Stream event context field (instance of
> + :class:`StructureField`).
> +
> + Set this attribute to assign a stream event context field
> + to this stream.
> +
> + :exc:`ValueError` is raised on error.
> + """
> +
> + native_field = nbt._bt_ctf_event_get_stream_event_context(self._e)
> +
> + if native_field is None:
> + raise ValueError("Invalid Stream.")
> +
> + return Field._create_field_from_native_instance(native_field)
> +
> + @stream_context.setter
> + def stream_context(self, field):
> + if not isinstance(field, StructureField):
> + raise TypeError("Argument field must be of type StructureField")
> +
> + ret = nbt._bt_ctf_event_set_stream_event_context(self._e, field._f)
> +
> + if ret < 0:
> + raise ValueError("Invalid stream context field.")
>
> class StreamClass:
> """
> @@ -1923,6 +1951,39 @@ class StreamClass:
> if ret < 0:
> raise ValueError("Failed to set packet context type.")
>
> + @property
> + def event_context_type(self):
> + """
> + Stream event context declaration.
> +
> + Set this attribute to change the stream event context
> + declaration (must be an instance of
> + :class:`StructureFieldDeclaration`).
> +
> + :exc:`ValueError` is raised on error.
> +
> + """
> +
> + field_type_native = nbt._bt_ctf_stream_class_get_event_context_type(self._sc)
> +
> + if field_type_native is None:
> + raise ValueError("Invalid StreamClass")
> +
> + field_type = FieldDeclaration._create_field_declaration_from_native_instance(field_type_native)
> +
> + return field_type
> +
> + @event_context_type.setter
> + def event_context_type(self, field_type):
> + if not isinstance(field_type, StructureFieldDeclaration):
> + raise TypeError("field_type argument must be of type StructureFieldDeclaration.")
> +
> + ret = nbt._bt_ctf_stream_class_set_event_context_type(self._sc,
> + field_type._ft)
> +
> + if ret < 0:
> + raise ValueError("Failed to set event context type.")
> +
>
> class Stream:
> """
> --
> 2.8.3
>
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
--
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list