2006-11-27 Jonathan Chambers <joncham@gmail.com>
[mono.git] / mono / metadata / threadpool.c
index 612090b0cececef2c8c028a705563c1d325f1cda..f8235f1ca6d972876a3c825ab6503f3e04f696bb 100644 (file)
@@ -480,6 +480,7 @@ socket_io_poll_main (gpointer p)
                EnterCriticalSection (&data->io_lock);
                if (data->inited == 0) {
                        g_free (pfds);
+                       LeaveCriticalSection (&data->io_lock);
                        return; /* cleanup called */
                }
 
@@ -747,9 +748,12 @@ socket_io_init (SocketIOData *data)
 
        data->sock_to_state = g_hash_table_new (g_direct_hash, g_direct_equal);
 
-       if (data->epoll_disabled)
+       if (data->epoll_disabled) {
                data->new_sem = CreateSemaphore (NULL, 1, 1, NULL);
+               g_assert (data->new_sem != NULL);
+       }
        io_job_added = CreateSemaphore (NULL, 0, 0x7fffffff, NULL);
+       g_assert (io_job_added != NULL);
        InitializeCriticalSection (&io_queue_lock);
        if (data->epoll_disabled) {
                mono_thread_create (mono_get_root_domain (), socket_io_poll_main, data);
@@ -785,7 +789,9 @@ socket_io_add_poll (MonoSocketAsyncResult *state)
                data->newpfd = g_new0 (mono_pollfd, 1);
 
        EnterCriticalSection (&data->io_lock);
+       /* FIXME: 64 bit issue: handle can be a pointer on windows? */
        list = g_hash_table_lookup (data->sock_to_state, GINT_TO_POINTER (state->handle));
+       /* FIXME: GC issue: state is an object stored in a GList */
        if (list == NULL) {
                list = g_slist_alloc ();
                list->data = state;
@@ -819,6 +825,7 @@ socket_io_add_epoll (MonoSocketAsyncResult *state)
        fd = GPOINTER_TO_INT (state->handle);
        EnterCriticalSection (&data->io_lock);
        list = g_hash_table_lookup (data->sock_to_state, GINT_TO_POINTER (fd));
+       /* FIXME: GC issue: state is an object stored in a GList */
        if (list == NULL) {
                list = g_slist_alloc ();
                list->data = state;
@@ -917,6 +924,8 @@ mono_async_invoke (MonoAsyncResult *ares)
 {
        ASyncCall *ac = (ASyncCall *)ares->object_data;
        MonoThread *thread = NULL;
+       MonoObject *res, *exc = NULL;
+       MonoArray *out_args = NULL;
 
        if (ares->execution_context) {
                /* use captured ExecutionContext (if available) */
@@ -928,8 +937,10 @@ mono_async_invoke (MonoAsyncResult *ares)
        }
 
        ac->msg->exc = NULL;
-       ac->res = mono_message_invoke (ares->async_delegate, ac->msg, 
-                                      &ac->msg->exc, &ac->out_args);
+       res = mono_message_invoke (ares->async_delegate, ac->msg, &exc, &out_args);
+       MONO_OBJECT_SETREF (ac, res, res);
+       MONO_OBJECT_SETREF (ac, msg->exc, exc);
+       MONO_OBJECT_SETREF (ac, out_args, out_args);
 
        ares->completed = 1;
 
@@ -977,6 +988,7 @@ mono_thread_pool_init ()
        InitializeCriticalSection (&ares_lock);
        ares_htable = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_KEY_VALUE_GC);
        job_added = CreateSemaphore (NULL, 0, 0x7fffffff, NULL);
+       g_assert (job_added != NULL);
        GetSystemInfo (&info);
        if (g_getenv ("MONO_THREADS_PER_CPU") != NULL) {
                threads_per_cpu = atoi (g_getenv ("MONO_THREADS_PER_CPU"));
@@ -998,21 +1010,13 @@ mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg, MonoDelegate *
        MonoAsyncResult *ares;
        ASyncCall *ac;
 
-#ifdef HAVE_BOEHM_GC
-       ac = GC_MALLOC (sizeof (ASyncCall));
-#elif defined(HAVE_SGEN_GC)
-       ac = mono_object_new (mono_domain_get (), async_call_klass);
-#else
-       /* We'll leak the event if creaated... */
-       ac = g_new0 (ASyncCall, 1);
-#endif
-       ac->wait_event = 0;
+       ac = (ASyncCall*)mono_object_new (mono_domain_get (), async_call_klass);
        MONO_OBJECT_SETREF (ac, msg, msg);
        MONO_OBJECT_SETREF (ac, state, state);
 
        if (async_callback) {
                ac->cb_method = mono_get_delegate_invoke (((MonoObject *)async_callback)->vtable->klass);
-               ac->cb_target = async_callback;
+               MONO_OBJECT_SETREF (ac, cb_target, async_callback);
        }
 
        ares = mono_async_result_new (domain, NULL, ac->state, NULL, (MonoObject*)ac);
@@ -1076,6 +1080,7 @@ mono_thread_pool_finish (MonoAsyncResult *ares, MonoArray **out_args, MonoObject
        if (!ares->completed) {
                if (ares->handle == NULL) {
                        ac->wait_event = (gsize)CreateEvent (NULL, TRUE, FALSE, NULL);
+                       g_assert(ac->wait_event != 0);
                        MONO_OBJECT_SETREF (ares, handle, (MonoObject *) mono_wait_handle_new (mono_object_domain (ares), (gpointer)(gsize)ac->wait_event));
                }
                mono_monitor_exit ((MonoObject *) ares);
@@ -1106,6 +1111,7 @@ mono_thread_pool_cleanup (void)
        socket_io_cleanup (&socket_io_data);
 }
 
+/* FIXME: GC: adds managed objects to the list... */
 static void
 append_job (CRITICAL_SECTION *cs, GList **plist, gpointer ar)
 {