From: Rémi Bernon rbernon@codeweavers.com
--- server/debugger.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-)
diff --git a/server/debugger.c b/server/debugger.c index 8024556d77d..460483a1591 100644 --- a/server/debugger.c +++ b/server/debugger.c @@ -43,6 +43,7 @@ enum debug_event_state { EVENT_QUEUED, EVENT_SENT, EVENT_DELAYED, EVENT_CONTINUE struct debug_event { struct object obj; /* object header */ + struct event *sync; /* event object as sync */ struct list entry; /* entry in event queue */ struct thread *sender; /* thread which sent this event */ struct file *file; /* file object for events that need one */ @@ -76,18 +77,8 @@ struct debug_obj
static void debug_event_dump( struct object *obj, int verbose ); static struct sync *debug_event_get_sync( struct object *obj ); -static int debug_event_signaled( struct object *obj, struct wait_queue_entry *entry ); static void debug_event_destroy( struct object *obj );
-static const struct sync_ops debug_event_sync_ops = -{ - add_queue, /* add_queue */ - remove_queue, /* remove_queue */ - debug_event_signaled, /* signaled */ - no_satisfied, /* satisfied */ - no_signal, /* signal */ -}; - static const struct object_ops debug_event_ops = { sizeof(struct debug_event), /* size */ @@ -273,6 +264,7 @@ static void link_event( struct debug_obj *debug_obj, struct debug_event *event ) static void resume_event( struct debug_obj *debug_obj, struct debug_event *event ) { event->state = EVENT_QUEUED; + reset_event( event->sync ); if (!event->sender->process->debug_event) { grab_object( debug_obj ); @@ -285,6 +277,7 @@ static void resume_event( struct debug_obj *debug_obj, struct debug_event *event static void delay_event( struct debug_obj *debug_obj, struct debug_event *event ) { event->state = EVENT_DELAYED; + reset_event( event->sync ); if (event->sender->process->debug_event == event) event->sender->process->debug_event = NULL; }
@@ -315,14 +308,7 @@ static struct sync *debug_event_get_sync( struct object *obj ) { struct debug_event *debug_event = (struct debug_event *)obj; assert( obj->ops == &debug_event_ops ); - return &debug_event->obj.sync; -} - -static int debug_event_signaled( struct object *obj, struct wait_queue_entry *entry ) -{ - struct debug_event *debug_event = (struct debug_event *)obj; - assert( obj->ops == &debug_event_ops ); - return debug_event->state == EVENT_CONTINUED; + return get_event_sync( debug_event->sync ); }
static void debug_event_destroy( struct object *obj ) @@ -332,6 +318,7 @@ static void debug_event_destroy( struct object *obj )
if (event->file) release_object( event->file ); release_object( event->sender ); + release_object( event->sync ); }
static void debug_obj_dump( struct object *obj, int verbose ) @@ -433,7 +420,7 @@ static int continue_debug_event( struct debug_obj *debug_obj, struct process *pr assert( event->sender->process->debug_event == event ); event->status = status; event->state = EVENT_CONTINUED; - wake_up( &event->obj, 0 ); + set_event( event->sync ); unlink_event( debug_obj, event ); resume_process( process ); return 1; @@ -454,7 +441,7 @@ static struct debug_event *alloc_debug_event( struct thread *thread, int code, c
/* build the event */ if (!(event = alloc_object( &debug_event_ops ))) return NULL; - event->obj.sync.ops = &debug_event_sync_ops; + event->sync = create_event_sync( 1, 0 ); event->state = EVENT_QUEUED; event->sender = (struct thread *)grab_object( thread ); event->file = NULL; @@ -546,7 +533,7 @@ void debugger_detach( struct process *process, struct debug_obj *debug_obj ) assert( event->state != EVENT_CONTINUED ); event->status = DBG_CONTINUE; event->state = EVENT_CONTINUED; - wake_up( &event->obj, 0 ); + set_event( event->sync ); unlink_event( debug_obj, event ); /* from queued debug event */ resume_process( process ); @@ -592,6 +579,7 @@ DECL_HANDLER(wait_debug_event) if ((event = find_event_to_send( debug_obj ))) { event->state = EVENT_SENT; + reset_event( event->sync ); event->sender->process->debug_event = event; reply->pid = get_process_id( event->sender->process ); reply->tid = get_thread_id( event->sender );