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.
+ pthread_mutex_lock(&pawd->mutex);
- pthread_mutex_lock(&pawd->mutex);
for (;;) {
ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
if (ret < 0)
for (;;) {
ret = btr_node_status(btrn, wn->min_iqs, BTR_NT_LEAF);
if (ret < 0)
if (ret > 0) {
btr_merge(btrn, wn->min_iqs);
bytes = btr_next_buffer(btrn, &data);
if (ret > 0) {
btr_merge(btrn, wn->min_iqs);
bytes = btr_next_buffer(btrn, &data);
break;
/* eof and less than a single frame available */
ret = -E_WRITE_COMMON_EOF;
break;
/* eof and less than a single frame available */
ret = -E_WRITE_COMMON_EOF;
}
/*
* No data available, go to sleep and wait for the main
}
/*
* No data available, go to sleep and wait for the main
/* pthread_cond_wait() can never fail here */
assert(ret == 0);
}
/* pthread_cond_wait() can never fail here */
assert(ret == 0);
}
- pthread_mutex_unlock(&pawd->mutex);
assert(frames > 0);
bytes = frames * pawd->bytes_per_frame;
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);
pthread_mutex_lock(&pawd->mutex);
+ if (ret == 0) { /* failure */
+ ret = -E_AO_PLAY;
+ goto fail;
+ }
btr_consume(btrn, bytes);
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));
assert(ret < 0);
PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
- btr_remove_node(&pawd->thread_btrn);
+ pthread_mutex_unlock(&pawd->mutex);