[Lldb-commits] [PATCH] D58230: [lldb] [MainLoop] Add kevent() EINTR handling
Michał Górny via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Thu Feb 14 13:58:25 PST 2019
mgorny updated this revision to Diff 186915.
mgorny edited the summary of this revision.
mgorny added a comment.
Herald added a subscriber: jfb.
Added the test case.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58230/new/
https://reviews.llvm.org/D58230
Files:
lldb/source/Host/common/MainLoop.cpp
lldb/unittests/Host/MainLoopTest.cpp
Index: lldb/unittests/Host/MainLoopTest.cpp
===================================================================
--- lldb/unittests/Host/MainLoopTest.cpp
+++ lldb/unittests/Host/MainLoopTest.cpp
@@ -141,4 +141,28 @@
ASSERT_TRUE(loop.Run().Success());
ASSERT_EQ(1u, callback_count);
}
+
+// Test that a signal which is not monitored by the MainLoop does not
+// cause a premature exit.
+TEST_F(MainLoopTest, UnmonitoredSignal) {
+ MainLoop loop;
+ Status error;
+ struct sigaction sa;
+ sa.sa_sigaction = [](int, siginfo_t *, void *) { };
+ sa.sa_flags = SA_SIGINFO; // important: no SA_RESTART
+ sigemptyset(&sa.sa_mask);
+ ASSERT_EQ(0, sigaction(SIGUSR2, &sa, nullptr));
+
+ auto handle = loop.RegisterSignal(SIGUSR1, make_callback(), error);
+ ASSERT_TRUE(error.Success());
+ std::thread killer([]() {
+ sleep(1);
+ kill(getpid(), SIGUSR2);
+ sleep(1);
+ kill(getpid(), SIGUSR1);
+ });
+ ASSERT_TRUE(loop.Run().Success());
+ killer.join();
+ ASSERT_EQ(1u, callback_count);
+}
#endif
Index: lldb/source/Host/common/MainLoop.cpp
===================================================================
--- lldb/source/Host/common/MainLoop.cpp
+++ lldb/source/Host/common/MainLoop.cpp
@@ -107,8 +107,14 @@
num_events = kevent(loop.m_kqueue, in_events.data(), in_events.size(),
out_events, llvm::array_lengthof(out_events), nullptr);
- if (num_events < 0)
- return Status(errno, eErrorTypePOSIX);
+ if (num_events < 0) {
+ if (errno == EINTR) {
+ // in case of EINTR, let the main loop run one iteration
+ // we need to zero num_events to avoid assertions failing
+ num_events = 0;
+ } else
+ return Status(errno, eErrorTypePOSIX);
+ }
return Status();
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58230.186915.patch
Type: text/x-patch
Size: 1747 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190214/67c7b69c/attachment-0001.bin>
More information about the lldb-commits
mailing list