struct ast_assigned_ids id1 = {NULL, NULL};
struct ast_assigned_ids id2 = {NULL, NULL};
int generated_seqno = ast_atomic_fetchadd_int((int *) &name_sequence, +1);
- struct ast_stream_topology *topology;
+ RAII_VAR(struct ast_stream_topology *, topology, NULL, ast_stream_topology_free);
/* set unique ids for the two channels */
if (assignedids && !ast_strlen_zero(assignedids->uniqueid)) {
id2.uniqueid = uniqueid2;
}
- /* We need to create a topology to place on the first channel, as we can't
- * share a single one between both.
- */
- topology = ast_stream_topology_clone(p->reqtopology);
- if (!topology) {
- return NULL;
- }
-
/*
* Allocate two new Asterisk channels
*
"%s/%s-%08x;1", tech->type, p->name, (unsigned)generated_seqno);
if (!owner) {
ast_log(LOG_WARNING, "Unable to allocate owner channel structure\n");
- ast_stream_topology_free(topology);
return NULL;
}
ast_channel_nativeformats_set(owner, p->reqcap);
if (ast_channel_is_multistream(owner)) {
- ast_channel_set_stream_topology(owner, topology);
+ /*
+ * We need to create a topology to place on the first channel, as we can't
+ * share a single one between both.
+ */
+ topology = ast_stream_topology_clone(p->reqtopology);
+ if (!topology) {
+ return NULL;
+ }
+ ast_channel_set_stream_topology(owner, ao2_bump(topology));
}
/* Determine our read/write format and set it on each channel */
static void stream_topology_destroy(void *data)
{
struct ast_stream_topology *topology = data;
+ SCOPE_ENTER(4, "Topology: %p: %s\n", topology, ast_str_tmp(128, ast_stream_topology_to_str(topology, &STR_TMP)));
AST_VECTOR_CALLBACK_VOID(&topology->streams, ast_stream_free);
AST_VECTOR_FREE(&topology->streams);
+ SCOPE_EXIT_RTN("Destroyed: %p\n", topology);
}
#define TOPOLOGY_INITIAL_STREAM_COUNT 2
struct ast_stream_topology *ast_stream_topology_alloc(void)
{
struct ast_stream_topology *topology;
+ SCOPE_ENTER(4, "Topology Create\n");
topology = ao2_alloc_options(sizeof(*topology), stream_topology_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!topology) {
- return NULL;
+ SCOPE_EXIT_RTN_VALUE(NULL, "Allocation failed\n");
}
if (AST_VECTOR_INIT(&topology->streams, TOPOLOGY_INITIAL_STREAM_COUNT)) {
ao2_ref(topology, -1);
- topology = NULL;
+ SCOPE_EXIT_RTN_VALUE(NULL, "Vector init failed\n");
}
- return topology;
+ SCOPE_EXIT_RTN_VALUE(topology, "Created: %p\n", topology);
}
struct ast_stream_topology *ast_stream_topology_clone(