[Lldb-commits] [lldb] [lldb] Fix race condition in Process::WaitForProcessToStop() (PR #144919)
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Mon Jul 7 00:09:17 PDT 2025
================
@@ -150,3 +150,84 @@ TEST(ListenerTest, StartStopListeningForEventSpec) {
ASSERT_EQ(event_sp->GetBroadcaster(), &broadcaster1);
ASSERT_FALSE(listener_sp->GetEvent(event_sp, std::chrono::seconds(0)));
}
+
+TEST(ListenerTest, MoveEventsOnHijackAndRestore) {
+ Broadcaster broadcaster(nullptr, "test-broadcaster");
+ const uint32_t event_mask = 1;
+ EventSP event_sp;
+
+ // Create the original listener and start listening.
+ ListenerSP original_listener = Listener::MakeListener("original-listener");
+ ASSERT_EQ(event_mask, original_listener->StartListeningForEvents(&broadcaster,
+ event_mask));
+ broadcaster.SetPrimaryListener(original_listener);
+
+ // Queue two events to original listener, but do not consume them yet.
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+
+ // Hijack.
+ ListenerSP hijack_listener = Listener::MakeListener("hijack-listener");
+ broadcaster.HijackBroadcaster(hijack_listener, event_mask);
+
+ // The events should have been moved to the hijack listener.
+ EXPECT_FALSE(original_listener->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(hijack_listener->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(hijack_listener->GetEvent(event_sp, std::chrono::seconds(0)));
+
+ // Queue two events while hijacked, but do not consume them yet.
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+
+ // Restore the original listener.
+ broadcaster.RestoreBroadcaster();
+
+ // The events queued while hijacked should have been moved back to the
+ // original listener.
+ EXPECT_FALSE(hijack_listener->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(original_listener->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(original_listener->GetEvent(event_sp, std::chrono::seconds(0)));
+}
+
+TEST(ListenerTest, MoveEventsBetweenHijackers) {
+ Broadcaster broadcaster(nullptr, "test-broadcaster");
+ const uint32_t event_mask = 1;
+ EventSP event_sp;
+
+ // Create the original listener and start listening.
+ ListenerSP original_listener = Listener::MakeListener("original-listener");
+ ASSERT_EQ(event_mask, original_listener->StartListeningForEvents(&broadcaster,
+ event_mask));
+ broadcaster.SetPrimaryListener(original_listener);
+
+ // First hijack.
+ ListenerSP hijack_listener1 = Listener::MakeListener("hijack-listener1");
+ broadcaster.HijackBroadcaster(hijack_listener1, event_mask);
+
+ // Queue two events while hijacked, but do not consume
+ // them yet.
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+
+ // Second hijack.
+ ListenerSP hijack_listener2 = Listener::MakeListener("hijack-listener2");
+ broadcaster.HijackBroadcaster(hijack_listener2, event_mask);
+
+ // The second hijacker should have the events now.
+ EXPECT_FALSE(hijack_listener1->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(hijack_listener2->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(hijack_listener2->GetEvent(event_sp, std::chrono::seconds(0)));
+
+ // Queue two events while hijacked with second hijacker, but do not consume
+ // them yet.
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+ broadcaster.BroadcastEvent(event_mask, nullptr);
+
+ // Restore the previous hijacker.
+ broadcaster.RestoreBroadcaster();
+
+ // The first hijacker should now have the events.
+ EXPECT_FALSE(hijack_listener2->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(hijack_listener1->GetEvent(event_sp, std::chrono::seconds(0)));
+ EXPECT_TRUE(hijack_listener1->GetEvent(event_sp, std::chrono::seconds(0)));
+}
----------------
labath wrote:
add a newline here
https://github.com/llvm/llvm-project/pull/144919
More information about the lldb-commits
mailing list