Merge pull request #1304 from slluis/mac-proxy-autoconfig
[mono.git] / mono / metadata / tpool-poll.c
index e03eca5248cc4c4a0f36bb374064bf2eebab1258..aa1077bf07f9db1de24f085f9bae198341f27713 100644 (file)
@@ -19,7 +19,7 @@ struct _tp_poll_data {
 typedef struct _tp_poll_data tp_poll_data;
 
 static void tp_poll_shutdown (gpointer event_data);
-static void tp_poll_modify (gpointer event_data, int fd, int operation, int events, gboolean is_new);
+static void tp_poll_modify (gpointer p, int fd, int operation, int events, gboolean is_new);
 static void tp_poll_wait (gpointer p);
 
 static gpointer
@@ -74,12 +74,18 @@ tp_poll_init (SocketIOData *data)
 }
 
 static void
-tp_poll_modify (gpointer event_data, int fd, int operation, int events, gboolean is_new)
+tp_poll_modify (gpointer p, int fd, int operation, int events, gboolean is_new)
 {
-       tp_poll_data *data = event_data;
+       SocketIOData *socket_io_data;
+       tp_poll_data *data;
        char msg [1];
        int unused;
 
+       socket_io_data = p;
+       data = socket_io_data->event_data;
+
+       mono_mutex_unlock (&socket_io_data->io_lock);
+       
        MONO_SEM_WAIT (&data->new_sem);
        INIT_POLLFD (&data->newpfd, GPOINTER_TO_INT (fd), events);
        *msg = (char) operation;
@@ -150,14 +156,11 @@ tp_poll_wait (gpointer p)
        gint maxfd = 1;
        gint allocated;
        gint i;
-       MonoInternalThread *thread;
        tp_poll_data *data;
        SocketIOData *socket_io_data = p;
        MonoPtrArray async_results;
        gint nresults;
 
-       thread = mono_thread_internal_current ();
-
        data = socket_io_data->event_data;
        allocated = INITIAL_POLLFD_SIZE;
        pfds = g_new0 (mono_pollfd, allocated);
@@ -177,8 +180,7 @@ tp_poll_wait (gpointer p)
 
                do {
                        if (nsock == -1) {
-                               if (THREAD_WANTS_A_BREAK (thread))
-                                       mono_thread_interruption_checkpoint ();
+                               check_for_interruption_critical ();
                        }
 
                        nsock = mono_poll (pfds, maxfd, -1);
@@ -268,11 +270,11 @@ tp_poll_wait (gpointer p)
                if (nsock == 0)
                        continue;
 
-               EnterCriticalSection (&socket_io_data->io_lock);
+               mono_mutex_lock (&socket_io_data->io_lock);
                if (socket_io_data->inited == 3) {
                        g_free (pfds);
                        mono_ptr_array_destroy (async_results);
-                       LeaveCriticalSection (&socket_io_data->io_lock);
+                       mono_mutex_unlock (&socket_io_data->io_lock);
                        return; /* cleanup called */
                }
 
@@ -312,7 +314,7 @@ tp_poll_wait (gpointer p)
                                        maxfd--;
                        }
                }
-               LeaveCriticalSection (&socket_io_data->io_lock);
+               mono_mutex_unlock (&socket_io_data->io_lock);
                threadpool_append_jobs (&async_io_tp, (MonoObject **) async_results.data, nresults);
                mono_ptr_array_clear (async_results);
        }