aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-07-27 09:38:42 +0000
committerUlrich Drepper <drepper@redhat.com>2000-07-27 09:38:42 +0000
commit950c1194b1506c8274aaa19da5e1076a93a152b8 (patch)
treec9d3dfacaa2f1679377a49f63a8936460dade897
parentda8f38c5047cda3ecb9dcf2dc780572a44659778 (diff)
downloadglibc-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.c48
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);
}
}