diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-07-27 09:38:42 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-07-27 09:38:42 +0000 |
commit | 950c1194b1506c8274aaa19da5e1076a93a152b8 (patch) | |
tree | c9d3dfacaa2f1679377a49f63a8936460dade897 | |
parent | da8f38c5047cda3ecb9dcf2dc780572a44659778 (diff) | |
download | glibc-950c1194b1506c8274aaa19da5e1076a93a152b8.zip glibc-950c1194b1506c8274aaa19da5e1076a93a152b8.tar.gz glibc-950c1194b1506c8274aaa19da5e1076a93a152b8.tar.bz2 |
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.
-rw-r--r-- | rt/aio_cancel.c | 48 |
1 files changed, 13 insertions, 35 deletions
diff --git a/rt/aio_cancel.c b/rt/aio_cancel.c index dcb7d5e..48e647a 100644 --- a/rt/aio_cancel.c +++ b/rt/aio_cancel.c @@ -56,16 +56,20 @@ aio_cancel (fildes, aiocbp) req = __aio_find_req_fd (fildes); + if (req == NULL) + { + not_found: + pthread_mutex_unlock (&__aio_requests_mutex); + __set_errno (EINVAL); + return -1; + } + while (req->aiocbp != (aiocb_union *) aiocbp) { last = req; req = req->next_prio; if (req == NULL) - { - pthread_mutex_unlock (&__aio_requests_mutex); - __set_errno (EINVAL); - return -1; - } + goto not_found; } /* Don't remove the entry if a thread is already working on it. */ @@ -74,28 +78,7 @@ aio_cancel (fildes, aiocbp) else if (req->running == yes) { /* We can remove the entry. */ - if (last != NULL) - last->next_prio = req->next_prio; - else - if (req->next_prio == NULL) - { - if (req->last_fd != NULL) - req->last_fd->next_fd = 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; - 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; - } + __aio_remove_request (last, req, 0); result = AIO_CANCELED; } @@ -122,15 +105,10 @@ aio_cancel (fildes, aiocbp) result = AIO_NOTCANCELED; } else - { - /* Remove entry from the file descriptor list. */ - if (req->last_fd != NULL) - req->last_fd->next_fd = req->next_fd; - if (req->next_fd != NULL) - req->next_fd->last_fd = req->last_fd; + result = AIO_CANCELED; - result = AIO_CANCELED; - } + /* We can remove the entry. */ + __aio_remove_request (NULL, req, 1); } } |