From c43026d93e210600d206861dcc3027d83a15c6ed Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 2 Nov 2020 16:43:56 +0100 Subject: [PATCH] don't handle EINTR and EAGAIN as the same EAGAIN means a non-blocking operation would block and we should not try again right away but leave the loop and wait instead. See #358 --- pipewire-jack/src/pipewire-jack.c | 4 ++-- pipewire-pulseaudio/src/context.c | 2 +- pipewire-pulseaudio/src/mainloop-glib.c | 2 +- pipewire-pulseaudio/src/mainloop.c | 2 +- src/examples/media-session/media-session.c | 2 +- src/pipewire/data-loop.c | 4 ++-- src/pipewire/main-loop.c | 2 +- src/pipewire/thread-loop.c | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c index f3bd50909..8192570e4 100644 --- a/pipewire-jack/src/pipewire-jack.c +++ b/pipewire-jack/src/pipewire-jack.c @@ -1080,9 +1080,9 @@ static inline uint32_t cycle_run(struct client *c) /* this is blocking if nothing ready */ while (true) { if (SPA_UNLIKELY(read(fd, &cmd, sizeof(cmd)) != sizeof(cmd))) { - if (errno == EAGAIN || errno == EINTR) + if (errno == EINTR) continue; - if (errno == EWOULDBLOCK) + if (errno == EWOULDBLOCK || errno == EAGAIN) return 0; pw_log_warn(NAME" %p: read failed %m", c); } diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index c394820a8..7412d578a 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1661,7 +1661,7 @@ static void io_event_cb(pa_mainloop_api*ea, pa_io_event* e, int fd, pa_io_event_ pw_loop_enter(c->loop); do { res = pw_loop_iterate(c->loop, 0); - } while (res == -EINTR || res == -EAGAIN); + } while (res == -EINTR); pw_loop_leave(c->loop); } } diff --git a/pipewire-pulseaudio/src/mainloop-glib.c b/pipewire-pulseaudio/src/mainloop-glib.c index bd8899561..7295256e0 100644 --- a/pipewire-pulseaudio/src/mainloop-glib.c +++ b/pipewire-pulseaudio/src/mainloop-glib.c @@ -55,7 +55,7 @@ static gboolean source_dispatch (GSource *source, GSourceFunc callback, gpointer pw_loop_enter (s->loop); do { result = pw_loop_iterate (s->loop, 0); - } while (result == -EINTR || result == -EAGAIN); + } while (result == -EINTR); pw_loop_leave (s->loop); if (result < 0) diff --git a/pipewire-pulseaudio/src/mainloop.c b/pipewire-pulseaudio/src/mainloop.c index 0f30c1bdc..4c7189ad9 100644 --- a/pipewire-pulseaudio/src/mainloop.c +++ b/pipewire-pulseaudio/src/mainloop.c @@ -354,7 +354,7 @@ int pa_mainloop_poll(pa_mainloop *m) pw_loop_enter(m->loop); do { res = pw_loop_iterate(m->loop, timeout); - } while (res == -EINTR || res == -EAGAIN); + } while (res == -EINTR); pw_loop_leave(m->loop); } diff --git a/src/examples/media-session/media-session.c b/src/examples/media-session/media-session.c index a6621ffcf..445b3ff3d 100644 --- a/src/examples/media-session/media-session.c +++ b/src/examples/media-session/media-session.c @@ -1345,7 +1345,7 @@ int sm_media_session_roundtrip(struct sm_media_session *sess) pw_loop_enter(loop); while (!done) { if ((res = pw_loop_iterate(loop, -1)) < 0) { - if (res == -EINTR || res == -EAGAIN) + if (res == -EINTR) continue; pw_log_warn(NAME" %p: iterate error %d (%s)", loop, res, spa_strerror(res)); diff --git a/src/pipewire/data-loop.c b/src/pipewire/data-loop.c index 3c694320c..9489387d9 100644 --- a/src/pipewire/data-loop.c +++ b/src/pipewire/data-loop.c @@ -43,7 +43,7 @@ int pw_data_loop_wait(struct pw_data_loop *this, int timeout) break; } if ((res = pw_loop_iterate(this->loop, timeout)) < 0) { - if (res == -EINTR || res == -EAGAIN) + if (res == -EINTR) continue; } break; @@ -77,7 +77,7 @@ static void *do_loop(void *user_data) while (this->running) { if ((res = pw_loop_iterate(this->loop, -1)) < 0) { - if (res == -EINTR || res == -EAGAIN) + if (res == -EINTR) continue; pw_log_error(NAME" %p: iterate error %d (%s)", this, res, spa_strerror(res)); diff --git a/src/pipewire/main-loop.c b/src/pipewire/main-loop.c index e58e18318..632983102 100644 --- a/src/pipewire/main-loop.c +++ b/src/pipewire/main-loop.c @@ -154,7 +154,7 @@ int pw_main_loop_run(struct pw_main_loop *loop) pw_loop_enter(loop->loop); while (loop->running) { if ((res = pw_loop_iterate(loop->loop, -1)) < 0) { - if (res == -EINTR || res == -EAGAIN) + if (res == -EINTR) continue; pw_log_warn(NAME" %p: iterate error %d (%s)", loop, res, spa_strerror(res)); diff --git a/src/pipewire/thread-loop.c b/src/pipewire/thread-loop.c index 1b974c011..c931136a4 100644 --- a/src/pipewire/thread-loop.c +++ b/src/pipewire/thread-loop.c @@ -239,7 +239,7 @@ static void *do_loop(void *user_data) while (this->running) { if ((res = pw_loop_iterate(this->loop, -1)) < 0) { - if (res == -EINTR || res == -EAGAIN) + if (res == -EINTR) continue; pw_log_warn(NAME" %p: iterate error %d (%s)", this, res, spa_strerror(res));