Alexandre Julliard : ntdll: Don't call terminate_thread request if not necessary.

Alexandre Julliard julliard at winehq.org
Fri May 29 15:22:55 CDT 2020


Module: wine
Branch: master
Commit: 42bd67b576027ea6e7c53bccbd9476a2a97472cb
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=42bd67b576027ea6e7c53bccbd9476a2a97472cb

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 29 12:25:16 2020 +0200

ntdll: Don't call terminate_thread request if not necessary.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/thread.c            | 18 ++++++++++--------
 include/wine/server_protocol.h |  4 ++--
 server/protocol.def            |  1 -
 server/request.h               |  1 -
 server/thread.c                |  8 +-------
 server/trace.c                 |  1 -
 6 files changed, 13 insertions(+), 20 deletions(-)

diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 3d370f7a98..52f8b6ec61 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -738,17 +738,19 @@ NTSTATUS WINAPI NtAlertThread( HANDLE handle )
 NTSTATUS WINAPI NtTerminateThread( HANDLE handle, LONG exit_code )
 {
     NTSTATUS ret;
-    BOOL self;
+    BOOL self = (handle == GetCurrentThread());
 
-    SERVER_START_REQ( terminate_thread )
+    if (!self || exit_code)
     {
-        req->handle    = wine_server_obj_handle( handle );
-        req->exit_code = exit_code;
-        ret = wine_server_call( req );
-        self = !ret && reply->self;
+        SERVER_START_REQ( terminate_thread )
+        {
+            req->handle    = wine_server_obj_handle( handle );
+            req->exit_code = exit_code;
+            ret = wine_server_call( req );
+            self = !ret && reply->self;
+        }
+        SERVER_END_REQ;
     }
-    SERVER_END_REQ;
-
     if (self) abort_thread( exit_code );
     return ret;
 }
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 3e205d4165..1fb345bc5f 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -938,7 +938,7 @@ struct terminate_thread_reply
 {
     struct reply_header __header;
     int          self;
-    int          last;
+    char __pad_12[4];
 };
 
 
@@ -6685,7 +6685,7 @@ union generic_reply
 
 /* ### protocol_version begin ### */
 
-#define SERVER_PROTOCOL_VERSION 604
+#define SERVER_PROTOCOL_VERSION 605
 
 /* ### protocol_version end ### */
 
diff --git a/server/protocol.def b/server/protocol.def
index 86efb01cc3..600113ff02 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -896,7 +896,6 @@ struct rawinput_device
     int          exit_code;    /* thread exit code */
 @REPLY
     int          self;         /* suicide? */
-    int          last;         /* last thread in this process? */
 @END
 
 
diff --git a/server/request.h b/server/request.h
index 7a7feb3cf9..4a65296eb5 100644
--- a/server/request.h
+++ b/server/request.h
@@ -814,7 +814,6 @@ C_ASSERT( FIELD_OFFSET(struct terminate_thread_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct terminate_thread_request, exit_code) == 16 );
 C_ASSERT( sizeof(struct terminate_thread_request) == 24 );
 C_ASSERT( FIELD_OFFSET(struct terminate_thread_reply, self) == 8 );
-C_ASSERT( FIELD_OFFSET(struct terminate_thread_reply, last) == 12 );
 C_ASSERT( sizeof(struct terminate_thread_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_process_info_request, handle) == 12 );
 C_ASSERT( sizeof(struct get_process_info_request) == 16 );
diff --git a/server/thread.c b/server/thread.c
index ea545d5c30..e2bfa50c7b 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1489,17 +1489,11 @@ DECL_HANDLER(terminate_thread)
 {
     struct thread *thread;
 
-    reply->self = 0;
-    reply->last = 0;
     if ((thread = get_thread_from_handle( req->handle, THREAD_TERMINATE )))
     {
         thread->exit_code = req->exit_code;
         if (thread != current) kill_thread( thread, 1 );
-        else
-        {
-            reply->self = 1;
-            reply->last = (thread->process->running_threads == 1);
-        }
+        else reply->self = 1;
         release_object( thread );
     }
 }
diff --git a/server/trace.c b/server/trace.c
index c5c006ce41..1f0e71f1b6 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1368,7 +1368,6 @@ static void dump_terminate_thread_request( const struct terminate_thread_request
 static void dump_terminate_thread_reply( const struct terminate_thread_reply *req )
 {
     fprintf( stderr, " self=%d", req->self );
-    fprintf( stderr, ", last=%d", req->last );
 }
 
 static void dump_get_process_info_request( const struct get_process_info_request *req )




More information about the wine-cvs mailing list