mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
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.
This commit is contained in:
parent
68ed40570d
commit
62aa77d469
1 changed files with 11 additions and 19 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
@ -1263,7 +1255,7 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp,
|
|||
pw_thread_loop_unlock(pw->main_loop);
|
||||
|
||||
pw->fd = spa_system_eventfd_create(pw->system,
|
||||
SPA_FD_EVENT_SEMAPHORE | SPA_FD_CLOEXEC | SPA_FD_NONBLOCK);
|
||||
SPA_FD_CLOEXEC | SPA_FD_NONBLOCK);
|
||||
if (pw->fd < 0) {
|
||||
err = pw->fd;
|
||||
goto error;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue