From 670f117bcb34a3c3ab9b8e759a4d3b7d97570d8e Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 13 Jun 2023 12:11:10 -0400 Subject: [PATCH] MT#55283 honour edge-triggered epoll We need to loop over the read(fd) as we're calling epoll using edge-triggered semantics. Reported in #1676 Change-Id: I8f36b76c1ab32cf5c97b3dff1acf4e3e081ea33e --- recording-daemon/stream.c | 69 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/recording-daemon/stream.c b/recording-daemon/stream.c index 548396403..e427395d1 100644 --- a/recording-daemon/stream.c +++ b/recording-daemon/stream.c @@ -47,45 +47,42 @@ static void stream_handler(handler_t *handler) { //dbg("poll event for %s", stream->name); - pthread_mutex_lock(&stream->lock); - - if (stream->fd == -1) - goto out; - - buf = malloc(ALLOCLEN); - int ret = read(stream->fd, buf, MAXBUFLEN); - if (ret == 0) { - ilog(LOG_INFO, "EOF on stream %s", stream->name); - stream_close(stream); - goto out; - } - else if (ret < 0) { - if (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK) - goto out; - ilog(LOG_INFO, "Read error on stream %s: %s", stream->name, strerror(errno)); - stream_close(stream); - goto out; - } - - // got a packet - pthread_mutex_unlock(&stream->lock); - - if (forward_to){ - if (forward_packet(stream->metafile,buf,ret)) // leaves buf intact - g_atomic_int_inc(&stream->metafile->forward_failed); + while (true) { + pthread_mutex_lock(&stream->lock); + + if (stream->fd == -1) + break; + + buf = malloc(ALLOCLEN); + int ret = read(stream->fd, buf, MAXBUFLEN); + if (ret == 0) { + ilog(LOG_INFO, "EOF on stream %s", stream->name); + stream_close(stream); + break; + } + else if (ret < 0) { + if (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK) + break; + ilog(LOG_INFO, "Read error on stream %s: %s", stream->name, strerror(errno)); + stream_close(stream); + break; + } + + // got a packet + pthread_mutex_unlock(&stream->lock); + + if (forward_to){ + if (forward_packet(stream->metafile,buf,ret)) // leaves buf intact + g_atomic_int_inc(&stream->metafile->forward_failed); + else + g_atomic_int_inc(&stream->metafile->forward_count); + } + if (decoding_enabled) + packet_process(stream, buf, ret); // consumes buf else - g_atomic_int_inc(&stream->metafile->forward_count); + free(buf); } - if (decoding_enabled) - packet_process(stream, buf, ret); // consumes buf - else - free(buf); - log_info_call = NULL; - log_info_stream = NULL; - return; - -out: pthread_mutex_unlock(&stream->lock); free(buf); log_info_call = NULL;