Merge pull request #890 from xoofx/master
[mono.git] / mono / utils / mono-threads.h
index 1318eb48864fa461c0e174e11c49c2599d9f0c18..dbd25a8f7787a052504a9c95014b6c2cd3b1c010 100644 (file)
@@ -14,6 +14,7 @@
 #include <mono/utils/mono-stack-unwinding.h>
 #include <mono/utils/mono-linked-list-set.h>
 #include <mono/utils/mono-mutex.h>
+#include <mono/utils/mono-tls.h>
 
 #include <glib.h>
 
@@ -27,6 +28,7 @@ typedef HANDLE MonoNativeThreadHandle; /* unused */
 typedef DWORD mono_native_thread_return_t;
 
 #define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (tid)
+#define MONO_UINT_TO_NATIVE_THREAD_ID(tid) ((MonoNativeThreadId)(tid))
 
 #else
 
@@ -49,7 +51,8 @@ typedef pthread_t MonoNativeThreadId;
 
 typedef void* mono_native_thread_return_t;
 
-#define MONO_NATIVE_THREAD_ID_TO_UINT(tid) GPOINTER_TO_UINT((tid))
+#define MONO_NATIVE_THREAD_ID_TO_UINT(tid) (gsize)(tid)
+#define MONO_UINT_TO_NATIVE_THREAD_ID(tid) (MonoNativeThreadId)(gsize)(tid)
 
 #endif /* #ifdef HOST_WIN32 */
 
