While glibc supports ppoll, ppoll is not standardized and
apparently is not a cancellation point in some versions FreeBSD
based on Mykola Golub's bug report.

Reported-by: Mykola Golub <[email protected]>
ref: <[email protected]>
---
 sig.c | 22 ++++------------------
 1 file changed, 4 insertions(+), 18 deletions(-)

diff --git a/sig.c b/sig.c
index cfbffc2..7e1c200 100644
--- a/sig.c
+++ b/sig.c
@@ -27,27 +27,14 @@ void mog_intr_enable(void)
        CHECK(int, 0, pthread_sigmask(SIG_SETMASK, &mog_emptyset, NULL));
 }
 
-/*
- * favor ppoll if available since this is our only pselect user and
- * would increase the size of the executable
- */
-#ifdef HAVE_PPOLL
-static int sleeper(struct timespec *tsp, const sigset_t *sigmask)
-{
-       int err = 0;
-
-       if (ppoll(NULL, 0, tsp, sigmask) < 0) {
-               err = errno;
-               assert((err == EINTR || err == ENOMEM) &&
-                      "BUG in ppoll usage");
-       }
-       return err;
-}
-#else /* PSELECT */
 static int sleeper(struct timespec *tsp, const sigset_t *sigmask)
 {
        int err = 0;
 
+       /*
+        * pselect is a cancellation point,
+        * ppoll is not POSIX and is only a cancellation point on glibc.
+        */
        if (pselect(0, NULL, NULL, NULL, tsp, sigmask) < 0) {
                err = errno;
                assert((err == EINTR || err == ENOMEM) &&
@@ -55,7 +42,6 @@ static int sleeper(struct timespec *tsp, const sigset_t 
*sigmask)
        }
        return err;
 }
-#endif /* PSELECT */
 
 /* thread-safe, interruptible sleep, negative seconds -> sleep forever */
 int mog_sleep(long seconds)
-- 
EW


Reply via email to