diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c index 3d370f7a980..52f8b6ec618 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 3e205d4165b..1fb345bc5fa 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 86efb01cc31..600113ff02d 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 7a7feb3cf9d..4a65296eb56 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 ea545d5c30e..e2bfa50c7ba 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 c5c006ce419..1f0e71f1b6b 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 )