+2007-12-03 Leo Zayas
+ Pedro Alves <pedro_alves@portugalmail.pt>
+
+ * 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 <pedro_alves@portugalmail.pt>
* win32-low.c (win32_wait): Don't read from the inferior when it
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);
}
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)
{
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;
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;