* win32-nat.c (get_child_debug_event): Keep main thread id around even after
authorChristopher Faylor <me+cygwin@cgf.cx>
Fri, 26 Dec 2003 00:39:04 +0000 (00:39 +0000)
committerChristopher Faylor <me+cygwin@cgf.cx>
Fri, 26 Dec 2003 00:39:04 +0000 (00:39 +0000)
thread exits since Windows insists on continuing to report events against it.

gdb/ChangeLog
gdb/win32-nat.c
gdb/windows-nat.c

index a4e5aaf62ea8b8759fdbf9ed8fe152dba1bf163f..e0f06d912dc190134f304e24d0754db9211433a0 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-25  Christopher Faylor  <cgf@redhat.com>
+
+       * win32-nat.c (get_child_debug_event): Keep main thread id around even
+       after thread exits since Windows insists on continuing to report events
+       against it.
+
 2003-12-22  Mark Kettenis  <kettenis@gnu.org>
 
        * dwarf2-frame.c (dwarf2_frame_cache): Don't skip the return
index 358bdf7a9f53234e0e188df1ab3983ad64b72453..c29bcc0e829af2905cbccf8b25f260b39cae55e0 100644 (file)
@@ -76,8 +76,8 @@ enum
        | CONTEXT_EXTENDED_REGISTERS
 
 static unsigned dr[8];
-static int debug_registers_changed = 0;
-static int debug_registers_used = 0;
+static int debug_registers_changed;
+static int debug_registers_used;
 
 /* The string sent by cygwin when it processes a signal.
    FIXME: This should be in a cygwin include file. */
@@ -1205,7 +1205,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
 {
   BOOL debug_event;
   DWORD continue_status, event_code;
-  thread_info *th = NULL;
+  thread_info *th;
   static thread_info dummy_thread_info;
   int retval = 0;
 
@@ -1219,6 +1219,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
 
   event_code = current_event.dwDebugEventCode;
   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
+  th = NULL;
 
   switch (event_code)
     {
@@ -1246,8 +1247,11 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
                     "EXIT_THREAD_DEBUG_EVENT"));
       if (saw_create != 1)
        break;
-      child_delete_thread (current_event.dwThreadId);
-      th = &dummy_thread_info;
+      if (current_event.dwThreadId != main_thread_id)
+       {
+         child_delete_thread (current_event.dwThreadId);
+         th = &dummy_thread_info;
+       }
       break;
 
     case CREATE_PROCESS_DEBUG_EVENT:
@@ -1263,12 +1267,10 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
        }
 
       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
+      if (main_thread_id)
+       child_delete_thread (main_thread_id);
       main_thread_id = current_event.dwThreadId;
       /* Add the main thread */
-#if 0
-      th = child_add_thread (current_event.dwProcessId,
-                            current_event.u.CreateProcessInfo.hProcess);
-#endif
       th = child_add_thread (main_thread_id,
                             current_event.u.CreateProcessInfo.hThread);
       retval = ourstatus->value.related_pid = current_event.dwThreadId;
@@ -2199,65 +2201,65 @@ core_dll_symbols_add (char *dll_name, DWORD base_addr)
       }
   }
 
-  register_loaded_dll (dll_name, base_addr + 0x1000);
-  solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
+    register_loaded_dll (dll_name, base_addr + 0x1000);
+    solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
 
-out:
-  return 1;
-}
+  out:
+    return 1;
+  }
 
-typedef struct
-{
-  struct target_ops *target;
-  bfd_vma addr;
-} map_code_section_args;
+  typedef struct
+  {
+    struct target_ops *target;
+    bfd_vma addr;
+  } map_code_section_args;
 
