From 37a12fab82af2cc606c0858c1074e0e7cff1227f Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 7 May 2024 10:07:30 +0200 Subject: [PATCH] alsa: remove racy atomic operations The atomic operations were used in an attempt to limit the amount of wakeups done on the eventfd. It's however racy and causes trouble in some cases. Remove the atomic operations all together, it's probably not worth optimizing this too much. --- pipewire-alsa/alsa-plugins/pcm_pipewire.c | 28 ++++++++--------------- 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/pipewire-alsa/alsa-plugins/pcm_pipewire.c b/pipewire-alsa/alsa-plugins/pcm_pipewire.c index 1e6cac79f..beac359ef 100644 --- a/pipewire-alsa/alsa-plugins/pcm_pipewire.c +++ b/pipewire-alsa/alsa-plugins/pcm_pipewire.c @@ -58,8 +58,6 @@ typedef struct { unsigned int hw_params_changed:1; unsigned int negotiated:1; - bool active; - snd_pcm_uframes_t hw_ptr; snd_pcm_uframes_t boundary; snd_pcm_uframes_t min_avail; @@ -94,9 +92,9 @@ static int update_active(snd_pcm_ioplug_t *io) { snd_pcm_pipewire_t *pw = io->private_data; snd_pcm_sframes_t avail; - bool active, old; + bool active; + uint64_t val; -retry: avail = snd_pcm_ioplug_avail(io, pw->hw_ptr, io->appl_ptr); if (pw->error > 0) { @@ -114,23 +112,17 @@ retry: else { active = false; } - old = SPA_ATOMIC_LOAD(pw->active); - if (old != active) { - uint64_t val; - pw_log_trace("%p: avail:%lu min-avail:%lu state:%s hw:%lu appl:%lu active:%d->%d state:%s", - pw, avail, pw->min_avail, snd_pcm_state_name(io->state), - pw->hw_ptr, io->appl_ptr, pw->active, active, - snd_pcm_state_name(io->state)); + pw_log_trace("%p: avail:%lu min-avail:%lu state:%s hw:%lu appl:%lu active:%d state:%s", + pw, avail, pw->min_avail, snd_pcm_state_name(io->state), + pw->hw_ptr, io->appl_ptr, active, + snd_pcm_state_name(io->state)); - if (active) - spa_system_eventfd_write(pw->system, io->poll_fd, 1); - else - spa_system_eventfd_read(pw->system, io->poll_fd, &val); + if (active) + spa_system_eventfd_write(pw->system, io->poll_fd, 1); + else + spa_system_eventfd_read(pw->system, io->poll_fd, &val); - if (!SPA_ATOMIC_CAS(pw->active, old, active)) - goto retry; - } return active; }