diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-02-16 03:36:44 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-02-21 17:47:40 +0100 |
commit | b9bcc7c733d0e877da24686f413fac10defcfa3c (patch) | |
tree | a73f08b1dd0c1622405b2c77b3a4fb4923d6cbe1 /src/pulsecore/fdsem.c | |
parent | ac76dbde6312b8052b80ce0239ef9443cfb27e1f (diff) |
fdsem: be more verbose when reading from eventfd fails.
Apperently reading from an eventfd can fail, which results in an assert
to be hit. I am not sure about the reason for the failure, but in
attempt to track down the issue the next time is hit this prints a more
useful log message.
https://bugzilla.redhat.com/attachment.cgi?id=386380
Diffstat (limited to 'src/pulsecore/fdsem.c')
-rw-r--r-- | src/pulsecore/fdsem.c | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/pulsecore/fdsem.c b/src/pulsecore/fdsem.c index ea14e8a7..5bf99479 100644 --- a/src/pulsecore/fdsem.c +++ b/src/pulsecore/fdsem.c @@ -35,6 +35,7 @@ #include <pulsecore/thread.h> #include <pulsecore/macro.h> #include <pulsecore/core-util.h> +#include <pulsecore/core-error.h> #include <pulse/xmalloc.h> #ifndef HAVE_PIPE @@ -154,7 +155,12 @@ static void flush(pa_fdsem *f) { uint64_t u; if ((r = read(f->efd, &u, sizeof(u))) != sizeof(u)) { - pa_assert(r < 0 && errno == EINTR); + + if (r >= 0 || errno != EINTR) { + pa_log_error("Invalid read from eventfd: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + pa_assert_not_reached(); + } + continue; } r = (ssize_t) u; @@ -162,7 +168,12 @@ static void flush(pa_fdsem *f) { #endif if ((r = read(f->fds[0], &x, sizeof(x))) <= 0) { - pa_assert(r < 0 && errno == EINTR); + + if (r >= 0 || errno != EINTR) { + pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + pa_assert_not_reached(); + } + continue; } @@ -187,14 +198,22 @@ void pa_fdsem_post(pa_fdsem *f) { uint64_t u = 1; if ((r = write(f->efd, &u, sizeof(u))) != sizeof(u)) { - pa_assert(r < 0 && errno == EINTR); + if (r >= 0 || errno != EINTR) { + pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + pa_assert_not_reached(); + } + continue; } } else #endif if ((r = write(f->fds[1], &x, 1)) != 1) { - pa_assert(r < 0 && errno == EINTR); + if (r >= 0 || errno != EINTR) { + pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + pa_assert_not_reached(); + } + continue; } @@ -223,7 +242,12 @@ void pa_fdsem_wait(pa_fdsem *f) { uint64_t u; if ((r = read(f->efd, &u, sizeof(u))) != sizeof(u)) { - pa_assert(r < 0 && errno == EINTR); + + if (r >= 0 || errno != EINTR) { + pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + pa_assert_not_reached(); + } + continue; } @@ -232,7 +256,12 @@ void pa_fdsem_wait(pa_fdsem *f) { #endif if ((r = read(f->fds[0], &x, sizeof(x))) <= 0) { - pa_assert(r < 0 && errno == EINTR); + + if (r >= 0 || errno != EINTR) { + pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF"); + pa_assert_not_reached(); + } + continue; } |