* 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.
This commit is contained in:
Pedro Alves 2007-12-03 01:10:30 +00:00
parent 0421e13edb
commit c436e841ff
3 changed files with 41 additions and 9 deletions

View File

@ -1,3 +1,16 @@
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

View File

@ -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, &current_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;

View File

@ -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;