diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 09a46d4bb2..86f4d72979 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,16 @@ +2007-12-03 Leo Zayas + Pedro Alves + + * win32-low.h (win32_thread_info): Add descriptions to the + structure members. Replace `suspend_count' counter by a + `suspended' flag. + * win32-low.c (thread_rec): Update condition of when to get the + context from the inferior. Rely on ContextFlags being set if it + has already been retrieved. Only suspend the inferior thread if + we haven't already. Warn if that fails. + (continue_one_thread): s/suspend_count/suspended/. Only call + ResumeThread once. Warn if that fails. + 2007-12-02 Pedro Alves * win32-low.c (win32_wait): Don't read from the inferior when it diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 188d5554f5..cc959819c1 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -105,10 +105,19 @@ thread_rec (DWORD id, int get_context) return NULL; th = inferior_target_data (thread); - if (!th->suspend_count && get_context) + if (get_context && th->context.ContextFlags == 0) { - if (id != current_event.dwThreadId) - th->suspend_count = SuspendThread (th->h) + 1; + if (!th->suspended) + { + if (SuspendThread (th->h) == (DWORD) -1) + { + DWORD err = GetLastError (); + OUTMSG (("warning: SuspendThread failed in thread_rec, " + "(error %d): %s\n", (int) err, strwinerror (err))); + } + else + th->suspended = 1; + } (*the_low_target.get_thread_context) (th, ¤t_event); } @@ -259,10 +268,9 @@ continue_one_thread (struct inferior_list_entry *this_thread, void *id_ptr) struct thread_info *thread = (struct thread_info *) this_thread; int thread_id = * (int *) id_ptr; win32_thread_info *th = inferior_target_data (thread); - int i; if ((thread_id == -1 || thread_id == th->tid) - && th->suspend_count) + && th->suspended) { if (th->context.ContextFlags) { @@ -270,9 +278,13 @@ continue_one_thread (struct inferior_list_entry *this_thread, void *id_ptr) th->context.ContextFlags = 0; } - for (i = 0; i < th->suspend_count; i++) - (void) ResumeThread (th->h); - th->suspend_count = 0; + if (ResumeThread (th->h) == (DWORD) -1) + { + DWORD err = GetLastError (); + OUTMSG (("warning: ResumeThread failed in continue_one_thread, " + "(error %d): %s\n", (int) err, strwinerror (err))); + } + th->suspended = 0; } return 0; diff --git a/gdb/gdbserver/win32-low.h b/gdb/gdbserver/win32-low.h index cef57c51ad..c2bf06a363 100644 --- a/gdb/gdbserver/win32-low.h +++ b/gdb/gdbserver/win32-low.h @@ -22,9 +22,16 @@ each thread. */ typedef struct win32_thread_info { + /* The Win32 thread identifier. */ DWORD tid; + + /* The handle to the thread. */ HANDLE h; - int suspend_count; + + /* Non zero if SuspendThread was called on this thread. */ + int suspended; + + /* The context of the thread. */ CONTEXT context; } win32_thread_info;