obs_service_t *obs_service_create(const char *id, const char *name, obs_data_t *settings) { const struct obs_service_info *info = find_service(id); struct obs_service *service; if (!info) { blog(LOG_ERROR, "Service '%s' not found", id); return NULL; } service = bzalloc(sizeof(struct obs_service)); if (!obs_context_data_init(&service->context, settings, name)) { bfree(service); return NULL; } service->info = *info; service->context.data = service->info.create(service->context.settings, service); if (!service->context.data) { obs_service_destroy(service); return NULL; } obs_context_data_insert(&service->context, &obs->data.services_mutex, &obs->data.first_service); blog(LOG_INFO, "service '%s' (%s) created", name, id); return service; }
void obs_service_release(obs_service_t *service) { if (!service) return; obs_weak_service_t *control = service->control; if (obs_ref_release(&control->ref)) { // The order of operations is important here since // get_context_by_name in obs.c relies on weak refs // being alive while the context is listed obs_service_destroy(service); obs_weak_service_release(control); } }