2007-11-12 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. --- gdb/gdbserver/win32-low.c | 28 ++++++++++++++++++++-------- gdb/gdbserver/win32-low.h | 9 ++++++++- 2 files changed, 28 insertions(+), 9 deletions(-) Index: src/gdb/gdbserver/win32-low.c =================================================================== --- src.orig/gdb/gdbserver/win32-low.c 2007-11-04 23:50:36.000000000 +0000 +++ src/gdb/gdbserver/win32-low.c 2007-11-04 23:51:44.000000000 +0000 @@ -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_lis 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_lis 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; Index: src/gdb/gdbserver/win32-low.h =================================================================== --- src.orig/gdb/gdbserver/win32-low.h 2007-11-04 23:50:36.000000000 +0000 +++ src/gdb/gdbserver/win32-low.h 2007-11-04 23:51:16.000000000 +0000 @@ -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;