static void* register_thread (MonoThreadInfo *info, gpointer baseptr) { gboolean result; mono_thread_info_set_tid (info, mono_native_thread_id_get ()); info->small_id = mono_thread_small_id_alloc (); InitializeCriticalSection (&info->suspend_lock); /*set TLS early so SMR works */ mono_native_tls_set_value (thread_info_key, info); mono_native_tls_set_value (small_id_key, GUINT_TO_POINTER (info->small_id + 1)); THREADS_DEBUG ("registering info %p tid %p small id %x\n", info, mono_thread_info_get_tid (info), info->small_id); if (threads_callbacks.thread_register) { if (threads_callbacks.thread_register (info, baseptr) == NULL) { g_warning ("thread registation failed\n"); g_free (info); return NULL; } } mono_threads_platform_register (info); /*If this fail it means a given thread has been registered twice, which doesn't make sense. */ result = mono_thread_info_insert (info); g_assert (result); return info; }
static void* register_thread (MonoThreadInfo *info, gpointer baseptr) { int small_id = mono_thread_info_register_small_id (); gboolean result; mono_thread_info_set_tid (info, mono_native_thread_id_get ()); info->small_id = small_id; MONO_SEM_INIT (&info->suspend_semaphore, 1); MONO_SEM_INIT (&info->resume_semaphore, 0); MONO_SEM_INIT (&info->finish_resume_semaphore, 0); /*set TLS early so SMR works */ mono_native_tls_set_value (thread_info_key, info); THREADS_DEBUG ("registering info %p tid %p small id %x\n", info, mono_thread_info_get_tid (info), info->small_id); if (threads_callbacks.thread_register) { if (threads_callbacks.thread_register (info, baseptr) == NULL) { g_warning ("thread registation failed\n"); g_free (info); return NULL; } } mono_threads_platform_register (info); info->thread_state = STATE_RUNNING; mono_thread_info_suspend_lock (); /*If this fail it means a given thread has been registered twice, which doesn't make sense. */ result = mono_thread_info_insert (info); g_assert (result); mono_thread_info_suspend_unlock (); return info; }
static void* register_thread (MonoThreadInfo *info, gpointer baseptr) { size_t stsize = 0; guint8 *staddr = NULL; int small_id = mono_thread_info_register_small_id (); gboolean result; mono_thread_info_set_tid (info, mono_native_thread_id_get ()); info->small_id = small_id; info->handle = g_new0 (MonoThreadHandle, 1); mono_refcount_init (info->handle, thread_handle_destroy); mono_os_event_init (&info->handle->event, FALSE); mono_os_sem_init (&info->resume_semaphore, 0); /*set TLS early so SMR works */ mono_native_tls_set_value (thread_info_key, info); THREADS_DEBUG ("registering info %p tid %p small id %x\n", info, mono_thread_info_get_tid (info), info->small_id); if (threads_callbacks.thread_register) { if (threads_callbacks.thread_register (info, baseptr) == NULL) { // g_warning ("thread registation failed\n"); mono_native_tls_set_value (thread_info_key, NULL); g_free (info); return NULL; } } mono_thread_info_get_stack_bounds (&staddr, &stsize); g_assert (staddr); g_assert (stsize); info->stack_start_limit = staddr; info->stack_end = staddr + stsize; info->stackdata = g_byte_array_new (); mono_threads_suspend_register (info); /* Transition it before taking any locks or publishing itself to reduce the chance of others witnessing a detached thread. We can reasonably expect that until this thread gets published, no other thread will try to manipulate it. */ mono_threads_transition_attach (info); mono_thread_info_suspend_lock (); /*If this fail it means a given thread has been registered twice, which doesn't make sense. */ result = mono_thread_info_insert (info); g_assert (result); mono_thread_info_suspend_unlock (); return info; }