diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-04-11 09:51:01 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-04-11 09:51:01 +0000 |
commit | b9337b6a58501fcbae612a86d4219a8db2c5c1ff (patch) | |
tree | d458174e8585513835df7a2a11985532dec21b03 /rt/aio_suspend.c | |
parent | e7993f207c226a07125718de0feef8ac652c6696 (diff) | |
download | glibc-b9337b6a58501fcbae612a86d4219a8db2c5c1ff.zip glibc-b9337b6a58501fcbae612a86d4219a8db2c5c1ff.tar.gz glibc-b9337b6a58501fcbae612a86d4219a8db2c5c1ff.tar.bz2 |
Update.
1998-04-11 09:33 Ulrich Drepper <drepper@cygnus.com>
* Makeconfig (rtobjdir): New variable.
(rpath-link): Add rtobjdir and thread directory, if available.
* test-skeleton.c: Add support to remove temporary files.
Always define test_dir. Improve message about expected signal.
* rt/Makefile (tests): Add tst-aio.
Add rules for tst-aio to be linked with librt and thread library.
* rt/aio_misc.c: Correct fundamental bugs.
* rt/aio_suspend.c: Correct bug in test for available request.
Initialize conditional variable.
* rt/lio_listio.c: Initialize conditional variable.
* rt/lio_listio64.c: Likewise.
* rt/tst-aio.c: New file.
* sysdeps/libm-ieee754/s_signgam.c: Undo last change.
* sysdeps/libm-ieee754/w_gamma.c: Likewise. Adopt for ISO C 9x.
* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
* sysdeps/libm-ieee754/w_gammal.c: Likewise.
* sysdeps/libm-ieee754/w_lgamma.c: Likewise.
* sysdeps/libm-ieee754/w_lgammaf.c: Likewise.
* sysdeps/libm-ieee754/w_lgammal.c: Likewise.
1998-04-11 14:49 Mark Kettenis <kettenis@landau.phys.uva.nl>
* posix/regex.c [_LIBC] (__re_syntax_options): Initialize to 0.
* elf/dl-load.c (open_path): Use correct name for test whether
directory in load path exists.
* sysdeps/libm-ieee754/s_expm1.c: Remove variable one.
* sysdeps/libm-ieee754/e_pow.c: Fix typo.
Patches by Tom Rini <trini@kernel.crashing.org>.
* wcsmbs/wcstof_l.c: Declare ____wcstoull_l_internal.
* wcsmbs/wcstod_l.c: Likewise.
* wcsmbs/wcstold_l.c: Likewise.
Diffstat (limited to 'rt/aio_suspend.c')
-rw-r--r-- | rt/aio_suspend.c | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/rt/aio_suspend.c b/rt/aio_suspend.c index 6123b7b..ca16342 100644 --- a/rt/aio_suspend.c +++ b/rt/aio_suspend.c @@ -1,5 +1,5 @@ /* Suspend until termination of a requests. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -40,40 +40,42 @@ aio_suspend (list, nent, timeout) int nent; const struct timespec *timeout; { - pthread_cond_t cond; struct waitlist waitlist[nent]; struct requestlist *requestlist[nent]; + pthread_cond_t cond; int cnt; int result = 0; + int dummy; + int none = 1; /* Request the mutex. */ pthread_mutex_lock (&__aio_requests_mutex); - /* First look whether there is already a terminated request. */ + /* There is not yet a finished request. Signal the request that + we are working for it. */ for (cnt = 0; cnt < nent; ++cnt) - if (list[cnt] != NULL && list[cnt]->__error_code != EINPROGRESS) - break; + if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS) + { + requestlist[cnt] = __aio_find_req ((aiocb_union *) list[cnt]); + + if (requestlist[cnt] != NULL) + { + waitlist[cnt].cond = &cond; + waitlist[cnt].next = requestlist[cnt]->waiting; + waitlist[cnt].counterp = &dummy; + waitlist[cnt].sigevp = NULL; + requestlist[cnt]->waiting = &waitlist[cnt]; + none = 0; + } + } - if (cnt == nent) + /* If there is a not finished request wait for it. */ + if (!none) { int oldstate; - /* There is not yet a finished request. Signal the request that - we are working for it. */ - for (cnt = 0; cnt < nent; ++cnt) - if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS) - { - requestlist[cnt] = __aio_find_req ((aiocb_union *) list[cnt]); - - if (requestlist[cnt] != NULL) - { - waitlist[cnt].cond = &cond; - waitlist[cnt].next = requestlist[cnt]->waiting; - waitlist[cnt].counterp = NULL; - waitlist[cnt].sigevp = NULL; - requestlist[cnt]->waiting = &waitlist[cnt]; - } - } + /* Initialize the conditional variable. */ + pthread_cond_init (&cond, NULL); /* Since `pthread_cond_wait'/`pthread_cond_timedwait' are cancelation points we must be careful. We added entries to the waiting lists @@ -87,7 +89,7 @@ aio_suspend (list, nent, timeout) timeout); /* Now remove the entry in the waiting list for all requests - which didn't terminate */ + which didn't terminate. */ for (cnt = 0; cnt < nent; ++cnt) if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS && requestlist[cnt] != NULL) @@ -107,6 +109,11 @@ aio_suspend (list, nent, timeout) /* Now it's time to restore the cancelation state. */ pthread_setcancelstate (oldstate, NULL); + /* Release the conditional variable. */ + if (pthread_cond_destroy (&cond) != 0) + /* This must never happen. */ + abort (); + if (result != 0) { /* An error occurred. Possibly it's EINTR. We have to translate |