[threadpool-ms-io] Rework socket removal job cancellation
authorLudovic Henry <ludovic.henry@xamarin.com>
Sat, 20 Jun 2015 20:08:38 +0000 (17:08 -0300)
committerLudovic Henry <ludovic.henry@xamarin.com>
Mon, 22 Jun 2015 17:29:30 +0000 (14:29 -0300)
mono/metadata/threadpool-ms-io.c

index 2da493f063be80ecbfd4a1a6735a8fd8ebe4003d..24500981c39400d846bfeb487b0b1cd69e071b40 100644 (file)
@@ -591,25 +591,22 @@ mono_threadpool_ms_io_remove_socket (int fd)
        mono_mutex_unlock (&threadpool_io->updates_lock);
        mono_mutex_unlock (&threadpool_io->states_lock);
 
-       while (list) {
-               MonoSocketAsyncResult *sockares, *sockares2;
+       for (; list; list = mono_mlist_remove_item (list, list)) {
+               MonoSocketAsyncResult *sockares = (MonoSocketAsyncResult*) mono_mlist_get_data (list);
 
-               sockares = (MonoSocketAsyncResult*) mono_mlist_get_data (list);
-               if (sockares->operation == AIO_OP_RECEIVE)
+               if (!sockares)
+                       continue;
+
+               switch (sockares->operation) {
+               case AIO_OP_RECEIVE:
                        sockares->operation = AIO_OP_RECV_JUST_CALLBACK;
-               else if (sockares->operation == AIO_OP_SEND)
+                       break;
+               case AIO_OP_SEND:
                        sockares->operation = AIO_OP_SEND_JUST_CALLBACK;
-
-               sockares2 = get_sockares_for_event (&list, MONO_POLLIN);
-               if (sockares2)
-                       mono_threadpool_ms_enqueue_work_item (((MonoObject*) sockares2)->vtable->domain, (MonoObject*) sockares2);
-
-               if (!list)
                        break;
+               }
 
-               sockares2 = get_sockares_for_event (&list, MONO_POLLOUT);
-               if (sockares2)
-                       mono_threadpool_ms_enqueue_work_item (((MonoObject*) sockares2)->vtable->domain, (MonoObject*) sockares2);
+               mono_threadpool_ms_enqueue_work_item (((MonoObject*) sockares)->vtable->domain, (MonoObject*) sockares);
        }
 }