diff options
author | Christopher Faylor <me+cygwin@cgf.cx> | 2003-12-26 00:39:04 +0000 |
---|---|---|
committer | Christopher Faylor <me+cygwin@cgf.cx> | 2003-12-26 00:39:04 +0000 |
commit | 87a45c96062d658ca83b50aa060a648bf5f5f1ff (patch) | |
tree | 2e4862f3d0f9c554ee22f2f1ec2d480fae538e67 /gdb/win32-nat.c | |
parent | ffeaf0e8c655a8ed92128688a9d2f021ae8220cc (diff) | |
download | gdb-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/win32-nat.c')
-rw-r--r-- | gdb/win32-nat.c | 124 |
1 files changed, 63 insertions, 61 deletions
diff --git a/gdb/win32-nat.c b/gdb/win32-nat.c index 358bdf7..c29bcc0 100644 --- a/gdb/win32-nat.c +++ b/gdb/win32-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; |