aboutsummaryrefslogtreecommitdiff
path: root/gdb/windows-nat.c
diff options
context:
space:
mode:
authorChristopher Faylor <me+cygwin@cgf.cx>2003-12-26 00:39:04 +0000
committerChristopher Faylor <me+cygwin@cgf.cx>2003-12-26 00:39:04 +0000
commit87a45c96062d658ca83b50aa060a648bf5f5f1ff (patch)
tree2e4862f3d0f9c554ee22f2f1ec2d480fae538e67 /gdb/windows-nat.c
parentffeaf0e8c655a8ed92128688a9d2f021ae8220cc (diff)
downloadgdb-87a45c96062d658ca83b50aa060a648bf5f5f1ff.zip
gdb-87a45c96062d658ca83b50aa060a648bf5f5f1ff.tar.gz
gdb-87a45c96062d658ca83b50aa060a648bf5f5f1ff.tar.bz2
* 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.
Diffstat (limited to 'gdb/windows-nat.c')
-rw-r--r--gdb/windows-nat.c124
1 files changed, 63 insertions, 61 deletions
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 358bdf7..c29bcc0 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -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;