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