diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-11-23 07:07:29 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-11-23 07:07:29 +0000 |
commit | f14811c7c85d645b1bfda41eb9dccfdd2af058fe (patch) | |
tree | 859cd2c92cc3c106ddbabc4e73609d000d8c36a7 /rt | |
parent | a95d12364158e54923aa2f585b29b99b98c15916 (diff) | |
download | glibc-f14811c7c85d645b1bfda41eb9dccfdd2af058fe.tar.gz |
Update.
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.
Diffstat (limited to 'rt')
-rw-r--r-- | rt/Makefile | 2 | ||||
-rw-r--r-- | rt/aio_suspend.c | 25 |
2 files changed, 22 insertions, 5 deletions
diff --git a/rt/Makefile b/rt/Makefile index 2be7de381d..e7014f256d 100644 --- a/rt/Makefile +++ b/rt/Makefile @@ -41,7 +41,7 @@ include ../Makeconfig ifeq ($(have-thread-library),yes) 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-others := $(extra-libs) diff --git a/rt/aio_suspend.c b/rt/aio_suspend.c index ca8e5581dc..5ac2d23ffb 100644 --- a/rt/aio_suspend.c +++ b/rt/aio_suspend.c @@ -1,5 +1,5 @@ /* 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. 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 - 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 the different parameter lists and prints a warning. We define here a function so that aio_suspend64 has no prototype. */ @@ -31,6 +31,7 @@ #include <errno.h> #include <stdlib.h> +#include <sys/time.h> #include "aio_misc.h" @@ -84,8 +85,24 @@ aio_suspend (list, nent, timeout) if (timeout == NULL) result = pthread_cond_wait (&cond, &__aio_requests_mutex); else - result = pthread_cond_timedwait (&cond, &__aio_requests_mutex, - timeout); + { + /* 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); + } /* Now remove the entry in the waiting list for all requests which didn't terminate. */ |