diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-07-27 09:43:12 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-07-27 09:43:12 +0000 |
commit | 92806ee99d2e2d93b3e5ed39a0932dbefb58c725 (patch) | |
tree | 17a0e3e6158ba49ff8c459c2b8255f058da4d4ca /rt/aio_misc.c | |
parent | 950c1194b1506c8274aaa19da5e1076a93a152b8 (diff) | |
download | glibc-92806ee99d2e2d93b3e5ed39a0932dbefb58c725.tar.gz |
Update.
2000-07-26 Andreas Jaeger <aj@suse.de>
* rt/tst-aio.c: Add tests for aio_fsync and aio_cancel.
(do_wait): Test requests with aio_return.
(do_test): Change callers of do_wait.
2000-07-27 Ulrich Drepper <drepper@redhat.com>
* rt/aio_misc.c (__aio_remove_request): New function. Handle removing
from request list. Don't do the list handling here, call
__aio_remove_request.
* rt/aio_misc.h: Add prototype for __aio_remove_request.
* rt/aio_cancel.c: Don't assume __aio_find_req_fd succeeds since the
request might already be processed. Don't do the list handling
here, call __aio_remove_request.
* rt/aio_misc.c: Don't depend on aio_reqprio field for LIO_SYNC and
LIO_DSYNC.
* rt/aio_misc.c: Add comment explaining why writer memory barriers
are missing.
Diffstat (limited to 'rt/aio_misc.c')
-rw-r--r-- | rt/aio_misc.c | 99 |
1 files changed, 73 insertions, 26 deletions
diff --git a/rt/aio_misc.c b/rt/aio_misc.c index a9fe3591c5..af3e90f881 100644 --- a/rt/aio_misc.c +++ b/rt/aio_misc.c @@ -205,6 +205,64 @@ __aio_find_req_fd (int fildes) } +void +internal_function +__aio_remove_request (struct requestlist *last, struct requestlist *req, + int all) +{ + if (last != NULL) + last->next_prio = req->next_prio; + else + { + if (all || req->next_prio == NULL) + { + if (req->last_fd != NULL) + req->last_fd->next_fd = req->next_fd; + else + requests = req->next_fd; + if (req->next_fd != NULL) + req->next_fd->last_fd = req->last_fd; + } + else + { + if (req->last_fd != NULL) + req->last_fd->next_fd = req->next_prio; + else + requests = req->next_prio; + + if (req->next_fd != NULL) + req->next_fd->last_fd = req->next_prio; + + req->next_prio->last_fd = req->last_fd; + req->next_prio->next_fd = req->next_fd; + + /* Mark this entry as runnable. */ + req->next_prio->running = yes; + } + + if (req->running == yes) + { + struct requestlist *runp = runlist; + + last = NULL; + while (runp != NULL) + { + if (runp == req) + { + if (last == NULL) + runlist = runp->next_run; + else + last->next_run = runp->next_run; + break; + } + last = runp; + runp = runp->next_run; + } + } + } +} + + /* The thread handler. */ static void *handle_fildes_io (void *arg); @@ -246,8 +304,10 @@ __aio_enqueue_request (aiocb_union *aiocbp, int operation) struct requestlist *last, *runp, *newp; int running = no; - if (aiocbp->aiocb.aio_reqprio < 0 - || aiocbp->aiocb.aio_reqprio > AIO_PRIO_DELTA_MAX) + if (operation == LIO_SYNC || operation == LIO_DSYNC) + aiocbp->aiocb.aio_reqprio = 0; + else if (aiocbp->aiocb.aio_reqprio < 0 + || aiocbp->aiocb.aio_reqprio > AIO_PRIO_DELTA_MAX) { /* Invalid priority value. */ __set_errno (EINVAL); @@ -507,6 +567,14 @@ handle_fildes_io (void *arg) /* Get the mutex. */ pthread_mutex_lock (&__aio_requests_mutex); + /* In theory we would need here a write memory barrier since the + callers test using aio_error() whether the request finished + and once this value != EINPROGRESS the field __return_value + must be committed to memory. + + But since the pthread_mutex_lock call involves write memory + barriers as well it is not necessary. */ + if (aiocbp->aiocb.__return_value == -1) aiocbp->aiocb.__error_code = errno; else @@ -517,30 +585,9 @@ handle_fildes_io (void *arg) __aio_notify (runp); /* Now dequeue the current request. */ - if (runp->next_prio == NULL) - { - /* No outstanding request for this descriptor. Remove this - descriptor from the list. */ - if (runp->next_fd != NULL) - runp->next_fd->last_fd = runp->last_fd; - if (runp->last_fd != NULL) - runp->last_fd->next_fd = runp->next_fd; - else - requests = runp->next_fd; - } - else - { - runp->next_prio->last_fd = runp->last_fd; - runp->next_prio->next_fd = runp->next_fd; - runp->next_prio->running = yes; - if (runp->next_fd != NULL) - runp->next_fd->last_fd = runp->next_prio; - if (runp->last_fd != NULL) - runp->last_fd->next_fd = runp->next_prio; - else - requests = runp->next_prio; - add_request_to_runlist (runp->next_prio); - } + __aio_remove_request (NULL, runp, 0); + if (runp->next_prio != NULL) + add_request_to_runlist (runp->next_prio); /* Free the old element. */ __aio_free_request (runp); |