2009-08-12 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / metadata / threadpool.c
index 7f88a068c0b21dc465bad6cb06bd3c1b69e4d1a2..4bc6db7340703b4560481c0c0e3ce0c9114661ed 100644 (file)
@@ -835,7 +835,7 @@ socket_io_add_poll (MonoSocketAsyncResult *state)
        MonoMList *list;
        SocketIOData *data = &socket_io_data;
 
-#if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD6) || defined(PLATFORM_WIN32) || defined(PLATFORM_SOLARIS)
+#if defined(PLATFORM_MACOSX) || defined(PLATFORM_BSD) || defined(PLATFORM_WIN32) || defined(PLATFORM_SOLARIS)
        /* select() for connect() does not work well on the Mac. Bug #75436. */
        /* Bug #77637 for the BSD 6 case */
        /* Bug #78888 for the Windows case */
@@ -987,8 +987,8 @@ mono_async_invoke (MonoAsyncResult *ares)
        if (ares->execution_context) {
                /* use captured ExecutionContext (if available) */
                thread = mono_thread_current ();
-               MONO_OBJECT_SETREF (ares, original_context, thread->execution_context);
-               MONO_OBJECT_SETREF (thread, execution_context, ares->execution_context);
+               MONO_OBJECT_SETREF (ares, original_context, mono_thread_get_execution_context ());
+               mono_thread_set_execution_context (ares->execution_context);
        } else {
                ares->original_context = NULL;
        }
@@ -1014,7 +1014,7 @@ mono_async_invoke (MonoAsyncResult *ares)
 
        /* restore original thread execution context if flow isn't suppressed, i.e. non null */
        if (ares->original_context) {
-               MONO_OBJECT_SETREF (thread, execution_context, ares->original_context);
+               mono_thread_set_execution_context (ares->original_context);
                ares->original_context = NULL;
        }
 
@@ -1116,6 +1116,9 @@ mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg, MonoDelegate *
        ares = mono_async_result_new (domain, NULL, ac->state, NULL, (MonoObject*)ac);
        MONO_OBJECT_SETREF (ares, async_delegate, target);
 
+       if (domain->state == MONO_APPDOMAIN_UNLOADED || domain->state == MONO_APPDOMAIN_UNLOADING)
+               return ares;
+
        EnterCriticalSection (&ares_lock);
        mono_g_hash_table_insert (ares_htable, ares, ares);
        LeaveCriticalSection (&ares_lock);
@@ -1224,14 +1227,14 @@ append_job (CRITICAL_SECTION *cs, TPQueue *list, MonoObject *ar)
        }
        if (!list->array) {
                MONO_GC_REGISTER_ROOT (list->array);
-               list->array = mono_array_new (mono_get_root_domain (), mono_defaults.object_class, 16);
+               list->array = mono_array_new_cached (mono_get_root_domain (), mono_defaults.object_class, 16);
        } else {
                int count = list->next_elem - list->first_elem;
                /* slide the array or create a larger one if it's full */
                if (list->first_elem) {
                        mono_array_memcpy_refs (list->array, 0, list->array, list->first_elem, count);
                } else {
-                       MonoArray *newa = mono_array_new (mono_get_root_domain (), mono_defaults.object_class, mono_array_length (list->array) * 2);
+                       MonoArray *newa = mono_array_new_cached (mono_get_root_domain (), mono_defaults.object_class, mono_array_length (list->array) * 2);
                        mono_array_memcpy_refs (newa, 0, list->array, list->first_elem, count);
                        list->array = newa;
                }
@@ -1331,11 +1334,12 @@ dequeue_job (CRITICAL_SECTION *cs, TPQueue *list)
                return NULL;
        }
        ar = mono_array_get (list->array, MonoObject*, list->first_elem);
+       mono_array_setref (list->array, list->first_elem, NULL);
        list->first_elem++;
        count = list->next_elem - list->first_elem;
        /* reduce the size of the array if it's mostly empty */
        if (mono_array_length (list->array) > 16 && count < (mono_array_length (list->array) / 3)) {
-               MonoArray *newa = mono_array_new (mono_get_root_domain (), mono_defaults.object_class, mono_array_length (list->array) / 2);
+               MonoArray *newa = mono_array_new_cached (mono_get_root_domain (), mono_defaults.object_class, mono_array_length (list->array) / 2);
                mono_array_memcpy_refs (newa, 0, list->array, list->first_elem, count);
                list->array = newa;
                list->first_elem = 0;