summaryrefslogtreecommitdiff
path: root/src/libsink
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsink')
-rw-r--r--src/libsink/sink.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/libsink/sink.c b/src/libsink/sink.c
index 2b9d585..b9b3aa6 100644
--- a/src/libsink/sink.c
+++ b/src/libsink/sink.c
@@ -1278,9 +1278,7 @@ static struct camu_sink_entry *get_entry_from_id(struct camu_sink *sink, u32 id)
{
struct camu_sink_entry *entry;
al_array_foreach(sink->entries, i, entry) {
- if (entry->id == id) {
- return entry;
- }
+ if (entry->id == id) return entry;
}
return NULL;
}
@@ -1291,10 +1289,9 @@ static bool set_command_callback(void *userdata, struct nn_rpc_connection *conn,
struct camu_sink *sink = (struct camu_sink *)userdata;
(void)rpacket;
- nn_mutex_lock(&sink->lock);
-
u8 op = nn_packet_read_u8(packet);
if (op == LIANA_SINK_UNSET) {
+ nn_mutex_lock(&sink->lock);
if (sink->current) {
queue_cmd(sink, (struct camu_sink_cmd){
.op = EJECT_ENTRY,
@@ -1333,6 +1330,10 @@ static bool set_command_callback(void *userdata, struct nn_rpc_connection *conn,
lia_client_connect(&entry->client, sink->loop, sink->type, &addr, port, node_id, seek_pos);
}
+ // Don't lock before calling client_connect() or we could deadlock in
+ // CLIENT_CLOSED on a failed socket_connect().
+ nn_mutex_lock(&sink->lock);
+
if (op == LIANA_SINK_BUFFER) {
goto out;
} else if (op == LIANA_SINK_BUFFER_AND_QUEUE) {