From 58500445991427e8ad32539f0e3b2151ce88a61b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 18 Jun 2019 10:47:12 -0400 Subject: [PATCH] improve error handling --- spa/plugins/alsa/alsa-utils.c | 9 +++++++++ spa/plugins/support/loop.c | 29 +++++++++++++++++++++++++---- src/daemon/main.c | 5 +++++ src/pipewire/data-loop.c | 2 ++ src/pipewire/loop.c | 12 ++---------- src/pipewire/pipewire.c | 3 ++- 6 files changed, 45 insertions(+), 15 deletions(-) diff --git a/spa/plugins/alsa/alsa-utils.c b/spa/plugins/alsa/alsa-utils.c index 6a143c8ea..e6ff8c532 100644 --- a/spa/plugins/alsa/alsa-utils.c +++ b/spa/plugins/alsa/alsa-utils.c @@ -36,11 +36,20 @@ static int spa_alsa_open(struct state *state) state->timerfd = spa_system_timerfd_create(state->data_system, CLOCK_MONOTONIC, SPA_FD_CLOEXEC | SPA_FD_NONBLOCK); + if (state->timerfd == -1) { + err = -errno; + goto err_close; + } + state->opened = true; state->sample_count = 0; state->sample_time = 0; return 0; + +err_close: + snd_pcm_close(state->hndl); + return err; } int spa_alsa_close(struct state *state) diff --git a/spa/plugins/support/loop.c b/spa/plugins/support/loop.c index 20c5c4315..2dcc692ae 100644 --- a/spa/plugins/support/loop.c +++ b/spa/plugins/support/loop.c @@ -727,6 +727,7 @@ impl_init(const struct spa_handle_factory *factory, { struct impl *impl; uint32_t i; + int res; spa_return_val_if_fail(factory != NULL, -EINVAL); spa_return_val_if_fail(handle != NULL, -EINVAL); @@ -760,12 +761,16 @@ impl_init(const struct spa_handle_factory *factory, } if (impl->system == NULL) { spa_log_error(impl->log, NAME " %p: a System is needed", impl); - return -EINVAL; + res = -EINVAL; + goto err; } impl->poll_fd = spa_system_pollfd_create(impl->system, SPA_FD_CLOEXEC); - if (impl->poll_fd < 0) - return errno; + if (impl->poll_fd < 0) { + res = -errno; + spa_log_error(impl->log, NAME " %p: can't create pollfd: %m", impl); + goto err; + } spa_list_init(&impl->source_list); spa_list_init(&impl->destroy_list); @@ -774,12 +779,28 @@ impl_init(const struct spa_handle_factory *factory, spa_ringbuffer_init(&impl->buffer); impl->wakeup = loop_add_event(impl, wakeup_func, impl); + if (impl->wakeup == NULL) { + res = -errno; + spa_log_error(impl->log, NAME " %p: can't create wakeup event: %m", impl); + goto err_free_poll; + } impl->ack_fd = spa_system_eventfd_create(impl->system, SPA_FD_EVENT_SEMAPHORE | SPA_FD_CLOEXEC); - + if (impl->ack_fd < 0) { + res = -errno; + spa_log_error(impl->log, NAME " %p: can't create ack event: %m", impl); + goto err_free_wakeup; + } spa_log_debug(impl->log, NAME " %p: initialized", impl); return 0; + +err_free_wakeup: + loop_destroy_source(impl, impl->wakeup); +err_free_poll: + spa_system_close(impl->system, impl->poll_fd); +err: + return res; } static const struct spa_interface_info impl_interfaces[] = { diff --git a/src/daemon/main.c b/src/daemon/main.c index 88deb8f60..90db53232 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -107,6 +107,11 @@ int main(int argc, char *argv[]) PW_KEY_CORE_DAEMON, "1", NULL), 0); + if (core == NULL) { + pw_log_error("failed to create core: %m"); + return -1; + } + if (pw_daemon_config_run_commands(config, core) < 0) { pw_log_error("failed to run config commands"); return -1; diff --git a/src/pipewire/data-loop.c b/src/pipewire/data-loop.c index 69e5f4ab6..c9ae1ad77 100644 --- a/src/pipewire/data-loop.c +++ b/src/pipewire/data-loop.c @@ -74,12 +74,14 @@ struct pw_data_loop *pw_data_loop_new(struct pw_properties *properties) this->loop = pw_loop_new(properties); if (this->loop == NULL) { + pw_log_debug("data-loop %p: can't create loop: %m", this); res = -errno; goto no_loop; } this->event = pw_loop_add_event(this->loop, do_stop, this); if (this->event == NULL) { + pw_log_debug("data-loop %p: can't add event: %m", this); res = -errno; goto no_event; } diff --git a/src/pipewire/loop.c b/src/pipewire/loop.c index 55dcd9e74..867c15df9 100644 --- a/src/pipewire/loop.c +++ b/src/pipewire/loop.c @@ -86,7 +86,7 @@ struct pw_loop *pw_loop_new(struct pw_properties *properties) if ((res = spa_handle_get_interface(impl->system_handle, SPA_TYPE_INTERFACE_System, &iface)) < 0) { - fprintf(stderr, "can't get System interface %d\n", res); + pw_log_error("can't get System interface %d\n", res); goto out_free_system; } this->system = iface; @@ -104,18 +104,10 @@ struct pw_loop *pw_loop_new(struct pw_properties *properties) n_support, support); if (impl->loop_handle == NULL) { res = -errno; - pw_log_error("can't make loop handle"); + pw_log_error("can't make loop handle: %m"); goto out_free_system; } - if ((res = spa_handle_get_interface(impl->system_handle, - SPA_TYPE_INTERFACE_System, - &iface)) < 0) { - fprintf(stderr, "can't get System interface %d\n", res); - goto out_free_loop; - } - this->system = iface; - if ((res = spa_handle_get_interface(impl->loop_handle, SPA_TYPE_INTERFACE_Loop, &iface)) < 0) { diff --git a/src/pipewire/pipewire.c b/src/pipewire/pipewire.c index a90d46a75..0544567de 100644 --- a/src/pipewire/pipewire.c +++ b/src/pipewire/pipewire.c @@ -256,7 +256,8 @@ struct spa_handle *pw_load_spa_handle(const char *lib, if ((res = spa_handle_factory_init(factory, &handle->handle, info, support, n_support)) < 0) { - pw_log_warn("can't make factory instance %s: %d\n", factory_name, res); + pw_log_warn("can't make factory instance '%s': %d (%s)", + factory_name, res, spa_strerror(res)); goto out_free_handle; }