#include <mono/metadata/exception.h>
#include <mono/metadata/threads.h>
#include <mono/io-layer/io-layer.h>
+#include <mono/metadata/object-internals.h>
#include <mono/os/gc_wrapper.h>
guint32 ret;
gboolean success=FALSE;
gint32 regain;
+ MonoThread *thread = mono_thread_current ();
MONO_ARCH_SAVE_REGS;
GetCurrentThreadId (), event);
#endif
+ mono_monitor_enter (thread->synch_lock);
+ thread->state |= ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
+
mon->wait_list=g_slist_append (mon->wait_list, event);
/* Save the nest count, and release the lock */
* signalled before we wait, we still succeed.
*/
ret=WaitForSingleObjectEx (event, ms, TRUE);
+
+ /* Reset the thread state fairly early, so we don't have to worry
+ * about the monitor error checking
+ */
+ mono_monitor_enter (thread->synch_lock);
+ thread->state &= ~ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
if (mono_thread_interruption_requested ()) {
CloseHandle (event);
guint32 i;
MonoObject *waitHandle;
MonoClass *klass;
+ MonoThread *thread = mono_thread_current ();
MONO_ARCH_SAVE_REGS;
if(ms== -1) {
ms=INFINITE;
}
+
+ mono_monitor_enter (thread->synch_lock);
+ thread->state |= ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
ret=WaitForMultipleObjectsEx(numhandles, handles, TRUE, ms, TRUE);
+ mono_monitor_enter (thread->synch_lock);
+ thread->state &= ~ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
+
g_free(handles);
if(ret==WAIT_FAILED) {
guint32 i;
MonoObject *waitHandle;
MonoClass *klass;
+ MonoThread *thread = mono_thread_current ();
MONO_ARCH_SAVE_REGS;
ms=INFINITE;
}
+ mono_monitor_enter (thread->synch_lock);
+ thread->state |= ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
+
ret=WaitForMultipleObjectsEx(numhandles, handles, FALSE, ms, TRUE);
+ mono_monitor_enter (thread->synch_lock);
+ thread->state &= ~ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
+
g_free(handles);
#ifdef THREAD_WAIT_DEBUG
gboolean ves_icall_System_Threading_WaitHandle_WaitOne_internal(MonoObject *this, HANDLE handle, gint32 ms, gboolean exitContext)
{
guint32 ret;
+ MonoThread *thread = mono_thread_current ();
MONO_ARCH_SAVE_REGS;
ms=INFINITE;
}
+ mono_monitor_enter (thread->synch_lock);
+ thread->state |= ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
+
ret=WaitForSingleObjectEx (handle, ms, TRUE);
+
+ mono_monitor_enter (thread->synch_lock);
+ thread->state &= ~ThreadState_WaitSleepJoin;
+ mono_monitor_exit (thread->synch_lock);
if(ret==WAIT_FAILED) {
#ifdef THREAD_WAIT_DEBUG