X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=libgc%2Fwin32_threads.c;h=5533b8f2e252bf750dba873d24aeecf78b79facd;hb=45d6da52ce69cbd24f5930e1cad88d425e706186;hp=87944dc375ff986313a60288a9ca1eec8691f0dd;hpb=4eb352bcb3ef7a71dc9ab62c5cd2d5e7598619f7;p=mono.git diff --git a/libgc/win32_threads.c b/libgc/win32_threads.c index 87944dc375f..5533b8f2e25 100644 --- a/libgc/win32_threads.c +++ b/libgc/win32_threads.c @@ -85,6 +85,26 @@ int GC_thread_is_registered (void) #endif } +void GC_allow_register_threads (void) +{ + /* No-op for GC pre-v7. */ +} + +int GC_register_my_thread (struct GC_stack_base *sb) +{ +# if defined(GC_DLL) || defined(GC_INSIDE_DLL) + /* Registered by DllMain. */ + return GC_DUPLICATE; +# else + /* TODO: Implement. */ + return GC_UNIMPLEMENTED; +# endif +} + +void GC_register_altstack (void *stack, int stack_size, void *altstack, int altstack_size) +{ +} + /* * This may be called from DllMain, and hence operates under unusual * constraints. @@ -164,7 +184,7 @@ static GC_thread GC_new_thread(void) { #ifdef __GNUC__ __inline__ #endif -LONG GC_get_max_thread_index() +static LONG GC_get_max_thread_index() { LONG my_max = GC_max_thread_index; @@ -283,8 +303,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 +406,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 +802,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: