X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=libgc%2Fwin32_threads.c;h=9662eb186ceb1f5f69184d47070e08670f309a72;hb=35044c74a25b2c3c983ceca94f5163fa309a495c;hp=87944dc375ff986313a60288a9ca1eec8691f0dd;hpb=d49951ccf584ba637afb1dab7fff714478e3174d;p=mono.git diff --git a/libgc/win32_threads.c b/libgc/win32_threads.c index 87944dc375f..9662eb186ce 100644 --- a/libgc/win32_threads.c +++ b/libgc/win32_threads.c @@ -283,8 +283,15 @@ void GC_stop_world() # endif continue; } - if (SuspendThread(thread_table[i].handle) == (DWORD)-1) - ABORT("SuspendThread failed"); + if (SuspendThread(thread_table[i].handle) == (DWORD)-1) { + thread_table[i].stack_base = 0; /* prevent stack from being pushed */ +# ifndef CYGWIN32 + /* this breaks pthread_join on Cygwin, which is guaranteed to */ + /* only see user pthreads */ + thread_table[i].in_use = FALSE; + CloseHandle(thread_table[i].handle); +# endif + } # endif thread_table[i].suspended = TRUE; } @@ -379,6 +386,10 @@ void GC_push_all_stacks() # if defined(I386) PUSH4(Edi,Esi,Ebx,Edx), PUSH2(Ecx,Eax), PUSH1(Ebp); sp = (ptr_t)context.Esp; +# elif defined(X86_64) + PUSH4(Rax,Rcx,Rdx,Rbx); PUSH2(Rbp, Rsi); PUSH1(Rdi); + PUSH4(R8, R9, R10, R11); PUSH4(R12, R13, R14, R15); + sp = (ptr_t)context.Rsp; # elif defined(ARM32) PUSH4(R0,R1,R2,R3),PUSH4(R4,R5,R6,R7),PUSH4(R8,R9,R10,R11),PUSH1(R12); sp = (ptr_t)context.Sp; @@ -771,7 +782,7 @@ int GC_pthread_detach(pthread_t thread) * Pontus Rydin suggests wrapping the thread start routine instead. */ #if defined(GC_DLL) || defined(GC_INSIDE_DLL) -BOOL WINAPI DllMain(HINSTANCE inst, ULONG reason, LPVOID reserved) +BOOL WINAPI GC_DllMain(HINSTANCE inst, ULONG reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: