/* The return value is only valid until a matching mono_thread_info_resume is called */ static MonoThreadInfo* mono_thread_info_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_kernel, const char **error_condition) { MonoThreadHazardPointers *hp = mono_hazard_pointer_get (); MonoThreadInfo *info = mono_thread_info_lookup (tid); /*info on HP1*/ if (!info) { *error_condition = "Thread not found"; return NULL; } MONO_SEM_WAIT_UNITERRUPTIBLE (&info->suspend_semaphore); /*thread is on the process of detaching*/ if (mono_thread_info_run_state (info) > STATE_RUNNING) { mono_hazard_pointer_clear (hp, 1); *error_condition = "Thread is detaching"; return NULL; } THREADS_DEBUG ("suspend %x IN COUNT %d\n", tid, info->suspend_count); if (info->suspend_count) { ++info->suspend_count; mono_hazard_pointer_clear (hp, 1); MONO_SEM_POST (&info->suspend_semaphore); return info; } if (!mono_threads_core_suspend (info)) { MONO_SEM_POST (&info->suspend_semaphore); mono_hazard_pointer_clear (hp, 1); *error_condition = "Could not suspend thread"; return NULL; } if (interrupt_kernel) mono_threads_core_interrupt (info); ++info->suspend_count; info->thread_state |= STATE_SUSPENDED; MONO_SEM_POST (&info->suspend_semaphore); return info; }
/* The return value is only valid until a matching mono_thread_info_resume is called */ static MonoThreadInfo* mono_thread_info_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_kernel) { MonoThreadHazardPointers *hp = mono_hazard_pointer_get (); MonoThreadInfo *info = mono_thread_info_lookup (tid); /*info on HP1*/ if (!info) return NULL; EnterCriticalSection (&info->suspend_lock); /*thread is on the process of detaching*/ if (mono_thread_info_run_state (info) > STATE_RUNNING) { mono_hazard_pointer_clear (hp, 1); return NULL; } THREADS_DEBUG ("suspend %x IN COUNT %d\n", tid, info->suspend_count); if (info->suspend_count) { ++info->suspend_count; mono_hazard_pointer_clear (hp, 1); LeaveCriticalSection (&info->suspend_lock); return info; } if (!mono_threads_core_suspend (info)) { LeaveCriticalSection (&info->suspend_lock); mono_hazard_pointer_clear (hp, 1); return NULL; } if (interrupt_kernel) mono_threads_core_interrupt (info); ++info->suspend_count; info->thread_state |= STATE_SUSPENDED; LeaveCriticalSection (&info->suspend_lock); mono_hazard_pointer_clear (hp, 1); return info; }