ast_bridge_channel_lock(participant);
ast_channel_lock(participant->chan);
- topology = ast_channel_get_stream_topology(participant->chan);
- if (topology) {
- /*
- * Sigh. We have to clone to avoid deadlock in
- * map_source_to_destinations() because topology
- * is not an ao2 object.
- */
- topology = ast_stream_topology_clone(topology);
- }
+ topology = ao2_bump(ast_channel_get_stream_topology(participant->chan));
if (!topology) {
/* Oh, my, we are in trouble. */
ast_channel_unlock(participant->chan);
* \retval NULL failure
*
* \since 15
+ *
+ * \note This returns an ao2 refcounted object
*/
struct ast_stream_topology *ast_stream_topology_alloc(void);
* \retval NULL failure
*
* \since 15
+ *
+ * \note This returns an ao2 refcounted object
*/
struct ast_stream_topology *ast_stream_topology_clone(
const struct ast_stream_topology *topology);
const struct ast_stream_topology *right);
/*!
- * \brief Destroy a stream topology
+ * \brief Unreference and destroy a stream topology
*
* \param topology The topology of streams
*
return stream->position;
}
+static void stream_topology_destroy(void *data)
+{
+ struct ast_stream_topology *topology = data;
+
+ AST_VECTOR_CALLBACK_VOID(&topology->streams, ast_stream_free);
+ AST_VECTOR_FREE(&topology->streams);
+}
+
#define TOPOLOGY_INITIAL_STREAM_COUNT 2
struct ast_stream_topology *ast_stream_topology_alloc(void)
{
struct ast_stream_topology *topology;
- topology = ast_calloc(1, sizeof(*topology));
+ topology = ao2_alloc_options(sizeof(*topology), stream_topology_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!topology) {
return NULL;
}
if (AST_VECTOR_INIT(&topology->streams, TOPOLOGY_INITIAL_STREAM_COUNT)) {
- ast_free(topology);
+ ao2_ref(topology, -1);
topology = NULL;
}
void ast_stream_topology_free(struct ast_stream_topology *topology)
{
- if (!topology) {
- return;
- }
-
- AST_VECTOR_CALLBACK_VOID(&topology->streams, ast_stream_free);
- AST_VECTOR_FREE(&topology->streams);
- ast_free(topology);
+ ao2_cleanup(topology);
}
int ast_stream_topology_append_stream(struct ast_stream_topology *topology, struct ast_stream *stream)