use internal malloc for posix_spawn file actions objects
[musl] / src / aio / aio_suspend.c
index 2391d78..1c1060e 100644 (file)
@@ -2,10 +2,8 @@
 #include <errno.h>
 #include <time.h>
 #include "atomic.h"
-#include "libc.h"
 #include "pthread_impl.h"
-
-extern volatile int __aio_fut;
+#include "aio_impl.h"
 
 int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec *ts)
 {
@@ -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,13 +61,19 @@ int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec
                        break;
                }
 
-               ret = __timedwait(pfut, expect, CLOCK_MONOTONIC, ts?&at:0, 0, 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;
                }
        }
 }
 
-LFS64(aio_suspend);
+#if !_REDIR_TIME64
+weak_alias(aio_suspend, aio_suspend64);
+#endif