X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fthreads.c;h=8acb6f5efafa01e91926c3b54cdc1dd87f3849a9;hb=56ad07531d611d0957134c6d60885f1f8b62845f;hp=c7efeafec3a01c3bf5c7ef37b745d24479584a08;hpb=73b9bd1ddda5da41f7baaf95b2e8464169255d70;p=mono.git diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index c7efeafec3a..8acb6f5efaf 100644 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -257,8 +257,14 @@ mono_thread_get_tls_key (void) gint32 mono_thread_get_tls_offset (void) { - int offset; + int offset = -1; + +#ifdef HOST_WIN32 + if (current_object_key) + offset = current_object_key; +#else MONO_THREAD_VAR_OFFSET (tls_current_object,offset); +#endif return offset; } @@ -744,7 +750,8 @@ static guint32 WINAPI start_wrapper_internal(void *data) g_assert (start_delegate != NULL); args [0] = start_arg; /* we may want to handle the exception here. See comment below on unhandled exceptions */ - mono_runtime_delegate_invoke (start_delegate, args, NULL); + mono_runtime_delegate_invoke_checked (start_delegate, args, &error); + mono_error_raise_exception (&error); /* FIXME don't raise here */ } /* If the thread calls ExitThread at all, this remaining code @@ -882,9 +889,9 @@ create_thread (MonoThread *thread, MonoInternalThread *internal, StartInfo *star */ THREAD_DEBUG (g_message ("%s: (%"G_GSIZE_FORMAT") waiting for thread %p (%"G_GSIZE_FORMAT") to start", __func__, mono_native_thread_id_get (), internal, (gsize)internal->tid)); - MONO_PREPARE_BLOCKING; + MONO_ENTER_GC_SAFE; WaitForSingleObjectEx (internal->start_notify, INFINITE, FALSE); - MONO_FINISH_BLOCKING; + MONO_EXIT_GC_SAFE; CloseHandle (internal->start_notify); internal->start_notify = NULL; @@ -1560,9 +1567,9 @@ ves_icall_System_Threading_Thread_Join_internal(MonoThread *this_obj, int ms) mono_thread_set_state (cur_thread, ThreadState_WaitSleepJoin); - MONO_PREPARE_BLOCKING; + MONO_ENTER_GC_SAFE; ret=WaitForSingleObjectEx (handle, ms, TRUE); - MONO_FINISH_BLOCKING; + MONO_EXIT_GC_SAFE; mono_thread_clr_state (cur_thread, ThreadState_WaitSleepJoin); @@ -1588,12 +1595,12 @@ mono_wait_uninterrupted (MonoInternalThread *thread, gboolean multiple, guint32 start = (ms == -1) ? 0 : mono_100ns_ticks (); do { - MONO_PREPARE_BLOCKING; + MONO_ENTER_GC_SAFE; if (multiple) ret = WaitForMultipleObjectsEx (numhandles, handles, waitall, wait, alertable); else ret = WaitForSingleObjectEx (handles [0], ms, alertable); - MONO_FINISH_BLOCKING; + MONO_EXIT_GC_SAFE; if (ret != WAIT_IO_COMPLETION) break; @@ -1738,9 +1745,9 @@ ves_icall_System_Threading_WaitHandle_SignalAndWait_Internal (HANDLE toSignal, H mono_thread_set_state (thread, ThreadState_WaitSleepJoin); - MONO_PREPARE_BLOCKING; + MONO_ENTER_GC_SAFE; ret = SignalObjectAndWait (toSignal, toWait, ms, TRUE); - MONO_FINISH_BLOCKING; + MONO_EXIT_GC_SAFE; mono_thread_clr_state (thread, ThreadState_WaitSleepJoin); @@ -2909,9 +2916,9 @@ static void wait_for_tids (struct wait_data *wait, guint32 timeout) THREAD_DEBUG (g_message("%s: %d threads to wait for in this batch", __func__, wait->num)); - MONO_PREPARE_BLOCKING; + MONO_ENTER_GC_SAFE; ret=WaitForMultipleObjectsEx(wait->num, wait->handles, TRUE, timeout, TRUE); - MONO_FINISH_BLOCKING; + MONO_EXIT_GC_SAFE; if(ret==WAIT_FAILED) { /* See the comment in build_wait_tids() */ @@ -2972,9 +2979,9 @@ static void wait_for_tids_or_state_change (struct wait_data *wait, guint32 timeo count++; } - MONO_PREPARE_BLOCKING; + MONO_ENTER_GC_SAFE; ret=WaitForMultipleObjectsEx (count, wait->handles, FALSE, timeout, TRUE); - MONO_FINISH_BLOCKING; + MONO_EXIT_GC_SAFE; if(ret==WAIT_FAILED) { /* See the comment in build_wait_tids() */ @@ -3081,9 +3088,8 @@ remove_and_abort_threads (gpointer key, gpointer value, gpointer user) if (handle == NULL) return FALSE; - /* printf ("A: %d\n", wait->num); */ - wait->handles[wait->num]=thread->handle; - wait->threads[wait->num]=thread; + wait->handles[wait->num] = handle; + wait->threads[wait->num] = thread; wait->num++; THREAD_DEBUG (g_print ("%s: Aborting id: %"G_GSIZE_FORMAT"\n", __func__, (gsize)thread->tid));