From b9337b6a58501fcbae612a86d4219a8db2c5c1ff Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 11 Apr 1998 09:51:01 +0000 Subject: Update. 1998-04-11 09:33 Ulrich Drepper * 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 * 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 . * wcsmbs/wcstof_l.c: Declare ____wcstoull_l_internal. * wcsmbs/wcstod_l.c: Likewise. * wcsmbs/wcstold_l.c: Likewise. --- rt/aio_suspend.c | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) (limited to 'rt/aio_suspend.c') 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 , 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 -- cgit v1.1