2000-11-22  Ulrich Drepper  <drepper@redhat.com>

	* rt/aio_suspend.c (aio_suspend): Convert timeout value to
	absolute time for pthread_cond_timedwait call.
	Reported by Lawrence Chen <lchen@opentext.com> [libc/1930].

	* rt/Makefile (tests): Add tst-aio6.
	* rt/tst-aio6.c: New file.
This commit is contained in:
Ulrich Drepper 2000-11-23 07:07:29 +00:00
parent a95d123641
commit f14811c7c8
3 changed files with 31 additions and 5 deletions

View File

@ -1,3 +1,12 @@
2000-11-22 Ulrich Drepper <drepper@redhat.com>
* rt/aio_suspend.c (aio_suspend): Convert timeout value to
absolute time for pthread_cond_timedwait call.
Reported by Lawrence Chen <lchen@opentext.com> [libc/1930].
* rt/Makefile (tests): Add tst-aio6.
* rt/tst-aio6.c: New file.
2000-11-23 Andreas Jaeger <aj@suse.de> 2000-11-23 Andreas Jaeger <aj@suse.de>
* sysdeps/s390/bits/string.h (strncat): Fix one more typo. * sysdeps/s390/bits/string.h (strncat): Fix one more typo.

View File

@ -41,7 +41,7 @@ include ../Makeconfig
ifeq ($(have-thread-library),yes) ifeq ($(have-thread-library),yes)
tests := tst-aio tst-aio64 tst-clock tst-shm tst-timer tst-aio2 tst-aio3 \ tests := tst-aio tst-aio64 tst-clock tst-shm tst-timer tst-aio2 tst-aio3 \
tst-aio4 tst-aio5 tst-aio4 tst-aio5 tst-aio6
extra-libs := librt extra-libs := librt
extra-libs-others := $(extra-libs) extra-libs-others := $(extra-libs)

View File

@ -1,5 +1,5 @@
/* Suspend until termination of a requests. /* Suspend until termination of a requests.
Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. Copyright (C) 1997, 1998, 1999, 2000 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.
@ -20,7 +20,7 @@
/* We use an UGLY hack to prevent gcc from finding us cheating. The /* We use an UGLY hack to prevent gcc from finding us cheating. The
implementation of aio_suspend and aio_suspend64 are identical and so implementations of aio_suspend and aio_suspend64 are identical and so
we want to avoid code duplication by using aliases. But gcc sees we want to avoid code duplication by using aliases. But gcc sees
the different parameter lists and prints a warning. We define here the different parameter lists and prints a warning. We define here
a function so that aio_suspend64 has no prototype. */ a function so that aio_suspend64 has no prototype. */
@ -31,6 +31,7 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/time.h>
#include "aio_misc.h" #include "aio_misc.h"
@ -84,8 +85,24 @@ aio_suspend (list, nent, timeout)
if (timeout == NULL) if (timeout == NULL)
result = pthread_cond_wait (&cond, &__aio_requests_mutex); result = pthread_cond_wait (&cond, &__aio_requests_mutex);
else 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)
{
abstime.tv_nsec -= 1000000000;
abstime.tv_sec += 1;
}
result = pthread_cond_timedwait (&cond, &__aio_requests_mutex, result = pthread_cond_timedwait (&cond, &__aio_requests_mutex,
timeout); &abstime);
}
/* Now remove the entry in the waiting list for all requests /* Now remove the entry in the waiting list for all requests
which didn't terminate. */ which didn't terminate. */