painfully updated these
[mono.git] / libgc / win32_threads.c
index 87944dc375ff986313a60288a9ca1eec8691f0dd..a2cd0fda43ee3dbd88bf8d15884bc76c1f35c750 100644 (file)
@@ -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;
     }
@@ -378,7 +385,11 @@ void GC_push_all_stacks()
 #       define PUSH4(r1,r2,r3,r4) PUSH2(r1,r2), PUSH2(r3,r4)
 #       if defined(I386)
           PUSH4(Edi,Esi,Ebx,Edx), PUSH2(Ecx,Eax), PUSH1(Ebp);
-         sp = (ptr_t)context.Esp;
+         sp = (ptr_t)context.Esp;\r
+#      elif defined(X86_64)\r
+         PUSH4(Rax,Rcx,Rdx,Rbx); PUSH2(Rbp, Rsi); PUSH1(Rdi);\r
+         PUSH4(R8, R9, R10, R11); PUSH4(R12, R13, R14, R15);\r
+         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: