Module: wine Branch: master Commit: 7f9eb22af8c3c8f9a0d8e07b0e6d8ee89feacd9e URL: https://source.winehq.org/git/wine.git/?a=commit;h=7f9eb22af8c3c8f9a0d8e07b0...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Apr 15 14:55:56 2020 +0200
ntdll: Use server_select to pass context to server in send_debug_event.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/exception.c | 10 +++------- include/wine/server_protocol.h | 4 +--- server/debugger.c | 26 +------------------------- server/protocol.def | 3 --- server/request.h | 1 - server/thread.c | 6 ------ server/thread.h | 1 - server/trace.c | 8 +------- 8 files changed, 6 insertions(+), 53 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index a9ac24e44d..87341654ba 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -131,7 +131,7 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con DWORD i; obj_handle_t handle = 0; client_ptr_t params[EXCEPTION_MAXIMUM_PARAMETERS]; - context_t server_context; + CONTEXT exception_context = *context; select_op_t select_op; sigset_t old_set;
@@ -142,8 +142,6 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con for (i = 0; i < min( rec->NumberParameters, EXCEPTION_MAXIMUM_PARAMETERS ); i++) params[i] = rec->ExceptionInformation[i];
- context_to_server( &server_context, context ); - SERVER_START_REQ( queue_exception_event ) { req->first = first_chance; @@ -153,7 +151,6 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con req->address = wine_server_client_ptr( rec->ExceptionAddress ); req->len = i * sizeof(params[0]); wine_server_add_data( req, params, req->len ); - wine_server_add_data( req, &server_context, sizeof(server_context) ); if (!(ret = wine_server_call( req ))) handle = reply->handle; } SERVER_END_REQ; @@ -162,16 +159,15 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con { select_op.wait.op = SELECT_WAIT; select_op.wait.handles[0] = handle; - server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, NULL, NULL ); + server_select( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE, &exception_context, NULL );
SERVER_START_REQ( get_exception_status ) { req->handle = handle; - wine_server_set_reply( req, &server_context, sizeof(server_context) ); ret = wine_server_call( req ); } SERVER_END_REQ; - if (ret >= 0) context_from_server( context, &server_context ); + if (ret >= 0) *context = exception_context; }
pthread_sigmask( SIG_SETMASK, &old_set, NULL ); diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index ba43aa07ed..9cdb9c765f 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -2522,7 +2522,6 @@ struct queue_exception_event_request client_ptr_t address; data_size_t len; /* VARARG(params,uints64,len); */ - /* VARARG(context,context); */ char __pad_44[4]; }; struct queue_exception_event_reply @@ -2542,7 +2541,6 @@ struct get_exception_status_request struct get_exception_status_reply { struct reply_header __header; - /* VARARG(context,context); */ };
@@ -6686,7 +6684,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 600 +#define SERVER_PROTOCOL_VERSION 601
/* ### protocol_version end ### */
diff --git a/server/debugger.c b/server/debugger.c index 5ff63b92b9..401ce36a47 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -50,7 +50,6 @@ struct debug_event enum debug_event_state state; /* event state */ int status; /* continuation status */ debug_event_t data; /* event data */ - context_t context; /* register context */ };
/* debug context */ @@ -347,11 +346,6 @@ static void debug_event_destroy( struct object *obj ) break; } } - if (event->sender->context == &event->context) - { - event->sender->context = NULL; - stop_thread_if_suspended( event->sender ); - } release_object( event->sender ); release_object( event->debugger ); } @@ -746,13 +740,6 @@ DECL_HANDLER(queue_exception_event)
if ((event = alloc_debug_event( thread, EXCEPTION_DEBUG_EVENT, &data ))) { - const context_t *context = (const context_t *)((const char *)get_req_data() + req->len); - data_size_t size = get_req_data_size() - req->len; - - memset( &event->context, 0, sizeof(event->context) ); - memcpy( &event->context, context, min( sizeof(event->context), size ) ); - thread->context = &event->context; - if ((reply->handle = alloc_handle( thread->process, event, SYNCHRONIZE, 0 ))) { link_event( event ); @@ -772,18 +759,7 @@ DECL_HANDLER(get_exception_status) 0, &debug_event_ops ))) { close_handle( current->process, req->handle ); - if (event->state == EVENT_CONTINUED) - { - if (current->context == &event->context) - { - data_size_t size = min( sizeof(context_t), get_reply_max_size() ); - set_reply_data( &event->context, size ); - current->context = NULL; - stop_thread_if_suspended( current ); - } - set_error( event->status ); - } - else set_error( STATUS_PENDING ); + set_error( event->state == EVENT_CONTINUED ? event->status : STATUS_PENDING ); release_object( event ); } } diff --git a/server/protocol.def b/server/protocol.def index 7b92ffd374..1413021a39 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1934,7 +1934,6 @@ enum char_info_mode client_ptr_t address; /* exception address */ data_size_t len; /* size of parameters */ VARARG(params,uints64,len);/* exception parameters */ - VARARG(context,context); /* thread context */ @REPLY obj_handle_t handle; /* handle to the queued event */ @END @@ -1943,8 +1942,6 @@ enum char_info_mode /* Retrieve the status of an exception event */ @REQ(get_exception_status) obj_handle_t handle; /* handle to the queued event */ -@REPLY - VARARG(context,context); /* modified thread context */ @END
diff --git a/server/request.h b/server/request.h index dff5edc893..0d4c083460 100644 --- a/server/request.h +++ b/server/request.h @@ -1377,7 +1377,6 @@ C_ASSERT( FIELD_OFFSET(struct queue_exception_event_reply, handle) == 8 ); C_ASSERT( sizeof(struct queue_exception_event_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_exception_status_request, handle) == 12 ); C_ASSERT( sizeof(struct get_exception_status_request) == 16 ); -C_ASSERT( sizeof(struct get_exception_status_reply) == 8 ); C_ASSERT( FIELD_OFFSET(struct continue_debug_event_request, pid) == 12 ); C_ASSERT( FIELD_OFFSET(struct continue_debug_event_request, tid) == 16 ); C_ASSERT( FIELD_OFFSET(struct continue_debug_event_request, status) == 20 ); diff --git a/server/thread.c b/server/thread.c index 762ddb3580..863a7c18ba 100644 --- a/server/thread.c +++ b/server/thread.c @@ -588,12 +588,6 @@ void stop_thread( struct thread *thread ) if (is_process_init_done(thread->process)) send_thread_signal( thread, SIGUSR1 ); }
-/* stop a thread if it's supposed to be suspended */ -void stop_thread_if_suspended( struct thread *thread ) -{ - if (thread->suspend + thread->process->suspend > 0) stop_thread( thread ); -} - /* suspend a thread */ int suspend_thread( struct thread *thread ) { diff --git a/server/thread.h b/server/thread.h index 9aabcaca99..4b9304fe13 100644 --- a/server/thread.h +++ b/server/thread.h @@ -115,7 +115,6 @@ extern enum select_op get_wait_queue_select_op( struct wait_queue_entry *entry ) extern client_ptr_t get_wait_queue_key( struct wait_queue_entry *entry ); extern void make_wait_abandoned( struct wait_queue_entry *entry ); extern void stop_thread( struct thread *thread ); -extern void stop_thread_if_suspended( struct thread *thread ); extern int wake_thread( struct thread *thread ); extern int wake_thread_queue_entry( struct wait_queue_entry *entry ); extern int add_queue( struct object *obj, struct wait_queue_entry *entry ); diff --git a/server/trace.c b/server/trace.c index e762cd56a0..dd63b166f3 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2435,7 +2435,6 @@ static void dump_queue_exception_event_request( const struct queue_exception_eve dump_uint64( ", address=", &req->address ); fprintf( stderr, ", len=%u", req->len ); dump_varargs_uints64( ", params=", min(cur_size,req->len) ); - dump_varargs_context( ", context=", cur_size ); }
static void dump_queue_exception_event_reply( const struct queue_exception_event_reply *req ) @@ -2448,11 +2447,6 @@ static void dump_get_exception_status_request( const struct get_exception_status fprintf( stderr, " handle=%04x", req->handle ); }
-static void dump_get_exception_status_reply( const struct get_exception_status_reply *req ) -{ - dump_varargs_context( " context=", cur_size ); -} - static void dump_continue_debug_event_request( const struct continue_debug_event_request *req ) { fprintf( stderr, " pid=%04x", req->pid ); @@ -4999,7 +4993,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_next_thread_reply, (dump_func)dump_wait_debug_event_reply, (dump_func)dump_queue_exception_event_reply, - (dump_func)dump_get_exception_status_reply, + NULL, NULL, NULL, NULL,