move additional pthread internal declarations to pthread_impl.h, hide
[musl] / src / aio / aio_suspend.c
index dfa524b..b269dd0 100644 (file)
@@ -5,8 +5,6 @@
 #include "libc.h"
 #include "pthread_impl.h"
 
-extern volatile int __aio_fut;
-
 int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec *ts)
 {
        int i, tid = 0, ret, expect = 0;
@@ -15,6 +13,8 @@ int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec
        int nzcnt = 0;
        const struct aiocb *cb = 0;
 
+       pthread_testcancel();
+
        if (cnt<0) {
                errno = EINVAL;
                return -1;
@@ -61,10 +61,14 @@ int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec
                        break;
                }
 
-               ret = __timedwait(pfut, expect, CLOCK_MONOTONIC, ts?&at:0, 1);
+               ret = __timedwait_cp(pfut, expect, CLOCK_MONOTONIC, ts?&at:0, 1);
 
-               if (ret) {
-                       errno = ret==ETIMEDOUT ? EAGAIN : ret;
+               switch (ret) {
+               case ETIMEDOUT:
+                       ret = EAGAIN;
+               case ECANCELED:
+               case EINTR:
+                       errno = ret;
                        return -1;
                }
        }