summaryrefslogtreecommitdiff
path: root/mono/utils/mono-threads.h
diff options
context:
space:
mode:
Diffstat (limited to 'mono/utils/mono-threads.h')
-rw-r--r--mono/utils/mono-threads.h67
1 files changed, 46 insertions, 21 deletions
diff --git a/mono/utils/mono-threads.h b/mono/utils/mono-threads.h
index 0004e55c96..e54ec617f9 100644
--- a/mono/utils/mono-threads.h
+++ b/mono/utils/mono-threads.h
@@ -26,6 +26,8 @@ typedef HANDLE MonoNativeThreadHandle; /* unused */
typedef DWORD mono_native_thread_return_t;
+#define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (tid)
+
#else
#include <pthread.h>
@@ -47,6 +49,8 @@ typedef pthread_t MonoNativeThreadId;
typedef void* mono_native_thread_return_t;
+#define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (gsize)(tid)
+
#endif /* #ifdef HOST_WIN32 */
/*
@@ -76,10 +80,10 @@ and reduce the number of casts drastically.
#endif
enum {
- STATE_STARTING = 0x01,
- STATE_RUNNING = 0x02,
- STATE_SHUTTING_DOWN = 0x03,
- STATE_DEAD = 0x04,
+ STATE_STARTING = 0x00,
+ STATE_RUNNING = 0x01,
+ STATE_SHUTTING_DOWN = 0x02,
+ STATE_DEAD = 0x03,
RUN_STATE_MASK = 0x0F,
STATE_SUSPENDED = 0x10,
@@ -87,8 +91,8 @@ enum {
SUSPEND_STATE_MASK = 0xF0,
};
-#define mono_thread_info_run_state(info) ((info)->thread_state & RUN_STATE_MASK)
-#define mono_thread_info_suspend_state(info) ((info)->thread_state & SUSPEND_STATE_MASK)
+#define mono_thread_info_run_state(info) (((MonoThreadInfo*)info)->thread_state & RUN_STATE_MASK)
+#define mono_thread_info_suspend_state(info) (((MonoThreadInfo*)info)->thread_state & SUSPEND_STATE_MASK)
typedef struct {
MonoLinkedListSetNode node;
@@ -126,15 +130,30 @@ typedef struct {
and is ended when you call either mono_thread_info_resume or mono_thread_info_finish_suspend.
*/
gboolean inside_critical_region;
+
+ /*
+ * If TRUE, the thread is in async context. Code can use this information to avoid async-unsafe
+ * operations like locking without having to pass an 'async' parameter around.
+ */
+ gboolean is_async_context;
} MonoThreadInfo;
typedef struct {
void* (*thread_register)(THREAD_INFO_TYPE *info, void *baseaddr);
/*
- This callback is called after @info is removed from the thread list.
+ This callback is called with @info still on the thread list.
+ This call is made while holding the suspend lock, so don't do callbacks.
SMR remains functional as its small_id has not been reclaimed.
*/
void (*thread_unregister)(THREAD_INFO_TYPE *info);
+ /*
+ This callback is called right before thread_unregister. This is called
+ without any locks held so it's the place for complicated cleanup.
+
+ The thread must remain operational between this call and thread_unregister.
+ It must be possible to successfully suspend it after thread_unregister completes.
+ */
+ void (*thread_detach)(THREAD_INFO_TYPE *info);
void (*thread_attach)(THREAD_INFO_TYPE *info);
gboolean (*mono_method_is_critical) (void *method);
#ifndef HOST_WIN32
@@ -151,13 +170,13 @@ typedef struct {
/*
Requires the world to be stoped
*/
-#define FOREACH_THREAD(thread) MONO_LLS_FOREACH (mono_thread_info_list_head (), thread, SgenThreadInfo*)
+#define FOREACH_THREAD(thread) MONO_LLS_FOREACH (mono_thread_info_list_head (), thread, THREAD_INFO_TYPE*)
#define END_FOREACH_THREAD MONO_LLS_END_FOREACH
/*
Snapshot iteration.
*/
-#define FOREACH_THREAD_SAFE(thread) MONO_LLS_FOREACH_SAFE (mono_thread_info_list_head (), thread, SgenThreadInfo*)
+#define FOREACH_THREAD_SAFE(thread) MONO_LLS_FOREACH_SAFE (mono_thread_info_list_head (), thread, THREAD_INFO_TYPE*)
#define END_FOREACH_THREAD_SAFE MONO_LLS_END_FOREACH_SAFE
#define mono_thread_info_get_tid(info) ((MonoNativeThreadId)((MonoThreadInfo*)info)->node.key)
@@ -197,10 +216,10 @@ mono_thread_info_get_small_id (void) MONO_INTERNAL;
MonoLinkedListSet*
mono_thread_info_list_head (void) MONO_INTERNAL;
-MonoThreadInfo*
+THREAD_INFO_TYPE*
mono_thread_info_lookup (MonoNativeThreadId id) MONO_INTERNAL;
-MonoThreadInfo*
+THREAD_INFO_TYPE*
mono_thread_info_safe_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_kernel) MONO_INTERNAL;
gboolean
@@ -216,7 +235,7 @@ gboolean
mono_thread_info_new_interrupt_enabled (void) MONO_INTERNAL;
void
-mono_thread_info_setup_async_call (MonoThreadInfo *info, void (*target_func)(void*), void *user_data) MONO_INTERNAL;
+mono_thread_info_setup_async_call (THREAD_INFO_TYPE *info, void (*target_func)(void*), void *user_data) MONO_INTERNAL;
void
mono_thread_info_suspend_lock (void) MONO_INTERNAL;
@@ -225,14 +244,20 @@ void
mono_thread_info_suspend_unlock (void) MONO_INTERNAL;
void
-mono_threads_unregister_current_thread (THREAD_INFO_TYPE *info) MONO_INTERNAL;
-
-void
mono_thread_info_disable_new_interrupt (gboolean disable) MONO_INTERNAL;
void
mono_thread_info_abort_socket_syscall_for_close (MonoNativeThreadId tid) MONO_INTERNAL;
+void
+mono_thread_info_set_is_async_context (gboolean async_context) MONO_INTERNAL;
+
+gboolean
+mono_thread_info_is_async_context (void) MONO_INTERNAL;
+
+HANDLE
+mono_threads_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 stack_size, guint32 creation_flags, MonoNativeThreadId *out_tid);
+
#if !defined(HOST_WIN32)
int
@@ -254,12 +279,12 @@ HANDLE
/* Plartform specific functions DON'T use them */
void mono_threads_init_platform (void) MONO_INTERNAL; //ok
-gboolean mono_threads_core_suspend (MonoThreadInfo *info) MONO_INTERNAL;
-gboolean mono_threads_core_resume (MonoThreadInfo *info) MONO_INTERNAL;
-void mono_threads_platform_register (MonoThreadInfo *info) MONO_INTERNAL; //ok
-void mono_threads_platform_free (MonoThreadInfo *info) MONO_INTERNAL;
-void mono_threads_core_interrupt (MonoThreadInfo *info) MONO_INTERNAL;
-void mono_threads_core_abort_syscall (MonoThreadInfo *info) MONO_INTERNAL;
+gboolean mono_threads_core_suspend (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+gboolean mono_threads_core_resume (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+void mono_threads_platform_register (THREAD_INFO_TYPE *info) MONO_INTERNAL; //ok
+void mono_threads_platform_free (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+void mono_threads_core_interrupt (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+void mono_threads_core_abort_syscall (THREAD_INFO_TYPE *info) MONO_INTERNAL;
gboolean mono_threads_core_needs_abort_syscall (void) MONO_INTERNAL;
MonoNativeThreadId mono_native_thread_id_get (void) MONO_INTERNAL;