event: Add non-owning constructor
This allows internal store event objects without having to contain
circular references. A circular reference in an event source will cause
the event loop from ever cleaning up correctly.
Change-Id: I23fe0c95093953071216cf1deeb17e79defb7ffb
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/event.cpp b/test/event.cpp
index 1bf5976..ff574be 100644
--- a/test/event.cpp
+++ b/test/event.cpp
@@ -43,6 +43,40 @@
EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
}
+TEST_F(EventTest, CopyEventNoOwn)
+{
+ Event event(expected_event, std::false_type(), &mock);
+ EXPECT_EQ(&mock, event.getSdEvent());
+ EXPECT_EQ(expected_event, event.get());
+
+ Event event_noown(event, sdeventplus::internal::NoOwn());
+ EXPECT_EQ(&mock, event_noown.getSdEvent());
+ EXPECT_EQ(expected_event, event_noown.get());
+
+ EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+}
+
+TEST_F(EventTest, CopyEventNoOwnCopy)
+{
+ Event event(expected_event, std::false_type(), &mock);
+ EXPECT_EQ(&mock, event.getSdEvent());
+ EXPECT_EQ(expected_event, event.get());
+
+ Event event_noown(event, sdeventplus::internal::NoOwn());
+ EXPECT_EQ(&mock, event_noown.getSdEvent());
+ EXPECT_EQ(expected_event, event_noown.get());
+
+ EXPECT_CALL(mock, sd_event_ref(expected_event))
+ .WillOnce(Return(expected_event));
+ Event event2(event_noown);
+ EXPECT_EQ(&mock, event2.getSdEvent());
+ EXPECT_EQ(expected_event, event2.get());
+
+ EXPECT_CALL(mock, sd_event_unref(expected_event))
+ .WillOnce(Return(nullptr))
+ .WillOnce(Return(nullptr));
+}
+
TEST_F(EventTest, GetNewEvent)
{
EXPECT_CALL(mock, sd_event_new(testing::_))