From 9c18d92f3665f949dcfb1cb222346d58344e8d2c Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Thu, 30 Aug 2007 19:47:43 +0200
Subject: [PATCH] server: Detaching from a process needs to continue all the
 pending events.

---
 server/debugger.c | 29 ++++++++++++-----------------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/server/debugger.c b/server/debugger.c
index eb89ef9ff49..ee8ef10bc8a 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -451,7 +451,7 @@ static int debugger_attach( struct process *process, struct thread *debugger )
 /* detach a process from a debugger thread (and resume it ?) */
 int debugger_detach( struct process *process, struct thread *debugger )
 {
-    struct debug_event *event;
+    struct debug_event *event, *next;
     struct debug_ctx *debug_ctx;
 
     if (!process->debugger || process->debugger != debugger)
@@ -464,23 +464,18 @@ int debugger_detach( struct process *process, struct thread *debugger )
     /* send continue indication for all events */
     debug_ctx = debugger->debug_ctx;
 
-    /* find the event in the queue
-     * FIXME: could loop on process' threads and look the debug_event field */
-    LIST_FOR_EACH_ENTRY( event, &debug_ctx->event_queue, struct debug_event, entry )
+    /* free all events from this process */
+    LIST_FOR_EACH_ENTRY_SAFE( event, next, &debug_ctx->event_queue, struct debug_event, entry )
     {
-        if (event->state != EVENT_QUEUED) continue;
-
-        if (event->sender->process == process)
-        {
-            assert( event->sender->debug_event == event );
-            event->status = DBG_CONTINUE;
-            event->state  = EVENT_CONTINUED;
-            wake_up( &event->obj, 0 );
-            unlink_event( debug_ctx, event );
-            /* from queued debug event */
-            resume_process( process );
-            break;
-        }
+        if (event->sender->process != process) continue;
+
+        assert( event->state != EVENT_CONTINUED );
+        event->status = DBG_CONTINUE;
+        event->state  = EVENT_CONTINUED;
+        wake_up( &event->obj, 0 );
+        unlink_event( debug_ctx, event );
+        /* from queued debug event */
+        resume_process( process );
     }
 
     /* remove relationships between process and its debugger */
-- 
GitLab