[Lldb-commits] [lldb] r354122 - [lldb] [MainLoop] Add kevent() EINTR handling

Hans Wennborg via lldb-commits lldb-commits at lists.llvm.org
Mon Feb 18 02:31:12 PST 2019


Merged to release_80 in r354255.

On Fri, Feb 15, 2019 at 1:12 PM Michal Gorny via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
>
> Author: mgorny
> Date: Fri Feb 15 04:13:02 2019
> New Revision: 354122
>
> URL: http://llvm.org/viewvc/llvm-project?rev=354122&view=rev
> Log:
> [lldb] [MainLoop] Add kevent() EINTR handling
>
> Add missing EINTR handling for kevent() calls.  If the call is
> interrupted, return from Poll() as if zero events were returned and let
> the polling resume on next iteration.  This fixes test flakiness
> on NetBSD.
>
> Includes a test case suggested by Pavel Labath on D42206.
>
> Differential Revision: https://reviews.llvm.org/D58230
>
> Modified:
>     lldb/trunk/source/Host/common/MainLoop.cpp
>     lldb/trunk/unittests/Host/MainLoopTest.cpp
>
> Modified: lldb/trunk/source/Host/common/MainLoop.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/MainLoop.cpp?rev=354122&r1=354121&r2=354122&view=diff
> ==============================================================================
> --- lldb/trunk/source/Host/common/MainLoop.cpp (original)
> +++ lldb/trunk/source/Host/common/MainLoop.cpp Fri Feb 15 04:13:02 2019
> @@ -107,8 +107,14 @@ Status MainLoop::RunImpl::Poll() {
>    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();
>  }
>
>
> Modified: lldb/trunk/unittests/Host/MainLoopTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Host/MainLoopTest.cpp?rev=354122&r1=354121&r2=354122&view=diff
> ==============================================================================
> --- lldb/trunk/unittests/Host/MainLoopTest.cpp (original)
> +++ lldb/trunk/unittests/Host/MainLoopTest.cpp Fri Feb 15 04:13:02 2019
> @@ -141,4 +141,28 @@ TEST_F(MainLoopTest, Signal) {
>    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
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list