wine/ server/thread.c server/protocol.def serv ...

Alexandre Julliard julliard at wine.codeweavers.com
Tue Nov 1 15:47:08 CST 2005


ChangeSet ID:	21028
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/01 15:47:07

Modified files:
	server         : thread.c protocol.def debugger.c 
	include/wine   : server_protocol.h 
	dlls/ntdll     : exception.c 
	dlls/kernel    : except.c 

Log message:
	Don't send an extra signal when waiting for a debug event, just do a
	normal wait.  Return the debug event status directly as return value
	of the server call.

Patch: http://cvs.winehq.org/patch.py?id=21028

Old revision  New revision  Changes     Path
 1.127         1.128         +1 -0       wine/server/thread.c
 1.158         1.159         +0 -1       wine/server/protocol.def
 1.58          1.59          +2 -2       wine/server/debugger.c
 1.159         1.160         +1 -1       wine/include/wine/server_protocol.h
 1.87          1.88          +3 -7       wine/dlls/ntdll/exception.c
 1.14          1.15          +3 -7       wine/dlls/kernel/except.c

Index: wine/server/thread.c
diff -u -p wine/server/thread.c:1.127 wine/server/thread.c:1.128
--- wine/server/thread.c:1.127	1 Nov 2005 21:47: 7 -0000
+++ wine/server/thread.c	1 Nov 2005 21:47: 7 -0000
@@ -315,6 +315,7 @@ static void set_thread_info( struct thre
 /* stop a thread (at the Unix level) */
 void stop_thread( struct thread *thread )
 {
+    if (thread->context) return;  /* already inside a debug event, no need for a signal */
     /* can't stop a thread while initialisation is in progress */
     if (is_process_init_done(thread->process)) send_thread_signal( thread, SIGUSR1 );
 }
Index: wine/server/protocol.def
diff -u -p wine/server/protocol.def:1.158 wine/server/protocol.def:1.159
--- wine/server/protocol.def:1.158	1 Nov 2005 21:47: 7 -0000
+++ wine/server/protocol.def	1 Nov 2005 21:47: 7 -0000
@@ -1162,7 +1162,6 @@ enum char_info_mode
 @REQ(get_exception_status)
     obj_handle_t     handle;   /* handle to the queued event */
 @REPLY
-    int              status;   /* event continuation status */
     VARARG(context,context);   /* modified thread context */
 @END
 
Index: wine/server/debugger.c
diff -u -p wine/server/debugger.c:1.58 wine/server/debugger.c:1.59
--- wine/server/debugger.c:1.58	1 Nov 2005 21:47: 8 -0000
+++ wine/server/debugger.c	1 Nov 2005 21:47: 8 -0000
@@ -661,19 +661,19 @@ DECL_HANDLER(get_exception_status)
 {
     struct debug_event *event;
 
-    reply->status = 0;
     if ((event = (struct debug_event *)get_handle_obj( current->process, req->handle,
                                                        0, &debug_event_ops )))
     {
+        close_handle( current->process, req->handle, NULL );
         if (event->state == EVENT_CONTINUED)
         {
-            reply->status = event->status;
             if (current->context == &event->context)
             {
                 size_t size = min( sizeof(CONTEXT), get_reply_max_size() );
                 set_reply_data( &event->context, size );
                 current->context = NULL;
             }
+            set_error( event->status );
         }
         else set_error( STATUS_PENDING );
         release_object( event );
Index: wine/include/wine/server_protocol.h
diff -u -p wine/include/wine/server_protocol.h:1.159 wine/include/wine/server_protocol.h:1.160
--- wine/include/wine/server_protocol.h:1.159	1 Nov 2005 21:47: 8 -0000
+++ wine/include/wine/server_protocol.h	1 Nov 2005 21:47: 8 -0000
@@ -4207,6 +4207,6 @@ union generic_reply
     struct set_mailslot_info_reply set_mailslot_info_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 195
+#define SERVER_PROTOCOL_VERSION 196
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
Index: wine/dlls/ntdll/exception.c
diff -u -p wine/dlls/ntdll/exception.c:1.87 wine/dlls/ntdll/exception.c:1.88
--- wine/dlls/ntdll/exception.c:1.87	1 Nov 2005 21:47: 8 -0000
+++ wine/dlls/ntdll/exception.c	1 Nov 2005 21:47: 8 -0000
@@ -164,19 +164,15 @@ static int send_debug_event( EXCEPTION_R
     SERVER_END_REQ;
     if (!handle) return 0;
 
-    /* No need to wait on the handle since the process gets suspended
-     * once the event is passed to the debugger, so when we get back
-     * here the event has been continued already.
-     */
+    NTDLL_wait_for_multiple_objects( 1, &handle, 0, NULL, 0 );
+
     SERVER_START_REQ( get_exception_status )
     {
         req->handle = handle;
         wine_server_set_reply( req, context, sizeof(*context) );
-        wine_server_call( req );
-        ret = reply->status;
+        ret = wine_server_call( req );
     }
     SERVER_END_REQ;
-    NtClose( handle );
     return ret;
 }
 
Index: wine/dlls/kernel/except.c
diff -u -p wine/dlls/kernel/except.c:1.14 wine/dlls/kernel/except.c:1.15
--- wine/dlls/kernel/except.c:1.14	1 Nov 2005 21:47: 8 -0000
+++ wine/dlls/kernel/except.c	1 Nov 2005 21:47: 8 -0000
@@ -196,19 +196,15 @@ static NTSTATUS send_debug_event( EXCEPT
     SERVER_END_REQ;
     if (ret) return ret;
 
-    /* No need to wait on the handle since the process gets suspended
-     * once the event is passed to the debugger, so when we get back
-     * here the event has been continued already.
-     */
+    WaitForSingleObject( handle, INFINITE );
+
     SERVER_START_REQ( get_exception_status )
     {
         req->handle = handle;
         wine_server_set_reply( req, context, sizeof(*context) );
-        wine_server_call( req );
-        ret = reply->status;
+        ret = wine_server_call( req );
     }
     SERVER_END_REQ;
-    NtClose( handle );
     return ret;
 }
 



More information about the wine-cvs mailing list