X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=lib%2Fctf-ir%2Fstream.c;h=4eb05a8b6365019e05818c7e6652ce2d18d21af3;hp=828b2db8676cd11e32a499fe2935b0e455f30ff2;hb=312c056ae3d374b253fa0cfe5ed576c0b0e5e569;hpb=3dca22768a95bef664012559aa9ac977091de6ac diff --git a/lib/ctf-ir/stream.c b/lib/ctf-ir/stream.c index 828b2db8..4eb05a8b 100644 --- a/lib/ctf-ir/stream.c +++ b/lib/ctf-ir/stream.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -52,14 +53,16 @@ void bt_stream_common_finalize(struct bt_stream_common *stream) stream, bt_stream_common_get_name(stream)); /* Call destroy listeners in reverse registration order */ - 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->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) { @@ -78,6 +81,7 @@ void bt_stream_destroy(struct bt_object *obj) BT_LOGD("Destroying stream object: addr=%p, name=\"%s\"", stream, bt_stream_get_name(stream)); + bt_object_pool_finalize(&stream->packet_pool); bt_stream_common_finalize((void *) obj); g_free(stream); } @@ -171,6 +175,12 @@ end: return ret; } +static +void bt_stream_free_packet(struct bt_packet *packet, struct bt_stream *stream) +{ + bt_packet_destroy(packet); +} + static struct bt_stream *bt_stream_create_with_id_no_check( struct bt_stream_class *stream_class, @@ -224,6 +234,15 @@ struct bt_stream *bt_stream_create_with_id_no_check( goto error; } + ret = bt_object_pool_initialize(&stream->packet_pool, + (bt_object_pool_new_object_func) bt_packet_new, + (bt_object_pool_destroy_object_func) bt_stream_free_packet, + stream); + if (ret) { + BT_LOGE("Failed to initialize packet pool: ret=%d", ret); + goto error; + } + g_ptr_array_add(trace->common.streams, stream); BT_LOGD("Created stream object: addr=%p", stream); goto end; @@ -260,9 +279,9 @@ end: return stream; } -struct bt_stream_class *bt_stream_get_class(struct bt_stream *stream) +struct bt_stream_class *bt_stream_borrow_class(struct bt_stream *stream) { - return BT_FROM_COMMON(bt_stream_common_get_class(BT_TO_COMMON(stream))); + return BT_FROM_COMMON(bt_stream_common_borrow_class(BT_TO_COMMON(stream))); } const char *bt_stream_get_name(struct bt_stream *stream)