if (thread != pthread_self ()) {
MONO_ENTER_GC_SAFE;
/* This shouldn't block */
- pthread_join (thread, NULL);
+ mono_native_thread_join (thread);
MONO_EXIT_GC_SAFE;
}
} else {
return;
thread = (pthread_t)tid;
MONO_ENTER_GC_SAFE;
- pthread_join (thread, NULL);
+ mono_native_thread_join (thread);
MONO_EXIT_GC_SAFE;
#endif
}
}
#endif
- pthread_join (sampling_thread, NULL);
+ mono_native_thread_join (sampling_thread);
/*
* We can't safely remove the signal handler because we have no guarantee
#endif
}
+gboolean
+mono_native_thread_join (MonoNativeThreadId tid)
+{
+ void *res;
+
+ return !pthread_join (tid, &res);
+}
+
void
mono_threads_platform_set_exited (gpointer handle)
{
return CreateThread (NULL, 0, (func), (arg), 0, (tid)) != NULL;
}
+gboolean
+mono_native_thread_join (MonoNativeThreadId tid)
+{
+ HANDLE handle;
+
+ if (!(handle = OpenThread (THREAD_ALL_ACCESS, TRUE, tid)))
+ return FALSE;
+
+ DWORD res = WaitForSingleObject (handle, INFINITE);
+
+ CloseHandle (handle);
+
+ return res != WAIT_FAILED;
+}
+
#if HAVE_DECL___READFSDWORD==0
static MONO_ALWAYS_INLINE unsigned long long
__readfsdword (unsigned long offset)
MONO_API void
mono_native_thread_set_name (MonoNativeThreadId tid, const char *name);
+MONO_API gboolean
+mono_native_thread_join (MonoNativeThreadId tid);
+
/*Mach specific internals */
void mono_threads_init_dead_letter (void);
void mono_threads_install_dead_letter (void);