-static void
-map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
-{
-  int old;
-  int update_coreops;
-  struct section_table *new_target_sect_ptr;
+  static void
+  map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
+  {
+    int old;
+    int update_coreops;
+    struct section_table *new_target_sect_ptr;
 
-  map_code_section_args *args = (map_code_section_args *) obj;
-  struct target_ops *target = args->target;
-  if (sect->flags & SEC_CODE)
-    {
-      update_coreops = core_ops.to_sections == target->to_sections;
+    map_code_section_args *args = (map_code_section_args *) obj;
+    struct target_ops *target = args->target;
+    if (sect->flags & SEC_CODE)
+      {
+       update_coreops = core_ops.to_sections == target->to_sections;
 
-      if (target->to_sections)
-       {
-         old = target->to_sections_end - target->to_sections;
-         target->to_sections = (struct section_table *)
-           xrealloc ((char *) target->to_sections,
-                     (sizeof (struct section_table)) * (1 + old));
-       }
-      else
-       {
-         old = 0;
-         target->to_sections = (struct section_table *)
-           xmalloc ((sizeof (struct section_table)));
-       }
-      target->to_sections_end = target->to_sections + (1 + old);
+       if (target->to_sections)
+         {
+           old = target->to_sections_end - target->to_sections;
+           target->to_sections = (struct section_table *)
+             xrealloc ((char *) target->to_sections,
+                       (sizeof (struct section_table)) * (1 + old));
+         }
+       else
+         {
+           old = 0;
+           target->to_sections = (struct section_table *)
+             xmalloc ((sizeof (struct section_table)));
+         }
+       target->to_sections_end = target->to_sections + (1 + old);
 
-      /* Update the to_sections field in the core_ops structure
-        if needed.  */
-      if (update_coreops)
-       {
-         core_ops.to_sections = target->to_sections;
-         core_ops.to_sections_end = target->to_sections_end;
-       }
-      new_target_sect_ptr = target->to_sections + old;
-      new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
-      new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
-       bfd_section_size (abfd, sect);;
-      new_target_sect_ptr->the_bfd_section = sect;
-      new_target_sect_ptr->bfd = abfd;
-    }
-}
+       /* Update the to_sections field in the core_ops structure
+          if needed.  */
+       if (update_coreops)
+         {
+           core_ops.to_sections = target->to_sections;
+           core_ops.to_sections_end = target->to_sections_end;
+         }
+       new_target_sect_ptr = target->to_sections + old;
+       new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
+       new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
+         bfd_section_size (abfd, sect);;
+       new_target_sect_ptr->the_bfd_section = sect;
+       new_target_sect_ptr->bfd = abfd;
+      }
+  }
 
-static int
-dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
+  static int
+  dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
 {
   bfd *dll_bfd;
   map_code_section_args map_args;
index 358bdf7a9f53234e0e188df1ab3983ad64b72453..c29bcc0e829af2905cbccf8b25f260b39cae55e0 100644 (file)
@@ -76,8 +76,8 @@ enum
        | CONTEXT_EXTENDED_REGISTERS
 
 static unsigned dr[8];
-static int debug_registers_changed = 0;
-static int debug_registers_used = 0;
+static int debug_registers_changed;
+static int debug_registers_used;
 
 /* The string sent by cygwin when it processes a signal.
    FIXME: This should be in a cygwin include file. */
@@ -1205,7 +1205,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
 {
   BOOL debug_event;
   DWORD continue_status, event_code;
-  thread_info *th = NULL;
+  thread_info *th;
   static thread_info dummy_thread_info;
   int retval = 0;
 
@@ -1219,6 +1219,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
 
   event_code = current_event.dwDebugEventCode;
   ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
+  th = NULL;
 
   switch (event_code)
     {
@@ -1246,8 +1247,11 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
                     "EXIT_THREAD_DEBUG_EVENT"));
       if (saw_create != 1)
        break;
-      child_delete_thread (current_event.dwThreadId);
-      th = &dummy_thread_info;
+      if (current_event.dwThreadId != main_thread_id)
+       {
+         child_delete_thread (current_event.dwThreadId);
+         th = &dummy_thread_info;
+       }
       break;
 
     case CREATE_PROCESS_DEBUG_EVENT:
@@ -1263,12 +1267,10 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
        }
 
       current_process_handle = current_event.u.CreateProcessInfo.hProcess;
