[BACK]Return to win32_threads.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc

Diff for /OpenXM_contrib2/asir2000/gc/win32_threads.c between version 1.1 and 1.2

version 1.1, 1999/12/03 07:39:10 version 1.2, 2000/12/01 09:26:13
Line 2 
Line 2 
   
 #include "gc_priv.h"  #include "gc_priv.h"
   
   #if 0
 #define STRICT  #define STRICT
 #include <windows.h>  #include <windows.h>
   #endif
   
 #define MAX_THREADS 64  #define MAX_THREADS 64
   
Line 31  void GC_stop_world()
Line 33  void GC_stop_world()
   for (i = 0; i < MAX_THREADS; i++)    for (i = 0; i < MAX_THREADS; i++)
     if (thread_table[i].stack != 0      if (thread_table[i].stack != 0
         && thread_table[i].id != thread_id) {          && thread_table[i].id != thread_id) {
         /* Apparently the Windows 95 GetOpenFileName call creates */
         /* a thread that does not properly get cleaned up, and            */
         /* SuspendThread on its descriptor may provoke a crash.           */
         /* This reduces the probability of that event, though it still    */
         /* appears there's a race here.                                   */
         DWORD exitCode;
         if (GetExitCodeThread(thread_table[i].handle,&exitCode) &&
               exitCode != STILL_ACTIVE) {
               thread_table[i].stack = 0;
             thread_table[i].in_use = FALSE;
             CloseHandle(thread_table[i].handle);
             BZERO(&thread_table[i].context, sizeof(CONTEXT));
             continue;
         }
       if (SuspendThread(thread_table[i].handle) == (DWORD)-1)        if (SuspendThread(thread_table[i].handle) == (DWORD)-1)
         ABORT("SuspendThread failed");          ABORT("SuspendThread failed");
       thread_table[i].suspended = TRUE;        thread_table[i].suspended = TRUE;
Line 61  ptr_t GC_current_stackbottom()
Line 77  ptr_t GC_current_stackbottom()
   ABORT("no thread table entry for current thread");    ABORT("no thread table entry for current thread");
 }  }
   
 ptr_t GC_get_lo_stack_addr(ptr_t s)  static ptr_t GC_get_lo_stack_addr(ptr_t s)
 {  {
     ptr_t bottom;      ptr_t bottom;
     MEMORY_BASIC_INFORMATION info;      MEMORY_BASIC_INFORMATION info;
Line 81  void GC_push_all_stacks()
Line 97  void GC_push_all_stacks()
     if (thread_table[i].stack) {      if (thread_table[i].stack) {
       ptr_t bottom = GC_get_lo_stack_addr(thread_table[i].stack);        ptr_t bottom = GC_get_lo_stack_addr(thread_table[i].stack);
       if (thread_table[i].id == thread_id)        if (thread_table[i].id == thread_id)
         GC_push_all(&i, thread_table[i].stack);          GC_push_all_stack(&i, thread_table[i].stack);
       else {        else {
         thread_table[i].context.ContextFlags          thread_table[i].context.ContextFlags
                         = (CONTEXT_INTEGER|CONTEXT_CONTROL);                          = (CONTEXT_INTEGER|CONTEXT_CONTROL);

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>