diff options
author | Jaroslav Kysela <perex@perex.cz> | 2022-06-27 13:36:12 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2022-06-27 13:36:36 +0200 |
commit | 65c4796a8567a7eb5234972220af6b390d924161 (patch) | |
tree | 61e7874c09ae95ae2123505968348d5e43964f48 | |
parent | b97047b4506994080982a587eb1249cd83a701d1 (diff) | |
download | alsa-lib-65c4796a8567a7eb5234972220af6b390d924161.tar.gz |
pcm: share plugin: handle -EINTR
Fixes: https://github.com/alsa-project/alsa-lib/pull/242
Fixes: b97047b4 ("pcm: share plugin: return error if socket read or write call fails")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/pcm/pcm_share.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c index dc972dd8..ac088472 100644 --- a/src/pcm/pcm_share.c +++ b/src/pcm/pcm_share.c @@ -289,19 +289,25 @@ static snd_pcm_uframes_t _snd_pcm_share_missing(snd_pcm_t *pcm) update_poll: if (ready != share->ready) { char buf[1]; - if (pcm->stream == SND_PCM_STREAM_PLAYBACK) { - if (ready) - s = read(share->slave_socket, buf, 1); - else - s = write(share->client_socket, buf, 1); - } else { - if (ready) - s = write(share->slave_socket, buf, 1); - else - s = read(share->client_socket, buf, 1); + while (1) { + if (pcm->stream == SND_PCM_STREAM_PLAYBACK) { + if (ready) + s = read(share->slave_socket, buf, 1); + else + s = write(share->client_socket, buf, 1); + } else { + if (ready) + s = write(share->slave_socket, buf, 1); + else + s = read(share->client_socket, buf, 1); + } + if (s < 0) { + if (errno == EINTR) + continue; + return INT_MAX; + } + break; } - if (s == -1) - return INT_MAX; share->ready = ready; } if (!running) |