/* Visit stack */
struct stack {
- /* Entries (struct stack_entry *) (top is last element) */
- GPtrArray *entries;
+ /* Entries (struct stack_entry) */
+ GArray *entries;
+
+ /* Number of active entries */
+ size_t size;
};
/* State */
/* Visit stack */
struct stack *stack;
+ /* Current graph to create notifications (weak) */
+ struct bt_graph *graph;
+
/*
* Current dynamic scope field pointer.
*
enum bt_btr_status btr_timestamp_end_cb(void *value,
struct bt_field_type *type, void *data);
-static
-void stack_entry_free_func(gpointer data)
-{
- g_free(data);
-}
-
static
struct stack *stack_new(struct bt_notif_iter *notit)
{
goto error;
}
- stack->entries = g_ptr_array_new_with_free_func(stack_entry_free_func);
+ stack->entries = g_array_new(FALSE, TRUE, sizeof(struct stack_entry));
if (!stack->entries) {
- BT_LOGE_STR("Failed to allocate a GPtrArray.");
+ BT_LOGE_STR("Failed to allocate a GArray.");
goto error;
}
{
BT_ASSERT(stack);
BT_LOGD("Destroying stack: addr=%p", stack);
- g_ptr_array_free(stack->entries, TRUE);
+
+ if (stack->entries) {
+ g_array_free(stack->entries, TRUE);
+ }
+
g_free(stack);
}
static
int stack_push(struct stack *stack, struct bt_field *base)
{
- int ret = 0;
struct stack_entry *entry;
BT_ASSERT(stack);
BT_ASSERT(base);
BT_LOGV("Pushing base field on stack: stack-addr=%p, "
- "stack-size-before=%u, stack-size-after=%u",
- stack, stack->entries->len, stack->entries->len + 1);
- entry = g_new0(struct stack_entry, 1);
- if (!entry) {
- BT_LOGE_STR("Failed to allocate one stack entry.");
- ret = -1;
- goto end;
+ "stack-size-before=%zu, stack-size-after=%zu",
+ stack, stack->size, stack->size + 1);
+
+ if (stack->entries->len == stack->size) {
+ g_array_set_size(stack->entries, stack->size + 1);
}
+ entry = &g_array_index(stack->entries, struct stack_entry, stack->size);
entry->base = base;
- g_ptr_array_add(stack->entries, entry);
-
-end:
- return ret;
+ entry->index = 0;
+ stack->size++;
+ return 0;
}
static inline
unsigned int stack_size(struct stack *stack)
{
BT_ASSERT(stack);
-
- return stack->entries->len;
+ return stack->size;
}
static
BT_ASSERT(stack);
BT_ASSERT(stack_size(stack));
BT_LOGV("Popping from stack: "
- "stack-addr=%p, stack-size-before=%u, stack-size-after=%u",
- stack, stack->entries->len, stack->entries->len - 1);
- g_ptr_array_remove_index(stack->entries, stack->entries->len - 1);
+ "stack-addr=%p, stack-size-before=%zu, stack-size-after=%zu",
+ stack, stack->size, stack->size - 1);
+ stack->size--;
}
static inline
{
BT_ASSERT(stack);
BT_ASSERT(stack_size(stack));
-
- return g_ptr_array_index(stack->entries, stack->entries->len - 1);
+ return &g_array_index(stack->entries, struct stack_entry,
+ stack->size - 1);
}
static inline
void stack_clear(struct stack *stack)
{
BT_ASSERT(stack);
-
- if (!stack_empty(stack)) {
- BT_LOGV("Clearing stack: stack-addr=%p, stack-size=%u",
- stack, stack->entries->len);
- g_ptr_array_remove_range(stack->entries, 0, stack_size(stack));
- }
-
- BT_ASSERT(stack_empty(stack));
+ stack->size = 0;
}
static inline
notit, notit->meta.event_class,
bt_event_class_get_name(notit->meta.event_class),
notit->packet);
- notif = bt_notification_event_create(notit->meta.event_class,
- notit->packet, notit->meta.cc_prio_map);
+ BT_ASSERT(notit->graph);
+ notif = bt_notification_event_create(notit->graph,
+ notit->meta.event_class, notit->packet,
+ notit->meta.cc_prio_map);
if (!notif) {
BT_LOGE("Cannot create event notification: "
"notit-addr=%p, ec-addr=%p, ec-name=\"%s\", "
}
BT_ASSERT(notit->stream);
- ret = bt_notification_stream_begin_create(notit->stream);
+ BT_ASSERT(notit->graph);
+ ret = bt_notification_stream_begin_create(notit->graph, notit->stream);
if (!ret) {
BT_LOGE("Cannot create stream beginning notification: "
"notit-addr=%p, stream-addr=%p",
return;
}
- ret = bt_notification_stream_end_create(notit->stream);
+ BT_ASSERT(notit->graph);
+ ret = bt_notification_stream_end_create(notit->graph, notit->stream);
if (!ret) {
BT_LOGE("Cannot create stream beginning notification: "
"notit-addr=%p, stream-addr=%p",
notit->dscopes.stream_packet_context);
}
- notif = bt_notification_packet_begin_create(notit->packet);
+ BT_ASSERT(notit->graph);
+ notif = bt_notification_packet_begin_create(notit->graph,
+ notit->packet);
if (!notif) {
BT_LOGE("Cannot create packet beginning notification: "
"notit-addr=%p, packet-addr=%p",
return;
}
- notif = bt_notification_packet_end_create(notit->packet);
+ BT_ASSERT(notit->graph);
+ notif = bt_notification_packet_end_create(notit->graph, notit->packet);
if (!notif) {
BT_LOGE("Cannot create packet end notification: "
"notit-addr=%p, packet-addr=%p",
enum bt_notif_iter_status bt_notif_iter_get_next_notification(
struct bt_notif_iter *notit,
struct bt_clock_class_priority_map *cc_prio_map,
+ struct bt_graph *graph,
struct bt_notification **notification)
{
int ret;
BT_ASSERT(notit);
BT_ASSERT(notification);
+ if (notit->state == STATE_DONE) {
+ status = BT_NOTIF_ITER_STATUS_EOF;
+ goto end;
+ }
+
if (cc_prio_map != notit->meta.cc_prio_map) {
bt_put(notit->meta.cc_prio_map);
notit->meta.cc_prio_map = bt_get(cc_prio_map);
}
- if (notit->state == STATE_DONE) {
- status = BT_NOTIF_ITER_STATUS_EOF;
- goto end;
- }
+ notit->graph = graph;
BT_LOGV("Getting next notification: notit-addr=%p, cc-prio-map-addr=%p",
notit, cc_prio_map);
goto end;
}
- BT_MOVE(*notification, notit->event_notif);
+ *notification = notit->event_notif;
+ notit->event_notif = NULL;
goto end;
case STATE_EMIT_NOTIF_END_OF_PACKET:
/* Update clock with timestamp_end field. */