ntdll: Don't call terminate_thread request if not necessary.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
116890da12
commit
42bd67b576
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 ### */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue