summary refs log tree commit diff
path: root/rt
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 /rt
parentda8f38c5047cda3ecb9dcf2dc780572a44659778 (diff)
downloadglibc-950c1194b1506c8274aaa19da5e1076a93a152b8.tar.gz
glibc-950c1194b1506c8274aaa19da5e1076a93a152b8.tar.xz
glibc-950c1194b1506c8274aaa19da5e1076a93a152b8.zip
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.
Diffstat (limited to 'rt')
-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 dcb7d5ef8d..48e647a263 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);
 	}
     }