Author: Ben Jackson
Date: 2025-02-03T14:39:43-08:00
New Revision: c26bb4f095120ff4741b6530b6b3c0ac5a7dacad

URL: 
https://github.com/llvm/llvm-project/commit/c26bb4f095120ff4741b6530b6b3c0ac5a7dacad
DIFF: 
https://github.com/llvm/llvm-project/commit/c26bb4f095120ff4741b6530b6b3c0ac5a7dacad.diff

LOG: [lldb] correct event when removing all watchpoints (#125312)

LLDB: correct event when removing all watchpoints
    
    Previously we incorrectly checked for a "breakpoint changed" event
    listener removing all watchpoints (e.g. via
SBTarget::DeleteAllWatchpoints()), although we would emit a "watchpoint
    changed" event if there were a listener for 'breakpoint changed'.
    
This meant that we might not emit a "watchpoint changed" event if there
    was a listener for this event.
    
    Correct it to check for the "watchpoint changed" event.


---


Updated regression tests which were also incorrectly peeking for the
wrong event type. The 'remove' action actually triggers 2 events which
the test didn't allow, so I updated it to allow specifically what was
requested.

The test fails (expectedly) at the line following "DeleteAllWatchpoints"
prior to this patch, and passes after.

Added: 
    

Modified: 
    lldb/source/Breakpoint/WatchpointList.cpp
    lldb/test/API/commands/watchpoints/watchpoint_events/TestWatchpointEvents.py

Removed: 
    


################################################################################
diff  --git a/lldb/source/Breakpoint/WatchpointList.cpp 
b/lldb/source/Breakpoint/WatchpointList.cpp
index f7564483e6f1fcd..57369b76c03aff0 100644
--- a/lldb/source/Breakpoint/WatchpointList.cpp
+++ b/lldb/source/Breakpoint/WatchpointList.cpp
@@ -236,7 +236,7 @@ void WatchpointList::RemoveAll(bool notify) {
       wp_collection::iterator pos, end = m_watchpoints.end();
       for (pos = m_watchpoints.begin(); pos != end; ++pos) {
         if ((*pos)->GetTarget().EventTypeHasListeners(
-                Target::eBroadcastBitBreakpointChanged)) {
+                Target::eBroadcastBitWatchpointChanged)) {
           auto data_sp = std::make_shared<Watchpoint::WatchpointEventData>(
               eWatchpointEventTypeRemoved, *pos);
           (*pos)->GetTarget().BroadcastEvent(

diff  --git 
a/lldb/test/API/commands/watchpoints/watchpoint_events/TestWatchpointEvents.py 
b/lldb/test/API/commands/watchpoints/watchpoint_events/TestWatchpointEvents.py
index 726a9d93c29d460..6e05cf06204a7d5 100644
--- 
a/lldb/test/API/commands/watchpoints/watchpoint_events/TestWatchpointEvents.py
+++ 
b/lldb/test/API/commands/watchpoints/watchpoint_events/TestWatchpointEvents.py
@@ -82,27 +82,45 @@ def test_with_python_api(self):
             'make sure watchpoint condition is "' + condition + '"',
         )
 
-    def GetWatchpointEvent(self, event_type):
-        # We added a watchpoint so we should get a watchpoint added event.
-        event = lldb.SBEvent()
-        success = self.listener.WaitForEvent(1, event)
-        self.assertTrue(success, "Successfully got watchpoint event")
-        self.assertTrue(
-            lldb.SBWatchpoint.EventIsWatchpointEvent(event),
-            "Event is a watchpoint event.",
+        target.DeleteWatchpoint(local_watch.GetID())
+        self.GetWatchpointEvent(
+            lldb.eWatchpointEventTypeDisabled, lldb.eWatchpointEventTypeRemoved
         )
-        found_type = lldb.SBWatchpoint.GetWatchpointEventTypeFromEvent(event)
-        self.assertEqual(
-            found_type,
-            event_type,
-            "Event is not correct type, expected: %d, found: %d"
-            % (event_type, found_type),
+
+        # Re-create it so that we can check DeleteAllWatchpoints
+        local_watch = local_var.Watch(True, False, True, error)
+        if not error.Success():
+            self.fail(
+                "Failed to make watchpoint for local_var: %s" % 
(error.GetCString())
+            )
+        self.GetWatchpointEvent(lldb.eWatchpointEventTypeAdded)
+        target.DeleteAllWatchpoints()
+        self.GetWatchpointEvent(
+            lldb.eWatchpointEventTypeDisabled, lldb.eWatchpointEventTypeRemoved
         )
+
+    def GetWatchpointEvent(self, *event_types):
+        # We added a watchpoint so we should get a watchpoint added event.
+        event = lldb.SBEvent()
+        for event_type in event_types:
+            success = self.listener.WaitForEvent(1, event)
+            self.assertTrue(success, "Successfully got watchpoint event")
+            self.assertTrue(
+                lldb.SBWatchpoint.EventIsWatchpointEvent(event),
+                "Event is a watchpoint event.",
+            )
+            found_type = 
lldb.SBWatchpoint.GetWatchpointEventTypeFromEvent(event)
+            self.assertEqual(
+                found_type,
+                event_type,
+                "Event is not correct type, expected: %d, found: %d"
+                % (event_type, found_type),
+            )
         # There shouldn't be another event waiting around:
         found_event = self.listener.PeekAtNextEventForBroadcasterWithType(
-            self.target_bcast, lldb.SBTarget.eBroadcastBitBreakpointChanged, 
event
+            self.target_bcast, lldb.SBTarget.eBroadcastBitWatchpointChanged, 
event
         )
         if found_event:
-            print("Found an event I didn't expect: ", event)
+            print("Found an event I didn't expect: ", event.GetType())
 
-        self.assertTrue(not found_event, "Only one event per change.")
+        self.assertTrue(not found_event, f"Only expected {len(event_types)} 
events.")


        
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to