2003-01-02  Ulrich Drepper  <drepper@redhat.com>

	* sysdeps/pthread/aio_suspend.c (aio_suspend): Simplify by
	removing 'any' variable.
This commit is contained in:
Ulrich Drepper 2003-01-03 06:46:11 +00:00
parent bf293afeca
commit 8ee8768079
2 changed files with 59 additions and 62 deletions

View File

@ -1,3 +1,8 @@
2003-01-02 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/aio_suspend.c (aio_suspend): Simplify by
removing 'any' variable.
2003-01-02 Jakub Jelinek <jakub@redhat.com> 2003-01-02 Jakub Jelinek <jakub@redhat.com>
* sysdeps/unix/sysv/linux/arm/sigaction.c (__sigaction, * sysdeps/unix/sysv/linux/arm/sigaction.c (__sigaction,

View File

@ -1,5 +1,5 @@
/* Suspend until termination of a requests. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -31,7 +31,6 @@
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/time.h> #include <sys/time.h>
@ -50,7 +49,6 @@ aio_suspend (list, nent, timeout)
int cnt; int cnt;
int result = 0; int result = 0;
int dummy; int dummy;
bool any = false;
/* Request the mutex. */ /* Request the mutex. */
pthread_mutex_lock (&__aio_requests_mutex); pthread_mutex_lock (&__aio_requests_mutex);
@ -72,7 +70,6 @@ aio_suspend (list, nent, timeout)
waitlist[cnt].sigevp = NULL; waitlist[cnt].sigevp = NULL;
waitlist[cnt].caller_pid = 0; /* Not needed. */ waitlist[cnt].caller_pid = 0; /* Not needed. */
requestlist[cnt]->waiting = &waitlist[cnt]; requestlist[cnt]->waiting = &waitlist[cnt];
any = true;
} }
else else
/* We will never suspend. */ /* We will never suspend. */
@ -83,9 +80,9 @@ aio_suspend (list, nent, timeout)
break; break;
} }
/* If there is no finished request wait for it. In any case we have
to dequeue the requests if we enqueued them. */ /* Only if none of the entries is NULL or finished to be wait. */
if (any) if (cnt == nent)
{ {
int oldstate; int oldstate;
@ -94,70 +91,65 @@ aio_suspend (list, nent, timeout)
which we must remove. So defer cancelation for now. */ which we must remove. So defer cancelation for now. */
pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate);
/* Only if none of the entries is NULL or finished to be wait. */ if (timeout == NULL)
if (cnt == nent) result = pthread_cond_wait (&cond, &__aio_requests_mutex);
else
{ {
if (timeout == NULL) /* We have to convert the relative timeout value into an
result = pthread_cond_wait (&cond, &__aio_requests_mutex); absolute time value with pthread_cond_timedwait expects. */
else 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 abstime.tv_nsec -= 1000000000;
absolute time value with pthread_cond_timedwait expects. */ abstime.tv_sec += 1;
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);
} }
result = pthread_cond_timedwait (&cond, &__aio_requests_mutex,
&abstime);
} }
/* Now remove the entry in the waiting list for all requests /* Now it's time to restore the cancellation state. */
which didn't terminate. */
while (cnt-- > 0)
if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS)
{
struct waitlist **listp;
assert (requestlist[cnt] != NULL);
/* 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;
if (*listp != NULL)
*listp = (*listp)->next;
}
/* Now it's time to restore the cancelation state. */
pthread_setcancelstate (oldstate, NULL); pthread_setcancelstate (oldstate, NULL);
}
/* Release the conditional variable. */ /* Now remove the entry in the waiting list for all requests
if (__builtin_expect (pthread_cond_destroy (&cond) != 0, 0)) which didn't terminate. */
/* This must never happen. */ while (cnt-- > 0)
abort (); if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS)
{
struct waitlist **listp;
if (result != 0) assert (requestlist[cnt] != NULL);
{
/* 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; /* 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;
if (*listp != NULL)
*listp = (*listp)->next;
}
/* 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);
result = -1;
} }
/* Release the mutex. */ /* Release the mutex. */