Fix : only one iterator per context
authorJulien Desfossez <julien.desfossez@efficios.com>
Tue, 13 Mar 2012 19:50:34 +0000 (15:50 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 13 Mar 2012 19:54:42 +0000 (15:54 -0400)
As of now, the API let the user create multiple iterators on the same
context but the underlying code was not ready. This patch restrict to
only one iterator per context. Supporting multiple iterators is
targetted for the next release.

Fixes #166

[ Edit by Mathieu Desnoyers: update API comment ]

Signed-off-by: Julien Desfossez <julien.desfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/babeltrace/context-internal.h
include/babeltrace/ctf/iterator.h
lib/context.c
lib/iterator.c

index 80ca42c8d0aaa791994481c2bc9f3767bdf9f355..95d629b86a18e73b5eb97a796e4c226b20d19fda 100644 (file)
@@ -42,6 +42,7 @@ struct bt_context {
        GHashTable *trace_handles;
        int refcount;
        int last_trace_handle_id;
+       struct bt_iter *current_iterator;
 };
 
 #endif /* _BABELTRACE_CONTEXT_INTERNAL_H */
index 71f935a0fe581c557ea8e3585b19c9fcde763de9..1071def852749d3a4abee44a346e2280dd2d7452 100644 (file)
@@ -39,6 +39,13 @@ struct bt_ctf_event;
  * By default, if begin_pos is NULL, a BT_SEEK_CUR is performed at
  * creation. By default, if end_pos is NULL, a BT_SEEK_END (end of
  * trace) is the EOF criterion.
+ *
+ * Return a pointer to the newly allocated iterator.
+ *
+ * Only one iterator can be created against a context. If more than one
+ * iterator is being created for the same context, the second creation
+ * will return NULL. The previous iterator must be destroyed before
+ * creation of the new iterator for this function to succeed.
  */
 struct bt_ctf_iter *bt_ctf_iter_create(struct bt_context *ctx,
                const struct bt_iter_pos *begin_pos,
index 0c20ed53de6b247ff996a85e0c49ca9b91fd0793..e9a35c1d5844f7be8c0983eb86b240901b58efd8 100644 (file)
@@ -50,6 +50,7 @@ struct bt_context *bt_context_create(void)
                                g_direct_equal, NULL,
                                (GDestroyNotify) bt_trace_handle_destroy);
 
+       ctx->current_iterator = NULL;
        ctx->tc = g_new0(struct trace_collection, 1);
        init_trace_collection(ctx->tc);
 
index e50846f4cb6179a7cd2eb1ac1903f042d4da5f1e..ca6e5917e449b328f6ba0869397297b60d7e4e57 100644 (file)
@@ -436,6 +436,11 @@ int bt_iter_init(struct bt_iter *iter,
        int i, stream_id;
        int ret = 0;
 
+       if (ctx->current_iterator) {
+               ret = -1;
+               goto error_ctx;
+       }
+
        iter->stream_heap = g_new(struct ptr_heap, 1);
        iter->end_pos = end_pos;
        bt_context_get(ctx);
@@ -486,12 +491,14 @@ int bt_iter_init(struct bt_iter *iter,
                }
        }
 
+       ctx->current_iterator = iter;
        return 0;
 
 error:
        heap_free(iter->stream_heap);
 error_heap_init:
        g_free(iter->stream_heap);
+error_ctx:
        return ret;
 }
 
@@ -517,6 +524,7 @@ void bt_iter_fini(struct bt_iter *iter)
                heap_free(iter->stream_heap);
                g_free(iter->stream_heap);
        }
+       iter->ctx->current_iterator = NULL;
        bt_context_put(iter->ctx);
 }
 
This page took 0.036767 seconds and 4 git commands to generate.