+      if (main_thread_id)
+       child_delete_thread (main_thread_id);
       main_thread_id = current_event.dwThreadId;
       /* Add the main thread */
-#if 0
-      th = child_add_thread (current_event.dwProcessId,
-                            current_event.u.CreateProcessInfo.hProcess);
-#endif
       th = child_add_thread (main_thread_id,
                             current_event.u.CreateProcessInfo.hThread);
       retval = ourstatus->value.related_pid = current_event.dwThreadId;
@@ -2199,65 +2201,65 @@ core_dll_symbols_add (char *dll_name, DWORD base_addr)
       }
   }
 
-  register_loaded_dll (dll_name, base_addr + 0x1000);
-  solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
+    register_loaded_dll (dll_name, base_addr + 0x1000);
+    solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
 
-out:
-  return 1;
-}
+  out:
+    return 1;
+  }
 
-typedef struct
-{
-  struct target_ops *target;
-  bfd_vma addr;
-} map_code_section_args;
+  typedef struct
+  {
+    struct target_ops *target;
+    bfd_vma addr;
+  } map_code_section_args;
 
-static void
-map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
-{
-  int old;
-  int update_coreops;
-  struct section_table *new_target_sect_ptr;
+  static void
+  map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
+  {
+    int old;
+    int update_coreops;
+    struct section_table *new_target_sect_ptr;
 
-  map_code_section_args *args = (map_code_section_args *) obj;
-  struct target_ops *target = args->target;
-  if (sect->flags & SEC_CODE)
-    {
-      update_coreops = core_ops.to_sections == target->to_sections;
+    map_code_section_args *args = (map_code_section_args *) obj;
+    struct target_ops *target = args->target;
+    if (sect->flags & SEC_CODE)
+      {
+       update_coreops = core_ops.to_sections == target->to_sections;
 
-      if (target->to_sections)
-       {
-         old = target->to_sections_end - target->to_sections;
-         target->to_sections = (struct section_table *)
-           xrealloc ((char *) target->to_sections,
-                     (sizeof (struct section_table)) * (1 + old));
-       }
-      else
-       {
-         old = 0;
-         target->to_sections = (struct section_table *)
-           xmalloc ((sizeof (struct section_table)));
-       }
-      target->to_sections_end = target->to_sections + (1 + old);
+       if (target->to_sections)
+         {
+           old = target->to_sections_end - target->to_sections;
+           target->to_sections = (struct section_table *)
+             xrealloc ((char *) target->to_sections,
+                       (sizeof (struct section_table)) * (1 + old));
+         }
+       else
+         {
+           old = 0;
+           target->to_sections = (struct section_table *)
+             xmalloc ((sizeof (struct section_table)));
+         }
+       target->to_sections_end = target->to_sections + (1 + old);
 
-      /* Update the to_sections field in the core_ops structure
-        if needed.  */
-      if (update_coreops)
-       {
-         core_ops.to_sections = target->to_sections;
-         core_ops.to_sections_end = target->to_sections_end;
-       }
-      new_target_sect_ptr = target->to_sections + old;
-      new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
-      new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
-       bfd_section_size (abfd, sect);;
-      new_target_sect_ptr->the_bfd_section = sect;
-      new_target_sect_ptr->bfd = abfd;
-    }
-}
+       /* Update the to_sections field in the core_ops structure
+          if needed.  */
+       if (update_coreops)
+         {
+           core_ops.to_sections = target->to_sections;
+           core_ops.to_sections_end = target->to_sections_end;
+         }
+       new_target_sect_ptr = target->to_sections + old;
+       new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
+       new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
+         bfd_section_size (abfd, sect);;
+       new_target_sect_ptr->the_bfd_section = sect;
+       new_target_sect_ptr->bfd = abfd;
+      }
+  }
 
-static int
-dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
+  static int
+  dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
 {
   bfd *dll_bfd;
   map_code_section_args map_args;
This page took 0.038136 seconds and 4 git commands to generate.