From 921331854a1426c8d836d74f326565dac0985f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 4 May 2020 20:11:45 +0200 Subject: [PATCH] term: check return value when instantiating thread synchronization primitives --- terminal.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/terminal.c b/terminal.c index 1c00e5ae..c9775b52 100644 --- a/terminal.c +++ b/terminal.c @@ -480,10 +480,26 @@ initialize_render_workers(struct terminal *term) { LOG_INFO("using %zu rendering threads", term->render.workers.count); - sem_init(&term->render.workers.start, 0, 0); - sem_init(&term->render.workers.done, 0, 0); - mtx_init(&term->render.workers.lock, mtx_plain); - cnd_init(&term->render.workers.cond); + if (sem_init(&term->render.workers.start, 0, 0) < 0 || + sem_init(&term->render.workers.done, 0, 0) < 0) + { + LOG_ERRNO("failed to instantiate render worker semaphores"); + return false; + } + + int err; + if ((err = mtx_init(&term->render.workers.lock, mtx_plain)) != thrd_success) { + LOG_ERR("failed to instantiate render worker mutex: %s (%d)", + thrd_err_as_string(err), err); + goto err_sem_destroy; + } + + if ((err = cnd_init(&term->render.workers.cond)) != thrd_success) { + LOG_ERR( + "failed to instantiate render worker condition variable: %s (%d)", + thrd_err_as_string(err), err); + goto err_sem_destroy; + } term->render.workers.threads = calloc( term->render.workers.count, sizeof(term->render.workers.threads[0])); @@ -507,6 +523,11 @@ initialize_render_workers(struct terminal *term) } return true; + +err_sem_destroy: + sem_destroy(&term->render.workers.start); + sem_destroy(&term->render.workers.done); + return false; } static bool