int app_subscribe_channel(struct stasis_app *app, struct ast_channel *chan) { int res; if (!app || !chan) { return -1; } else { RAII_VAR(struct app_forwards *, forwards, NULL, ao2_cleanup); SCOPED_AO2LOCK(lock, app->forwards); forwards = ao2_find(app->forwards, ast_channel_uniqueid(chan), OBJ_SEARCH_KEY | OBJ_NOLOCK); if (!forwards) { /* Forwards not found, create one */ forwards = forwards_create_channel(app, chan); if (!forwards) { return -1; } res = ao2_link_flags(app->forwards, forwards, OBJ_NOLOCK); if (!res) { return -1; } } ++forwards->interested; ast_debug(3, "Channel '%s' is %d interested in %s\n", ast_channel_uniqueid(chan), forwards->interested, app->name); return 0; } }
int app_subscribe_channel(struct stasis_app *app, struct ast_channel *chan) { struct app_forwards *forwards; if (!app) { return -1; } ao2_lock(app->forwards); /* If subscribed to all, don't subscribe again */ forwards = ao2_find(app->forwards, CHANNEL_ALL, OBJ_SEARCH_KEY | OBJ_NOLOCK); if (forwards) { ao2_unlock(app->forwards); ao2_ref(forwards, -1); return 0; } forwards = ao2_find(app->forwards, chan ? ast_channel_uniqueid(chan) : CHANNEL_ALL, OBJ_SEARCH_KEY | OBJ_NOLOCK); if (!forwards) { int res; /* Forwards not found, create one */ forwards = forwards_create_channel(app, chan); if (!forwards) { ao2_unlock(app->forwards); return -1; } res = ao2_link_flags(app->forwards, forwards, OBJ_NOLOCK); if (!res) { ao2_unlock(app->forwards); ao2_ref(forwards, -1); return -1; } } ++forwards->interested; ast_debug(3, "Channel '%s' is %d interested in %s\n", chan ? ast_channel_uniqueid(chan) : "ALL", forwards->interested, app->name); ao2_unlock(app->forwards); ao2_ref(forwards, -1); return 0; }