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