/** * \file * Cooperative suspend thread helpers * * Author: * Rodrigo Kumpera (kumpera@gmail.com) * * (C) 2015 Xamarin */ #ifndef __MONO_THREADS_COOP_H__ #define __MONO_THREADS_COOP_H__ #include #include #include "checked-build.h" #include "mono-threads.h" #include "mono-threads-api.h" G_BEGIN_DECLS /* JIT specific interface */ extern volatile size_t mono_polling_required; /* Runtime consumable API */ gboolean mono_threads_is_coop_enabled (void); gboolean mono_threads_is_blocking_transition_enabled (void); /* Internal API */ void mono_threads_state_poll (void); static inline void mono_threads_safepoint (void) { if (G_UNLIKELY (mono_polling_required)) mono_threads_state_poll (); } /* * The following are used when detaching a thread. We need to pass the MonoThreadInfo* * as a paramater as the thread info TLS key is being destructed, meaning that * mono_thread_info_current_unchecked will return NULL, which would lead to a * runtime assertion error when trying to switch the state of the current thread. */ gpointer mono_threads_enter_gc_safe_region_with_info (THREAD_INFO_TYPE *info, gpointer *stackdata); #define MONO_ENTER_GC_SAFE_WITH_INFO(info) \ do { \ gpointer __gc_safe_dummy; \ gpointer __gc_safe_cookie = mono_threads_enter_gc_safe_region_with_info ((info), &__gc_safe_dummy) #define MONO_EXIT_GC_SAFE_WITH_INFO MONO_EXIT_GC_SAFE gpointer mono_threads_enter_gc_unsafe_region_with_info (THREAD_INFO_TYPE *info, gpointer *stackdata); #define MONO_ENTER_GC_UNSAFE_WITH_INFO(info) \ do { \ gpointer __gc_unsafe_dummy; \ gpointer __gc_unsafe_cookie = mono_threads_enter_gc_unsafe_region_with_info ((info), &__gc_unsafe_dummy) #define MONO_EXIT_GC_UNSAFE_WITH_INFO MONO_EXIT_GC_UNSAFE gpointer mono_threads_enter_gc_unsafe_region_unbalanced_with_info (THREAD_INFO_TYPE *info, gpointer *stackdata); G_END_DECLS #endif