* win32-low.c (win32_get_thread_context)

(win32_set_thread_context): New functions.
	(thread_rec): Use win32_get_thread_context.
	(continue_one_thread, win32_resume): Use win32_set_thread_context.
	* win32-low.h (win32_thread_info) [_WIN32_WCE]: Add `base_context'
	field.
This commit is contained in:
Pedro Alves 2007-12-03 01:27:19 +00:00
parent 4d5d1aaa19
commit 9c6c819469
3 changed files with 51 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2007-12-03 Pedro Alves <pedro_alves@portugalmail.pt>
* win32-low.c (win32_get_thread_context)
(win32_set_thread_context): New functions.
(thread_rec): Use win32_get_thread_context.
(continue_one_thread, win32_resume): Use win32_set_thread_context.
* win32-low.h (win32_thread_info) [_WIN32_WCE]: Add `base_context'
field.
2007-12-03 Leo Zayas
Pedro Alves <pedro_alves@portugalmail.pt>

View File

@ -100,6 +100,39 @@ current_inferior_tid (void)
return th->tid;
}
/* Get the thread context of the thread associated with TH. */
static void
win32_get_thread_context (win32_thread_info *th)
{
memset (&th->context, 0, sizeof (CONTEXT));
(*the_low_target.get_thread_context) (th, &current_event);
#ifdef _WIN32_WCE
memcpy (&th->base_context, &th->context, sizeof (CONTEXT));
#endif
}
/* Set the thread context of the thread associated with TH. */
static void
win32_set_thread_context (win32_thread_info *th)
{
#ifdef _WIN32_WCE
/* Calling SuspendThread on a thread that is running kernel code
will report that the suspending was successful, but in fact, that
will often not be true. In those cases, the context returned by
GetThreadContext will not be correct by the time the thread
stops, hence we can't set that context back into the thread when
resuming - it will most likelly crash the inferior.
Unfortunately, there is no way to know when the thread will
really stop. To work around it, we'll only write the context
back to the thread when either the user or GDB explicitly change
it between stopping and resuming. */
if (memcmp (&th->context, &th->base_context, sizeof (CONTEXT)) != 0)
#endif
(*the_low_target.set_thread_context) (th, &current_event);
}
/* Find a thread record given a thread id. If GET_CONTEXT is set then
also retrieve the context for this thread. */
static win32_thread_info *
@ -127,7 +160,7 @@ thread_rec (DWORD id, int get_context)
th->suspended = 1;
}
(*the_low_target.get_thread_context) (th, &current_event);
win32_get_thread_context (th);
}
return th;
@ -281,7 +314,7 @@ continue_one_thread (struct inferior_list_entry *this_thread, void *id_ptr)
{
if (th->context.ContextFlags)
{
(*the_low_target.set_thread_context) (th, &current_event);
win32_set_thread_context (th);
th->context.ContextFlags = 0;
}
@ -806,7 +839,7 @@ win32_resume (struct thread_resume *resume_info)
"in this configuration.\n");
}
(*the_low_target.set_thread_context) (th, &current_event);
win32_set_thread_context (th);
th->context.ContextFlags = 0;
}
}

View File

@ -31,7 +31,12 @@ typedef struct win32_thread_info
/* Non zero if SuspendThread was called on this thread. */
int suspended;
/* The context of the thread. */
#ifdef _WIN32_WCE
/* The context as retrieved right after suspending the thread. */
CONTEXT base_context;
#endif
/* The context of the thread, including any manipulations. */
CONTEXT context;
} win32_thread_info;