]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
ao_write: Simplify locking.
authorAndre Noll <maan@systemlinux.org>
Sun, 9 Mar 2014 12:23:56 +0000 (13:23 +0100)
committerAndre Noll <maan@systemlinux.org>
Sun, 6 Apr 2014 06:53:26 +0000 (08:53 +0200)
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

index 5c14aa719af937a4aba4a3a8efd62078c86bef6d..af6882420f02377e9a48c695b72af6fdb20b43e8 100644 (file)
@@ -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);
 }