int app_subscribe_endpoint(struct stasis_app *app, struct ast_endpoint *endpoint) { if (!app || !endpoint) { return -1; } else { RAII_VAR(struct app_forwards *, forwards, NULL, ao2_cleanup); SCOPED_AO2LOCK(lock, app->forwards); forwards = ao2_find(app->forwards, ast_endpoint_get_id(endpoint), OBJ_SEARCH_KEY | OBJ_NOLOCK); if (!forwards) { /* Forwards not found, create one */ forwards = forwards_create_endpoint(app, endpoint); if (!forwards) { return -1; } ao2_link_flags(app->forwards, forwards, OBJ_NOLOCK); /* Subscribe for messages */ messaging_app_subscribe_endpoint(app->name, endpoint, &message_received_handler, app); } ++forwards->interested; ast_debug(3, "Endpoint '%s' is %d interested in %s\n", ast_endpoint_get_id(endpoint), forwards->interested, app->name); return 0; } }
int app_subscribe_endpoint(struct stasis_app *app, struct ast_endpoint *endpoint) { 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, ENDPOINT_ALL, OBJ_SEARCH_KEY | OBJ_NOLOCK); if (forwards) { ao2_unlock(app->forwards); ao2_ref(forwards, -1); return 0; } forwards = ao2_find(app->forwards, endpoint ? ast_endpoint_get_id(endpoint) : ENDPOINT_ALL, OBJ_SEARCH_KEY | OBJ_NOLOCK); if (!forwards) { int res; /* Forwards not found, create one */ forwards = forwards_create_endpoint(app, endpoint); 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; } /* Subscribe for messages */ messaging_app_subscribe_endpoint(app->name, endpoint, &message_received_handler, app); } ++forwards->interested; ast_debug(3, "Endpoint '%s' is %d interested in %s\n", endpoint ? ast_endpoint_get_id(endpoint) : "ALL", forwards->interested, app->name); ao2_unlock(app->forwards); ao2_ref(forwards, -1); return 0; }