@@ -136,6 +139,22 @@ typedef struct {
         * operations like locking without having to pass an 'async' parameter around.
         */
        gboolean is_async_context;
+
+       gboolean create_suspended;
+
+       /* Semaphore used to implement CREATE_SUSPENDED */
+       MonoSemType create_suspended_sem;
+
+       /*
+        * Values of TLS variables for this thread.
+        * This can be used to obtain the values of TLS variable for threads
+        * other than the current one.
+        */
+       gpointer tls [TLS_KEY_NUM];
+
+       /* IO layer handle for this thread */
+       /* Set when the thread is started, or in _wapi_thread_duplicate () */
+       HANDLE handle;
 } MonoThreadInfo;
 
 typedef struct {
@@ -156,6 +175,7 @@ typedef struct {
        void (*thread_detach)(THREAD_INFO_TYPE *info);
        void (*thread_attach)(THREAD_INFO_TYPE *info);
        gboolean (*mono_method_is_critical) (void *method);
+       void (*thread_exit)(void *retval);
 #ifndef HOST_WIN32
        int (*mono_gc_pthread_create) (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
 #endif
@@ -164,7 +184,7 @@ typedef struct {
 typedef struct {
        void (*setup_async_callback) (MonoContext *ctx, void (*async_cb)(void *fun), gpointer user_data);
        gboolean (*thread_state_init_from_sigctx) (MonoThreadUnwindState *state, void *sigctx);
-       gboolean (*thread_state_init_from_handle) (MonoThreadUnwindState *tctx, MonoNativeThreadId thread_id, MonoNativeThreadHandle thread_handle);
+       gboolean (*thread_state_init_from_handle) (MonoThreadUnwindState *tctx, MonoThreadInfo *info);
 } MonoThreadInfoRuntimeCallbacks;
 
 /*
@@ -205,7 +225,7 @@ THREAD_INFO_TYPE *
 mono_thread_info_attach (void *baseptr) MONO_INTERNAL;
 
 void
-mono_thread_info_dettach (void) MONO_INTERNAL;
+mono_thread_info_detach (void) MONO_INTERNAL;
 
 THREAD_INFO_TYPE *
 mono_thread_info_current (void) MONO_INTERNAL;
@@ -226,7 +246,13 @@ gboolean
 mono_thread_info_resume (MonoNativeThreadId tid) MONO_INTERNAL;
 
 void
-mono_thread_info_finish_suspend (void) MONO_INTERNAL;
+mono_thread_info_set_name (MonoNativeThreadId tid, const char *name) MONO_INTERNAL;
+
+void
+mono_thread_info_finish_suspend (MonoThreadInfo *info) MONO_INTERNAL;
+
+void
+mono_thread_info_finish_suspend_and_resume (MonoThreadInfo *info) MONO_INTERNAL;
 
 void
 mono_thread_info_self_suspend (void) MONO_INTERNAL;
@@ -255,13 +281,34 @@ mono_thread_info_set_is_async_context (gboolean async_context) MONO_INTERNAL;
 gboolean
 mono_thread_info_is_async_context (void) MONO_INTERNAL;
 
+void
+mono_thread_info_get_stack_bounds (guint8 **staddr, size_t *stsize);
+
+gboolean
+mono_thread_info_yield (void) MONO_INTERNAL;
+
+gpointer
+mono_thread_info_tls_get (THREAD_INFO_TYPE *info, MonoTlsKey key);
+
+void
+mono_thread_info_tls_set (THREAD_INFO_TYPE *info, MonoTlsKey key, gpointer value);
+
+void
+mono_thread_info_exit (void);
+
 HANDLE
-mono_threads_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 stack_size, guint32 creation_flags, MonoNativeThreadId *out_tid);
+mono_thread_info_open_handle (void);
 
-#if !defined(HOST_WIN32)
+HANDLE
+mono_threads_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 stack_size, guint32 creation_flags, MonoNativeThreadId *out_tid);
 
 int
-mono_threads_pthread_create (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) MONO_INTERNAL;
+mono_threads_get_max_stack_size (void) MONO_INTERNAL;
+
+HANDLE
+mono_threads_open_thread_handle (HANDLE handle, MonoNativeThreadId tid) MONO_INTERNAL;
+
+#if !defined(HOST_WIN32)
 
 #if !defined(__MACH__)
 /*Use this instead of pthread_kill */
@@ -269,12 +316,6 @@ int
 mono_threads_pthread_kill (THREAD_INFO_TYPE *info, int signum) MONO_INTERNAL;
 #endif
 
-#else  /* !defined(HOST_WIN32) */
-
-HANDLE
-       mono_threads_CreateThread (LPSECURITY_ATTRIBUTES attributes, SIZE_T stack_size, LPTHREAD_START_ROUTINE start_routine, LPVOID arg, DWORD creation_flags, LPDWORD thread_id);
-
-
 #endif /* !defined(HOST_WIN32) */
 
 /* Plartform specific functions DON'T use them */
@@ -286,6 +327,15 @@ 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;
+HANDLE mono_threads_core_create_thread (LPTHREAD_START_ROUTINE start, gpointer arg, guint32 stack_size, guint32 creation_flags, MonoNativeThreadId *out_tid) MONO_INTERNAL;
+void mono_threads_core_resume_created (THREAD_INFO_TYPE *info, MonoNativeThreadId tid) MONO_INTERNAL;
+void mono_threads_core_get_stack_bounds (guint8 **staddr, size_t *stsize) MONO_INTERNAL;
+gboolean mono_threads_core_yield (void) MONO_INTERNAL;
+void mono_threads_core_exit (int exit_code) MONO_INTERNAL;
+void mono_threads_core_unregister (THREAD_INFO_TYPE *info) MONO_INTERNAL;
+HANDLE mono_threads_core_open_handle (void) MONO_INTERNAL;
+HANDLE mono_threads_core_open_thread_handle (HANDLE handle, MonoNativeThreadId tid) MONO_INTERNAL;
+void mono_threads_core_set_name (MonoNativeThreadId tid, const char *name) MONO_INTERNAL;
 
 MonoNativeThreadId mono_native_thread_id_get (void) MONO_INTERNAL;
 
@@ -294,4 +344,8 @@ gboolean mono_native_thread_id_equals (MonoNativeThreadId id1, MonoNativeThreadI
 gboolean
 mono_native_thread_create (MonoNativeThreadId *tid, gpointer func, gpointer arg) MONO_INTERNAL;
 
+/*Mach specific internals */
+void mono_threads_init_dead_letter (void) MONO_INTERNAL;
+void mono_threads_install_dead_letter (void) MONO_INTERNAL;
+
 #endif /* __MONO_THREADS_H__ */