From b75fa37d5aa9d6a4834325e6baf3a61627431bd1 Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 15 Sep 2019 21:43:18 +0000 Subject: mgdb: winnt_delete_thread(): initial implementation and integration. --- overlay/mgdb/gdb/winnt-nat.c | 63 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/overlay/mgdb/gdb/winnt-nat.c b/overlay/mgdb/gdb/winnt-nat.c index e5d054a..e8444f8 100644 --- a/overlay/mgdb/gdb/winnt-nat.c +++ b/overlay/mgdb/gdb/winnt-nat.c @@ -515,6 +515,43 @@ static struct winnt_thread * winnt_get_thread_from_ptid(ptid_t ptid) return 0; } +static void winnt_delete_thread(struct __dbg_event * event) +{ + ptid_t ptid; + struct winnt_process * process; + struct winnt_thread * thread; + struct winnt_thread * prev; + + ptid.pid = event->syspid; + ptid.tid = event->systid; + ptid.lwp = 0; + + delete_thread(ptid); + + if (!(thread = winnt_get_thread_from_ptid(ptid))) + return; + + process = thread->process; + + if (thread == process->threads) { + process->threads = thread->next; + } else { + prev = process->threads; + + for (; prev->next != thread; ) + prev = prev->next; + + prev->next = thread->next; + } + + if (process->threads) + if (inferior_ptid.pid == ptid.pid) + if (inferior_ptid.tid == ptid.tid) + inferior_ptid.tid = process->threads->tid; + + free(thread); +} + static void winnt_respond (int pfd, struct __dbg_event * event, int response) { ptid_t ptid; @@ -532,6 +569,10 @@ static void winnt_respond (int pfd, struct __dbg_event * event, int response) winnt_add_thread(pfd,ptid); break; + case __DBG_STATE_EXIT_THREAD: + winnt_delete_thread(event); + break; + default: break; } @@ -771,11 +812,21 @@ static ptid_t winnt_wait( struct target_waitstatus * waitstatus, int target_options) { - struct __dbg_event * event; + int pfd; + struct __dbg_event * event; + struct winnt_process * process; if (!(event = winnt_wait_event(ptid))) return null_ptid; + if (!(process = winnt_process_record(event->syspid))) + return null_ptid; + + pfd = process->pfd; + + inferior_ptid.pid = event->syspid; + inferior_ptid.tid = event->systid; + switch (event->evttype) { case __DBG_STATE_EXCEPTION: case __DBG_STATE_BREAKPOINT: @@ -784,22 +835,24 @@ static ptid_t winnt_wait( waitstatus->value.sig = GDB_SIGNAL_TRAP; break; + case __DBG_STATE_EXIT_THREAD: + waitstatus->kind = TARGET_WAITKIND_SPURIOUS; + waitstatus->value.integer = 0; + winnt_respond(pfd,event,__DBG_RESPONSE_CONTINUE); + break; + case __DBG_STATE_CREATE_PROCESS: case __DBG_STATE_CREATE_THREAD: case __DBG_STATE_IDLE: case __DBG_STATE_REPLY_PENDING: case __DBG_STATE_DLL_LOAD: case __DBG_STATE_DLL_UNLOAD: - case __DBG_STATE_EXIT_THREAD: case __DBG_STATE_EXIT_PROCESS: waitstatus->kind = TARGET_WAITKIND_SPURIOUS; waitstatus->value.integer = 0; break; } - inferior_ptid.pid = event->syspid; - inferior_ptid.tid = event->systid; - target_terminal_ours(); return inferior_ptid; -- cgit v1.2.3