From: Andre Noll Date: Sun, 9 Mar 2014 12:23:56 +0000 (+0100) Subject: ao_write: Simplify locking. X-Git-Tag: v0.5.3~20^2~2 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=75058bfb5bd14d2eb540bff62009ad54e5b03ba0;p=paraslash.git 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. --- 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); }