diff options
Diffstat (limited to 'sysdeps/pthread/lio_listio.c')
-rw-r--r-- | sysdeps/pthread/lio_listio.c | 107 |
1 files changed, 22 insertions, 85 deletions
diff --git a/sysdeps/pthread/lio_listio.c b/sysdeps/pthread/lio_listio.c index c652404ae2..5b98837b0d 100644 --- a/sysdeps/pthread/lio_listio.c +++ b/sysdeps/pthread/lio_listio.c @@ -1,6 +1,5 @@ /* Enqueue and list of read or write requests. - Copyright (C) 1997,1998,1999,2000,2001,2003,2005,2006 - Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2000,2001,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -26,14 +25,11 @@ #include <stdlib.h> #include <unistd.h> -#include <aio_misc.h> +#include "aio_misc.h" #define LIO_OPCODE_BASE 0 #endif -#include <shlib-compat.h> - - /* We need this special structure to handle asynchronous I/O. */ struct async_waitlist { @@ -43,22 +39,12 @@ struct async_waitlist }; -/* The code in glibc 2.1 to glibc 2.4 issued only one event when all - requests submitted with lio_listio finished. The existing practice - is to issue events for the individual requests as well. This is - what the new code does. */ -#if SHLIB_COMPAT (librt, GLIBC_2_1, GLIBC_2_4) -# define LIO_MODE(mode) ((mode) & 127) -# define NO_INDIVIDUAL_EVENT_P(mode) ((mode) & 128) -#else -# define LIO_MODE(mode) mode -# define NO_INDIVIDUAL_EVENT_P(mode) 0 -#endif - - -static int -lio_listio_internal (int mode, struct aiocb *const list[], int nent, - struct sigevent *sig) +int +lio_listio (mode, list, nent, sig) + int mode; + struct aiocb *const list[]; + int nent; + struct sigevent *sig; { struct sigevent defsigev; struct requestlist *requests[nent]; @@ -66,6 +52,13 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, volatile int total = 0; int result = 0; + /* Check arguments. */ + if (mode != LIO_WAIT && mode != LIO_NOWAIT) + { + __set_errno (EINVAL); + return -1; + } + if (sig == NULL) { defsigev.sigev_notify = SIGEV_NONE; @@ -80,9 +73,7 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, for (cnt = 0; cnt < nent; ++cnt) if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP) { - if (NO_INDIVIDUAL_EVENT_P (mode)) - list[cnt]->aio_sigevent.sigev_notify = SIGEV_NONE; - + list[cnt]->aio_sigevent.sigev_notify = SIGEV_NONE; requests[cnt] = __aio_enqueue_request ((aiocb_union *) list[cnt], (list[cnt]->aio_lio_opcode | LIO_OPCODE_BASE)); @@ -108,7 +99,7 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, locked forever. */ pthread_mutex_unlock (&__aio_requests_mutex); - if (LIO_MODE (mode) == LIO_NOWAIT) + if (mode == LIO_NOWAIT) { #ifdef BROKEN_THREAD_SIGNALS __aio_notify_only (sig, @@ -120,13 +111,11 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, return result; } - else if (LIO_MODE (mode) == LIO_WAIT) + else if (mode == LIO_WAIT) { -#ifndef DONT_NEED_AIO_MISC_COND pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - int oldstate; -#endif struct waitlist waitlist[nent]; + int oldstate; total = 0; for (cnt = 0; cnt < nent; ++cnt) @@ -135,10 +124,7 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, if (requests[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP) { -#ifndef DONT_NEED_AIO_MISC_COND waitlist[cnt].cond = &cond; -#endif - waitlist[cnt].result = &result; waitlist[cnt].next = requests[cnt]->waiting; waitlist[cnt].counterp = &total; waitlist[cnt].sigevp = NULL; @@ -150,32 +136,21 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, } } -#ifdef DONT_NEED_AIO_MISC_COND - AIO_MISC_WAIT (result, total, NULL, 0); -#else - /* Since `pthread_cond_wait'/`pthread_cond_timedwait' are cancellation + /* Since `pthread_cond_wait'/`pthread_cond_timedwait' are cancelation points we must be careful. We added entries to the waiting lists - which we must remove. So defer cancellation for now. */ + which we must remove. So defer cancelation for now. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); while (total > 0) pthread_cond_wait (&cond, &__aio_requests_mutex); - /* Now it's time to restore the cancellation state. */ + /* 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 (); -#endif - - /* If any of the I/O requests failed, return -1 and set errno. */ - if (result != 0) - { - __set_errno (result == EINTR ? EINTR : EIO); - result = -1; - } } else { @@ -204,10 +179,7 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, if (requests[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP) { -#ifndef DONT_NEED_AIO_MISC_COND waitlist->list[cnt].cond = NULL; -#endif - waitlist->list[cnt].result = NULL; waitlist->list[cnt].next = requests[cnt]->waiting; waitlist->list[cnt].counterp = &waitlist->counter; waitlist->list[cnt].sigevp = &waitlist->sigev; @@ -229,38 +201,3 @@ lio_listio_internal (int mode, struct aiocb *const list[], int nent, return result; } - - -#if SHLIB_COMPAT (librt, GLIBC_2_1, GLIBC_2_4) -int -attribute_compat_text_section -__lio_listio_21 (int mode, struct aiocb *const list[], int nent, - struct sigevent *sig) -{ - /* Check arguments. */ - if (mode != LIO_WAIT && mode != LIO_NOWAIT) - { - __set_errno (EINVAL); - return -1; - } - - return lio_listio_internal (mode | LIO_NO_INDIVIDUAL_EVENT, list, nent, sig); -} -compat_symbol (librt, __lio_listio_21, lio_listio, GLIBC_2_1); -#endif - - -int -__lio_listio_item_notify (int mode, struct aiocb *const list[], int nent, - struct sigevent *sig) -{ - /* Check arguments. */ - if (mode != LIO_WAIT && mode != LIO_NOWAIT) - { - __set_errno (EINVAL); - return -1; - } - - return lio_listio_internal (mode, list, nent, sig); -} -versioned_symbol (librt, __lio_listio_item_notify, lio_listio, GLIBC_2_4); |