From d7503815516dc78258eb0a6d7ffd2aa9e83caadd Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Sat, 18 Jun 2016 22:54:52 -0400 Subject: [PATCH] CTF writer: Add function to add an integer environment field value MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit From the Python API, it's only possible to set an environment field value as a string (whatever you pass, it gets stringified). This patch adds a function to the CTF writer to allow setting an integer (int64_t) environment field, and then exposes it in the Python interface. The Python method Writer.add_environment_field now uses the type of the passed value to determine which underlying C function to call (string or integer). Any other type is rejected. This causes a behavior change, since passing an integer value to add_environment_field used to produce a string version of the value, whereas it will now produce an integer version. However, I think it will now behave more closely to the expectation of a lambda user. Example: w.add_environment_field("foo", 2) Result before: env { foo = "2"; }; Result after: env { foo = 2; }; Signed-off-by: Simon Marchi Signed-off-by: Jérémie Galarneau --- bindings/python/babeltrace/nativebt.i | 2 ++ bindings/python/babeltrace/writer.py | 18 +++++++++++++++--- formats/ctf/writer/writer.c | 16 ++++++++++++++++ include/babeltrace/ctf-writer/writer.h | 17 +++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/bindings/python/babeltrace/nativebt.i b/bindings/python/babeltrace/nativebt.i index ad20c13b..345173ff 100644 --- a/bindings/python/babeltrace/nativebt.i +++ b/bindings/python/babeltrace/nativebt.i @@ -635,6 +635,7 @@ void bt_ctf_stream_put(struct bt_ctf_stream *stream); %rename("_bt_ctf_writer_create") bt_ctf_writer_create(const char *path); %rename("_bt_ctf_writer_create_stream") bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class); %rename("_bt_ctf_writer_add_environment_field") bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value); +%rename("_bt_ctf_writer_add_environment_field_int64") bt_ctf_writer_add_environment_field_int64(struct bt_ctf_writer *writer, const char *name, int64_t value); %rename("_bt_ctf_writer_add_clock") bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock); %newobject bt_ctf_writer_get_metadata_string; %rename("_bt_ctf_writer_get_metadata_string") bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer); @@ -646,6 +647,7 @@ void bt_ctf_stream_put(struct bt_ctf_stream *stream); struct bt_ctf_writer *bt_ctf_writer_create(const char *path); struct bt_ctf_stream *bt_ctf_writer_create_stream(struct bt_ctf_writer *writer, struct bt_ctf_stream_class *stream_class); int bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value); +int bt_ctf_writer_add_environment_field_int64(struct bt_ctf_writer *writer, const char *name, int64_t value); int bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock); char *bt_ctf_writer_get_metadata_string(struct bt_ctf_writer *writer); void bt_ctf_writer_flush_metadata(struct bt_ctf_writer *writer); diff --git a/bindings/python/babeltrace/writer.py b/bindings/python/babeltrace/writer.py index cd609afd..8ed18c6c 100644 --- a/bindings/python/babeltrace/writer.py +++ b/bindings/python/babeltrace/writer.py @@ -2141,11 +2141,23 @@ class Writer: Sets the CTF environment variable named *name* to value *value* (converted to a string). - :exc:`ValueError` is raised on error. + :exc:`ValueError` or `TypeError` is raised on error. """ - ret = nbt._bt_ctf_writer_add_environment_field(self._w, str(name), - str(value)) + if type(name) != str: + raise TypeError("Field name must be a string.") + + t = type(value) + + if t == str: + ret = nbt._bt_ctf_writer_add_environment_field(self._w, name, + value) + elif t == int: + ret = nbt._bt_ctf_writer_add_environment_field_int64(self._w, + name, + value) + else: + raise TypeError("Value type is not supported.") if ret < 0: raise ValueError("Could not add environment field to trace.") diff --git a/formats/ctf/writer/writer.c b/formats/ctf/writer/writer.c index 6c294931..012b3ef0 100644 --- a/formats/ctf/writer/writer.c +++ b/formats/ctf/writer/writer.c @@ -209,6 +209,22 @@ end: return ret; } +int bt_ctf_writer_add_environment_field_int64(struct bt_ctf_writer *writer, + const char *name, + int64_t value) +{ + int ret = -1; + + if (!writer || !name) { + goto end; + } + + ret = bt_ctf_trace_set_environment_field_integer(writer->trace, name, + value); +end: + return ret; +} + int bt_ctf_writer_add_clock(struct bt_ctf_writer *writer, struct bt_ctf_clock *clock) { diff --git a/include/babeltrace/ctf-writer/writer.h b/include/babeltrace/ctf-writer/writer.h index 940736fe..140bc5fd 100644 --- a/include/babeltrace/ctf-writer/writer.h +++ b/include/babeltrace/ctf-writer/writer.h @@ -95,6 +95,23 @@ extern int bt_ctf_writer_add_environment_field(struct bt_ctf_writer *writer, const char *name, const char *value); +/* + * bt_ctf_writer_add_environment_field_int64: add an environment field to the trace. + * + * Add an environment field to the trace. The name and value parameters are + * copied. + * + * @param writer Writer instance. + * @param name Name of the environment field (will be copied). + * @param value Value of the environment field. + * + * Returns 0 on success, a negative value on error. + */ +extern int bt_ctf_writer_add_environment_field_int64( + struct bt_ctf_writer *writer, + const char *name, + int64_t value); + /* * bt_ctf_writer_add_clock: add a clock to the trace. * -- 2.34.1