Module: wine Branch: master Commit: e1eb6228f47eafbf41a4cb080678360b77505055 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e1eb6228f47eafbf41a4cb0806...
Author: Alexandre Julliard julliard@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 );