summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2019-09-15 21:43:18 +0000
committermidipix <writeonce@midipix.org>2019-09-16 07:07:35 +0000
commitb75fa37d5aa9d6a4834325e6baf3a61627431bd1 (patch)
tree4cf3aa534aa9f6fe25ebea0cafe5c10312fa756f
parente8aae1bb96522e64a9cdf82be40b3cf71f2f711d (diff)
downloadchainport-b75fa37d5aa9d6a4834325e6baf3a61627431bd1.tar.bz2
chainport-b75fa37d5aa9d6a4834325e6baf3a61627431bd1.tar.xz
mgdb: winnt_delete_thread(): initial implementation and integration.
-rw-r--r--overlay/mgdb/gdb/winnt-nat.c63
1 files 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;