From 75058bfb5bd14d2eb540bff62009ad54e5b03ba0 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 9 Mar 2014 13:23:56 +0100 Subject: [PATCH] ao_write: Simplify locking. Currently we lock the mutex at the beginnint of each iteration of the main loop of aow_play() and drop the lock before calling ao_play(). On errors we leave the loop either with the mutex locked locked or unlocked, depending on the error condition that caused us to break out of the loop. This is unnecessarily complex. This patch simplifies the locking by always leave the loop with the mutex locked. --- ao_write.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ao_write.c b/ao_write.c index 5c14aa71..af688242 100644 --- a/ao_write.c +++ b/ao_write.c @@ -224,12 +224,12 @@ __noreturn static void *aow_play(void *priv) char *data; int ret; + pthread_mutex_lock(&pawd->mutex); for (;;) { - pthread_mutex_lock(&pawd->mutex); for (;;) { ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF); if (ret < 0) - goto unlock; + goto fail; if (ret > 0) { btr_merge(btrn, wn->min_iqs); bytes = btr_next_buffer(btrn, &data); @@ -238,7 +238,7 @@ __noreturn static void *aow_play(void *priv) break; /* eof and less than a single frame available */ ret = -E_WRITE_COMMON_EOF; - goto unlock; + goto fail; } /* * No data available, go to sleep and wait for the main @@ -251,22 +251,22 @@ __noreturn static void *aow_play(void *priv) /* pthread_cond_wait() can never fail here */ assert(ret == 0); } - pthread_mutex_unlock(&pawd->mutex); assert(frames > 0); bytes = frames * pawd->bytes_per_frame; - ret = -E_AO_PLAY; - if (ao_play(pawd->dev, data, bytes) == 0) /* failure */ - goto out; + pthread_mutex_unlock(&pawd->mutex); + ret = ao_play(pawd->dev, data, bytes); pthread_mutex_lock(&pawd->mutex); + if (ret == 0) { /* failure */ + ret = -E_AO_PLAY; + goto fail; + } btr_consume(btrn, bytes); - pthread_mutex_unlock(&pawd->mutex); } -unlock: - pthread_mutex_unlock(&pawd->mutex); -out: +fail: + btr_remove_node(&pawd->thread_btrn); assert(ret < 0); PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); - btr_remove_node(&pawd->thread_btrn); + pthread_mutex_unlock(&pawd->mutex); pthread_exit(NULL); } -- 2.39.2