#include <babeltrace/values.h>
#include <babeltrace/ctf-ir/stream-class.h>
#include <babeltrace/ctf-ir/stream.h>
+#include <babeltrace/ctf-ir/stream-internal.h>
#include <babeltrace/ctf-ir/packet.h>
#include <babeltrace/ctf-ir/packet-internal.h>
#include <babeltrace/ctf-ir/fields.h>
BT_ASSERT_PRE_NON_NULL(event, "Event");
BT_ASSERT_PRE_NON_NULL(packet, "Packet");
BT_ASSERT_PRE_EVENT_COMMON_HOT(BT_TO_COMMON(event), "Event");
+ BT_ASSERT_PRE(bt_event_class_borrow_stream_class(
+ BT_FROM_COMMON(event->common.class)) ==
+ BT_FROM_COMMON(packet->stream->common.stream_class),
+ "Packet's stream class and event's stream class differ: "
+ "%![event-]+e, %![packet-]+a",
+ event, packet);
+
BT_ASSERT(!event->packet);
event->packet = packet;
bt_object_get_no_null_check_no_parent_check(&event->packet->base);
struct bt_stream_class;
struct bt_stream_common;
-typedef void (*bt_stream_common_destroy_listener_func)(
- struct bt_stream_common *stream, void *data);
-
-struct bt_stream_common_destroy_listener {
- bt_stream_common_destroy_listener_func func;
- void *data;
-};
-
struct bt_stream_common {
struct bt_object base;
int64_t id;
struct bt_stream_class_common *stream_class;
GString *name;
-
- /* Array of struct bt_stream_common_destroy_listener */
- GArray *destroy_listeners;
};
struct bt_stream {
struct bt_object_pool packet_pool;
};
-BT_HIDDEN
-void bt_stream_common_add_destroy_listener(struct bt_stream_common *stream,
- bt_stream_common_destroy_listener_func func, void *data);
-
-BT_HIDDEN
-void bt_stream_common_remove_destroy_listener(struct bt_stream_common *stream,
- bt_stream_common_destroy_listener_func func, void *data);
-
BT_HIDDEN
int bt_stream_common_initialize(
struct bt_stream_common *stream,
BT_HIDDEN
void bt_stream_common_finalize(struct bt_stream_common *stream)
{
- int i;
-
BT_LOGD("Finalizing common stream object: addr=%p, name=\"%s\"",
stream, bt_stream_common_get_name(stream));
- /* Call destroy listeners in reverse registration order */
- if (stream->destroy_listeners) {
- for (i = stream->destroy_listeners->len - 1; i >= 0; i--) {
- struct bt_stream_common_destroy_listener *listener =
- &g_array_index(stream->destroy_listeners,
- struct bt_stream_common_destroy_listener, i);
-
- BT_LOGD("Calling destroy listener: func=%p, data=%p, index=%d",
- listener->func, listener->data, i);
- listener->func(stream, listener->data);
- }
- }
-
if (stream->name) {
g_string_free(stream->name, TRUE);
}
-
- if (stream->destroy_listeners) {
- g_array_free(stream->destroy_listeners, TRUE);
- }
}
static
bt_object_set_parent(&stream->base, &trace->base);
stream->stream_class = stream_class;
stream->id = (int64_t) id;
- stream->destroy_listeners = g_array_new(FALSE, TRUE,
- sizeof(struct bt_stream_common_destroy_listener));
- if (!stream->destroy_listeners) {
- BT_LOGE_STR("Failed to allocate a GArray.");
- goto error;
- }
if (name) {
stream->name = g_string_new(name);
{
return bt_stream_common_get_id(BT_TO_COMMON(stream));
}
-
-BT_HIDDEN
-void bt_stream_common_add_destroy_listener(struct bt_stream_common *stream,
- bt_stream_common_destroy_listener_func func, void *data)
-{
- struct bt_stream_common_destroy_listener listener;
-
- BT_ASSERT(stream);
- BT_ASSERT(func);
- listener.func = func;
- listener.data = data;
- g_array_append_val(stream->destroy_listeners, listener);
- BT_LOGV("Added stream destroy listener: stream-addr=%p, "
- "stream-name=\"%s\", func=%p, data=%p",
- stream, bt_stream_common_get_name(stream), func, data);
-}
-
-BT_HIDDEN
-void bt_stream_common_remove_destroy_listener(struct bt_stream_common *stream,
- bt_stream_common_destroy_listener_func func, void *data)
-{
- size_t i;
-
- BT_ASSERT(stream);
- BT_ASSERT(func);
-
- for (i = 0; i < stream->destroy_listeners->len; i++) {
- struct bt_stream_common_destroy_listener *listener =
- &g_array_index(stream->destroy_listeners,
- struct bt_stream_common_destroy_listener, i);
-
- if (listener->func == func && listener->data == data) {
- g_array_remove_index(stream->destroy_listeners, i);
- i--;
- BT_LOGV("Removed stream destroy listener: stream-addr=%p, "
- "stream-name=\"%s\", func=%p, data=%p",
- stream, bt_stream_common_get_name(stream),
- func, data);
- }
- }
-}
bt_bool is_ended;
};
-static
-void stream_destroy_listener(struct bt_stream_common *stream, void *data)
-{
- struct bt_notification_iterator_private_connection *iterator = data;
-
- /* Remove associated stream state */
- g_hash_table_remove(iterator->stream_states, stream);
-}
-
+BT_ASSERT_PRE_FUNC
static
void destroy_stream_state(struct stream_state *stream_state)
{
g_free(stream_state);
}
+BT_ASSERT_PRE_FUNC
static
struct stream_state *create_stream_state(struct bt_stream *stream)
{
* listener would be called with an invalid/other
* notification iterator object.
*/
- GHashTableIter ht_iter;
- gpointer stream_gptr, stream_state_gptr;
-
- g_hash_table_iter_init(&ht_iter, iterator->stream_states);
-
- while (g_hash_table_iter_next(&ht_iter, &stream_gptr, &stream_state_gptr)) {
- BT_ASSERT(stream_gptr);
-
- BT_LOGD_STR("Removing stream's destroy listener for notification iterator.");
- bt_stream_common_remove_destroy_listener(
- (void *) stream_gptr, stream_destroy_listener,
- iterator);
- }
-
g_hash_table_destroy(iterator->stream_states);
}