* 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.
This commit is contained in:
Christopher Faylor 2003-12-26 00:39:04 +00:00
parent ffeaf0e8c6
commit 87a45c9606
3 changed files with 132 additions and 122 deletions

View 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

View 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;

View 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;