Alexandre Julliard : server: Don't store the debugger thread in debug events.
Alexandre Julliard
julliard at winehq.org
Thu Jan 28 15:41:41 CST 2021
Module: wine
Branch: master
Commit: aec961e5292b6fdddcfca9b6b6637517f1320cdd
URL: https://source.winehq.org/git/wine.git/?a=commit;h=aec961e5292b6fdddcfca9b6b6637517f1320cdd
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jan 28 10:02:36 2021 +0100
server: Don't store the debugger thread in debug events.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/debugger.c | 30 ++++++++++--------------------
1 file changed, 10 insertions(+), 20 deletions(-)
diff --git a/server/debugger.c b/server/debugger.c
index 8930a5a535a..8906a044842 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -46,7 +46,6 @@ struct debug_event
struct object obj; /* object header */
struct list entry; /* entry in event queue */
struct thread *sender; /* thread which sent this event */
- struct thread *debugger; /* debugger thread receiving the event */
struct file *file; /* file object for events that need one */
enum debug_event_state state; /* event state */
int status; /* continuation status */
@@ -240,11 +239,8 @@ static void unlink_event( struct debug_obj *debug_obj, struct debug_event *event
}
/* link an event at the end of the queue */
-static void link_event( struct debug_event *event )
+static void link_event( struct debug_obj *debug_obj, struct debug_event *event )
{
- struct debug_obj *debug_obj = event->debugger->debug_obj;
-
- assert( debug_obj );
grab_object( event );
list_add_tail( &debug_obj->event_queue, &event->entry );
if (!event->sender->process->debug_event)
@@ -257,11 +253,8 @@ static void link_event( struct debug_event *event )
}
/* resume a delayed debug event already in the queue */
-static void resume_event( struct debug_event *event )
+static void resume_event( struct debug_obj *debug_obj, struct debug_event *event )
{
- struct debug_obj *debug_obj = event->debugger->debug_obj;
-
- assert( debug_obj );
event->state = EVENT_QUEUED;
if (!event->sender->process->debug_event)
{
@@ -272,11 +265,8 @@ static void resume_event( struct debug_event *event )
}
/* delay a debug event already in the queue to be replayed when thread wakes up */
-static void delay_event( struct debug_event *event )
+static void delay_event( struct debug_obj *debug_obj, struct debug_event *event )
{
- struct debug_obj *debug_obj = event->debugger->debug_obj;
-
- assert( debug_obj );
event->state = EVENT_DELAYED;
if (event->sender->process->debug_event == event) event->sender->process->debug_event = NULL;
}
@@ -318,7 +308,6 @@ static void debug_event_destroy( struct object *obj )
if (event->file) release_object( event->file );
release_object( event->sender );
- release_object( event->debugger );
}
static void debug_obj_dump( struct object *obj, int verbose )
@@ -397,14 +386,14 @@ static int continue_debug_event( struct process *process, struct thread *thread,
if (event->sender != thread) continue;
if (thread->suspend)
{
- delay_event( event );
+ delay_event( debug_obj, event );
resume_process( process );
}
else if (event->state == EVENT_SENT)
{
assert( event->sender->process->debug_event == event );
event->sender->process->debug_event = NULL;
- resume_event( event );
+ resume_event( debug_obj, event );
return 1;
}
}
@@ -446,7 +435,6 @@ static struct debug_event *alloc_debug_event( struct thread *thread, int code, c
if (!(event = alloc_object( &debug_event_ops ))) return NULL;
event->state = EVENT_QUEUED;
event->sender = (struct thread *)grab_object( thread );
- event->debugger = (struct thread *)grab_object( debugger );
event->file = NULL;
memset( &event->data, 0, sizeof(event->data) );
@@ -460,10 +448,11 @@ void generate_debug_event( struct thread *thread, int code, const void *arg )
{
if (thread->process->debugger)
{
+ struct debug_obj *debug_obj = thread->process->debugger->debug_obj;
struct debug_event *event = alloc_debug_event( thread, code, arg );
if (event)
{
- link_event( event );
+ link_event( debug_obj, event );
suspend_process( thread->process );
release_object( event );
}
@@ -483,7 +472,7 @@ void resume_delayed_debug_events( struct thread *thread )
{
if (event->sender != thread) continue;
if (event->state != EVENT_DELAYED) continue;
- resume_event( event );
+ resume_event( debugger->debug_obj, event );
suspend_process( thread->process );
}
}
@@ -740,6 +729,7 @@ DECL_HANDLER(queue_exception_event)
if (current->process->debugger)
{
debug_event_t data;
+ struct debug_obj *debug_obj = current->process->debugger->debug_obj;
struct debug_event *event;
struct thread *thread = current;
@@ -763,7 +753,7 @@ DECL_HANDLER(queue_exception_event)
{
if ((reply->handle = alloc_handle( thread->process, event, SYNCHRONIZE, 0 )))
{
- link_event( event );
+ link_event( debug_obj, event );
suspend_process( thread->process );
}
release_object( event );
More information about the wine-cvs
mailing list