Alexandre Julliard : ntdll: Ask the server to suspend the thread in the get /set_thread_context requests.
Alexandre Julliard
julliard at winehq.org
Fri May 6 13:43:55 CDT 2011
Module: wine
Branch: master
Commit: e1eb6228f47eafbf41a4cb080678360b77505055
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e1eb6228f47eafbf41a4cb080678360b77505055
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 6 12:40:29 2011 +0200
ntdll: Ask the server to suspend the thread in the get/set_thread_context requests.
---
dlls/ntdll/thread.c | 72 +++++++++++++++++++++++---------------------------
1 files changed, 33 insertions(+), 39 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 56eca23..bd6a00c 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -699,7 +699,7 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
SERVER_START_REQ( set_thread_context )
{
req->handle = wine_server_obj_handle( handle );
- req->suspend = 0;
+ req->suspend = 1;
wine_server_add_data( req, &server_context, sizeof(server_context) );
ret = wine_server_call( req );
self = reply->self;
@@ -708,28 +708,25 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
if (ret == STATUS_PENDING)
{
- if (NtSuspendThread( handle, &dummy ) == STATUS_SUCCESS)
+ for (i = 0; i < 100; i++)
{
- for (i = 0; i < 100; i++)
+ SERVER_START_REQ( set_thread_context )
{
- SERVER_START_REQ( set_thread_context )
- {
- req->handle = wine_server_obj_handle( handle );
- req->suspend = 0;
- wine_server_add_data( req, &server_context, sizeof(server_context) );
- ret = wine_server_call( req );
- }
- SERVER_END_REQ;
- if (ret == STATUS_PENDING)
- {
- LARGE_INTEGER timeout;
- timeout.QuadPart = -10000;
- NtDelayExecution( FALSE, &timeout );
- }
- else break;
+ req->handle = wine_server_obj_handle( handle );
+ req->suspend = 0;
+ wine_server_add_data( req, &server_context, sizeof(server_context) );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ if (ret == STATUS_PENDING)
+ {
+ LARGE_INTEGER timeout;
+ timeout.QuadPart = -10000;
+ NtDelayExecution( FALSE, &timeout );
}
- NtResumeThread( handle, &dummy );
+ else break;
}
+ NtResumeThread( handle, &dummy );
if (ret == STATUS_PENDING) ret = STATUS_ACCESS_DENIED;
}
@@ -789,7 +786,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
{
req->handle = wine_server_obj_handle( handle );
req->flags = server_flags;
- req->suspend = 0;
+ req->suspend = 1;
wine_server_set_reply( req, &server_context, sizeof(server_context) );
ret = wine_server_call( req );
self = reply->self;
@@ -798,29 +795,26 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
if (ret == STATUS_PENDING)
{
- if (NtSuspendThread( handle, &dummy ) == STATUS_SUCCESS)
+ for (i = 0; i < 100; i++)
{
- for (i = 0; i < 100; i++)
+ SERVER_START_REQ( get_thread_context )
{
- SERVER_START_REQ( get_thread_context )
- {
- req->handle = wine_server_obj_handle( handle );
- req->flags = server_flags;
- req->suspend = 0;
- wine_server_set_reply( req, &server_context, sizeof(server_context) );
- ret = wine_server_call( req );
- }
- SERVER_END_REQ;
- if (ret == STATUS_PENDING)
- {
- LARGE_INTEGER timeout;
- timeout.QuadPart = -10000;
- NtDelayExecution( FALSE, &timeout );
- }
- else break;
+ req->handle = wine_server_obj_handle( handle );
+ req->flags = server_flags;
+ req->suspend = 0;
+ wine_server_set_reply( req, &server_context, sizeof(server_context) );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ if (ret == STATUS_PENDING)
+ {
+ LARGE_INTEGER timeout;
+ timeout.QuadPart = -10000;
+ NtDelayExecution( FALSE, &timeout );
}
- NtResumeThread( handle, &dummy );
+ else break;
}
+ NtResumeThread( handle, &dummy );
if (ret == STATUS_PENDING) ret = STATUS_ACCESS_DENIED;
}
if (!ret) ret = context_from_server( context, &server_context );
More information about the wine-cvs
mailing list