diff options
Diffstat (limited to 'sysdeps/pthread/aio_suspend.c')
-rw-r--r-- | sysdeps/pthread/aio_suspend.c | 110 |
1 files changed, 51 insertions, 59 deletions
diff --git a/sysdeps/pthread/aio_suspend.c b/sysdeps/pthread/aio_suspend.c index 8def01c05e..1a3ec7cc04 100644 --- a/sysdeps/pthread/aio_suspend.c +++ b/sysdeps/pthread/aio_suspend.c @@ -1,5 +1,5 @@ /* Suspend until termination of a requests. - Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2000,2002,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -31,7 +31,6 @@ #include <assert.h> #include <errno.h> -#include <stdbool.h> #include <stdlib.h> #include <sys/time.h> @@ -50,7 +49,6 @@ aio_suspend (list, nent, timeout) int cnt; int result = 0; int dummy; - bool any = false; /* Request the mutex. */ pthread_mutex_lock (&__aio_requests_mutex); @@ -72,7 +70,6 @@ aio_suspend (list, nent, timeout) waitlist[cnt].sigevp = NULL; waitlist[cnt].caller_pid = 0; /* Not needed. */ requestlist[cnt]->waiting = &waitlist[cnt]; - any = true; } else /* We will never suspend. */ @@ -83,9 +80,9 @@ aio_suspend (list, nent, timeout) break; } - /* If there is no finished request wait for it. In any case we have - to dequeue the requests if we enqueued them. */ - if (any) + + /* Only if none of the entries is NULL or finished to be wait. */ + if (cnt == nent) { int oldstate; @@ -94,70 +91,65 @@ aio_suspend (list, nent, timeout) which we must remove. So defer cancelation for now. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); - /* Only if none of the entries is NULL or finished to be wait. */ - if (cnt == nent) + if (timeout == NULL) + result = pthread_cond_wait (&cond, &__aio_requests_mutex); + else { - if (timeout == NULL) - result = pthread_cond_wait (&cond, &__aio_requests_mutex); - else + /* We have to convert the relative timeout value into an + absolute time value with pthread_cond_timedwait expects. */ + struct timeval now; + struct timespec abstime; + + __gettimeofday (&now, NULL); + abstime.tv_nsec = timeout->tv_nsec + now.tv_usec * 1000; + abstime.tv_sec = timeout->tv_sec + now.tv_sec; + if (abstime.tv_nsec >= 1000000000) { - /* We have to convert the relative timeout value into an - absolute time value with pthread_cond_timedwait expects. */ - struct timeval now; - struct timespec abstime; - - __gettimeofday (&now, NULL); - abstime.tv_nsec = timeout->tv_nsec + now.tv_usec * 1000; - abstime.tv_sec = timeout->tv_sec + now.tv_sec; - if (abstime.tv_nsec >= 1000000000) - { - abstime.tv_nsec -= 1000000000; - abstime.tv_sec += 1; - } - - result = pthread_cond_timedwait (&cond, &__aio_requests_mutex, - &abstime); + abstime.tv_nsec -= 1000000000; + abstime.tv_sec += 1; } + + result = pthread_cond_timedwait (&cond, &__aio_requests_mutex, + &abstime); } - /* Now remove the entry in the waiting list for all requests - which didn't terminate. */ - while (cnt-- > 0) - if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS) - { - struct waitlist **listp; + /* Now it's time to restore the cancellation state. */ + pthread_setcancelstate (oldstate, NULL); + } - assert (requestlist[cnt] != NULL); + /* Now remove the entry in the waiting list for all requests + which didn't terminate. */ + while (cnt-- > 0) + if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS) + { + struct waitlist **listp; - /* There is the chance that we cannot find our entry anymore. - This could happen if the request terminated and restarted - again. */ - listp = &requestlist[cnt]->waiting; - while (*listp != NULL && *listp != &waitlist[cnt]) - listp = &(*listp)->next; + assert (requestlist[cnt] != NULL); - if (*listp != NULL) - *listp = (*listp)->next; - } + /* There is the chance that we cannot find our entry anymore. This + could happen if the request terminated and restarted again. */ + listp = &requestlist[cnt]->waiting; + while (*listp != NULL && *listp != &waitlist[cnt]) + listp = &(*listp)->next; - /* Now it's time to restore the cancelation state. */ - pthread_setcancelstate (oldstate, NULL); + if (*listp != NULL) + *listp = (*listp)->next; + } - /* Release the conditional variable. */ - if (__builtin_expect (pthread_cond_destroy (&cond) != 0, 0)) - /* This must never happen. */ - abort (); + /* Release the conditional variable. */ + if (__builtin_expect (pthread_cond_destroy (&cond) != 0, 0)) + /* This must never happen. */ + abort (); - if (result != 0) - { - /* An error occurred. Possibly it's EINTR. We have to translate - the timeout error report of `pthread_cond_timedwait' to the - form expected from `aio_suspend'. */ - if (result == ETIMEDOUT) - __set_errno (EAGAIN); + if (result != 0) + { + /* An error occurred. Possibly it's EINTR. We have to translate + the timeout error report of `pthread_cond_timedwait' to the + form expected from `aio_suspend'. */ + if (result == ETIMEDOUT) + __set_errno (EAGAIN); - result = -1; - } + result = -1; } /* Release the mutex. */ |