2 * mono-threads-windows.c: Low-level threading, windows version
5 * Rodrigo Kumpera (kumpera@gmail.com)
12 #if defined(HOST_WIN32)
14 #include <mono/utils/mono-threads.h>
18 mono_threads_init_platform (void)
23 mono_threads_core_interrupt (MonoThreadInfo *info)
29 mono_threads_core_self_suspend (MonoThreadInfo *info)
35 mono_threads_core_suspend (MonoThreadInfo *info)
41 mono_threads_core_resume (MonoThreadInfo *info)
47 mono_threads_platform_register (MonoThreadInfo *info)
52 mono_threads_platform_free (MonoThreadInfo *info)
57 LPTHREAD_START_ROUTINE start_routine;
59 MonoSemType registered;
64 inner_start_thread (LPVOID arg)
66 ThreadStartInfo *start_info = arg;
67 void *t_arg = start_info->arg;
69 LPTHREAD_START_ROUTINE start_func = start_info->start_routine;
72 mono_thread_info_attach (&result);
74 post_result = MONO_SEM_POST (&(start_info->registered));
75 g_assert (!post_result);
77 if (start_info->suspend)
78 SuspendThread (GetCurrentThread ());
80 result = start_func (t_arg);
82 g_assert (!mono_domain_get ());
88 mono_threads_CreateThread (LPSECURITY_ATTRIBUTES attributes, SIZE_T stack_size, LPTHREAD_START_ROUTINE start_routine,
89 LPVOID arg, DWORD creation_flags, LPDWORD thread_id)
91 ThreadStartInfo *start_info;
94 start_info = g_malloc0 (sizeof (ThreadStartInfo));
97 MONO_SEM_INIT (&(start_info->registered), 0);
98 start_info->arg = arg;
99 start_info->start_routine = start_routine;
100 start_info->suspend = creation_flags & CREATE_SUSPENDED;
101 creation_flags &= ~CREATE_SUSPENDED;
103 result = CreateThread (attributes, stack_size, inner_start_thread, start_info, creation_flags, thread_id);
106 while (MONO_SEM_WAIT (&(start_info->registered)) != 0) {
107 /*if (EINTR != errno) ABORT("sem_wait failed"); */
110 MONO_SEM_DESTROY (&(start_info->registered));