Merge pull request #3040 from xmcclure/debugger-step-recursive
[mono.git] / mono / utils / mono-threads-api.h
index edd71d5eebf82dcb494bbae018c845ae6c09266b..f36ec0beb813bf39430d83be8cc1889529bab591 100644 (file)
@@ -10,7 +10,9 @@
 #ifndef __MONO_THREADS_API_H__
 #define __MONO_THREADS_API_H__
 
+#include <glib.h>
 #include <mono/utils/mono-publib.h>
+
 MONO_BEGIN_DECLS
 
 /*
@@ -19,22 +21,35 @@ MONO_BEGIN_DECLS
 This API is experimental. It will eventually be required to properly use the rest of the raw-omp embedding API.
 */
 
-/* Don't use those directly, use the MONO_(BEGIN|END)_EFRAME */
 MONO_API gpointer
 mono_threads_enter_gc_unsafe_region (gpointer* stackdata);
 
 MONO_API void
 mono_threads_exit_gc_unsafe_region (gpointer cookie, gpointer* stackdata);
 
+MONO_API gpointer
+mono_threads_enter_gc_unsafe_region_unbalanced (gpointer* stackdata);
+
+MONO_API void
+mono_threads_exit_gc_unsafe_region_unbalanced (gpointer cookie, gpointer* stackdata);
+
 MONO_API void
 mono_threads_assert_gc_unsafe_region (void);
 
+
+
 MONO_API gpointer
 mono_threads_enter_gc_safe_region (gpointer *stackdata);
 
 MONO_API void
 mono_threads_exit_gc_safe_region (gpointer cookie, gpointer *stackdata);
 
+MONO_API gpointer
+mono_threads_enter_gc_safe_region_unbalanced (gpointer *stackdata);
+
+MONO_API void
+mono_threads_exit_gc_safe_region_unbalanced (gpointer cookie, gpointer *stackdata);
+
 MONO_API void
 mono_threads_assert_gc_safe_region (void);
 
@@ -48,21 +63,39 @@ http://www.mono-project.com/docs/advanced/runtime/docs/coop-suspend/#gc-unsafe-m
 #define MONO_ENTER_GC_UNSAFE   \
        do {    \
                gpointer __gc_unsafe_dummy;     \
-               gpointer __gc_unsafe_cookie = mono_threads_enter_gc_unsafe_region (&__gc_unsafe_dummy)  \
+               gpointer __gc_unsafe_cookie = mono_threads_enter_gc_unsafe_region (&__gc_unsafe_dummy)
 
 #define MONO_EXIT_GC_UNSAFE    \
                mono_threads_exit_gc_unsafe_region      (__gc_unsafe_cookie, &__gc_unsafe_dummy);       \
        } while (0)
 
+#define MONO_ENTER_GC_UNSAFE_UNBALANCED        \
+       do {    \
+               gpointer __gc_unsafe_unbalanced_dummy;  \
+               gpointer __gc_unsafe_unbalanced_cookie = mono_threads_enter_gc_unsafe_region_unbalanced (&__gc_unsafe_unbalanced_dummy)
+
+#define MONO_EXIT_GC_UNSAFE_UNBALANCED \
+               mono_threads_exit_gc_unsafe_region_unbalanced   (__gc_unsafe_unbalanced_cookie, &__gc_unsafe_unbalanced_dummy); \
+       } while (0)
+
 #define MONO_ENTER_GC_SAFE     \
        do {    \
                gpointer __gc_safe_dummy;       \
-               gpointer __gc_safe_cookie = mono_threads_enter_gc_safe_region (&__gc_safe_dummy)        \
+               gpointer __gc_safe_cookie = mono_threads_enter_gc_safe_region (&__gc_safe_dummy)
 
 #define MONO_EXIT_GC_SAFE      \
                mono_threads_exit_gc_safe_region (__gc_safe_cookie, &__gc_safe_dummy);  \
        } while (0)
 
+#define MONO_ENTER_GC_SAFE_UNBALANCED  \
+       do {    \
+               gpointer __gc_safe_unbalanced_dummy;    \
+               gpointer __gc_safe_unbalanced_cookie = mono_threads_enter_gc_safe_region_unbalanced (&__gc_safe_unbalanced_dummy)
+
+#define MONO_EXIT_GC_SAFE_UNBALANCED   \
+               mono_threads_exit_gc_safe_region_unbalanced (__gc_safe_unbalanced_cookie, &__gc_safe_unbalanced_dummy); \
+       } while (0)
+
 MONO_END_DECLS
 
 #endif /* __MONO_LOGGER_H__ */