[lttng-dev] [PATCH babeltrace] Fix: Close traces on context destruction
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Fri Oct 11 16:36:53 EDT 2013
Merged, thanks!
Mathieu
----- Original Message -----
> From: "Jérémie Galarneau" <jeremie.galarneau at efficios.com>
> To: lttng-dev at lists.lttng.org
> Sent: Thursday, October 10, 2013 12:08:30 PM
> Subject: [lttng-dev] [PATCH babeltrace] Fix: Close traces on context destruction
>
> bt_trace_handle_destroy is called on destruction of the trace_handle
> hash table's elements. This function only frees the trace handle,
> leaving the input traces open.
>
> This fix sets remove_trace_handle as the value_destroy_func ensuring
> that the format's close_trace function is called before the trace_handle
> is destroyed.
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
> lib/context.c | 58
> ++++++++++++++++++++++++++++++++++++----------------------
> 1 file changed, 36 insertions(+), 22 deletions(-)
>
> diff --git a/lib/context.c b/lib/context.c
> index dc77366..5dc4119 100644
> --- a/lib/context.c
> +++ b/lib/context.c
> @@ -34,6 +34,7 @@
> #include <babeltrace/trace-handle-internal.h>
> #include <babeltrace/trace-collection.h>
> #include <babeltrace/format.h>
> +#include <babeltrace/format-internal.h>
> #include <babeltrace/babeltrace-internal.h>
> #include <stdlib.h>
> #include <string.h>
> @@ -44,6 +45,8 @@
>
> #include <glib.h>
>
> +static void remove_trace_handle(struct bt_trace_handle *handle);
> +
> struct bt_context *bt_context_create(void)
> {
> struct bt_context *ctx;
> @@ -56,7 +59,7 @@ struct bt_context *bt_context_create(void)
> /* Instanciate the trace handle container */
> ctx->trace_handles = g_hash_table_new_full(g_direct_hash,
> g_direct_equal, NULL,
> - (GDestroyNotify) bt_trace_handle_destroy);
> + (GDestroyNotify) remove_trace_handle);
>
> ctx->current_iterator = NULL;
> ctx->tc = g_new0(struct trace_collection, 1);
> @@ -155,43 +158,39 @@ end:
>
> int bt_context_remove_trace(struct bt_context *ctx, int handle_id)
> {
> - struct bt_trace_handle *handle;
> int ret;
>
> - if (!ctx)
> - return -EINVAL;
> -
> - handle = g_hash_table_lookup(ctx->trace_handles,
> - (gpointer) (unsigned long) handle_id);
> - if (!handle)
> - return -ENOENT;
> + if (!ctx) {
> + ret = -EINVAL;
> + goto end;
> + }
>
> - /* Remove from containers */
> - bt_trace_collection_remove(ctx->tc, handle->td);
> - /* Close the trace */
> - ret = handle->format->close_trace(handle->td);
> - if (ret) {
> - fprintf(stderr, "Error in close_trace callback\n");
> - return ret;
> + /*
> + * Remove the handle. remove_trace_handle will be called
> + * automatically.
> + */
> + if (!g_hash_table_remove(ctx->trace_handles,
> + (gpointer) (unsigned long) handle_id)) {
> + ret = -ENOENT;
> + goto end;
> }
> - /* Remove and free the handle */
> - g_hash_table_remove(ctx->trace_handles,
> - (gpointer) (unsigned long) handle_id);
> - return 0;
> +end:
> + return ret;
> }
>
> static
> void bt_context_destroy(struct bt_context *ctx)
> {
> assert(ctx);
> - bt_finalize_trace_collection(ctx->tc);
>
> /*
> * Remove all traces. The g_hash_table_destroy will call
> - * bt_trace_handle_destroy on each elements.
> + * remove_trace_handle on each element.
> */
> g_hash_table_destroy(ctx->trace_handles);
>
> + bt_finalize_trace_collection(ctx->tc);
> +
> /* ctx->tc should always be valid */
> assert(ctx->tc != NULL);
> g_free(ctx->tc);
> @@ -211,3 +210,18 @@ void bt_context_put(struct bt_context *ctx)
> if (ctx->refcount == 0)
> bt_context_destroy(ctx);
> }
> +
> +void remove_trace_handle(struct bt_trace_handle *handle)
> +{
> + int ret;
> +
> + /* Remove from containers */
> + bt_trace_collection_remove(handle->td->ctx->tc, handle->td);
> + /* Close the trace */
> + ret = handle->format->close_trace(handle->td);
> + if (ret) {
> + fprintf(stderr, "Error in close_trace callback\n");
> + }
> +
> + bt_trace_handle_destroy(handle);
> +}
> --
> 1.8.4
>
>
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list