From 3a7d377d9eecaf4253bf335314d5b32030f87dbf Mon Sep 17 00:00:00 2001 From: Alan Frindell Date: Thu, 6 Apr 2017 14:00:58 -0700 Subject: [PATCH] Get rid of try/catch in messageAvailable, which is now noexcept Summary: The problem with catching the exception here is stack information is lost. Just let it std::terminate if it throws Reviewed By: ikobzar Differential Revision: D4831909 fbshipit-source-id: 42139bd7caee0fedff13328d52fa3be1c517e730 --- folly/io/async/EventBase.cpp | 16 +--------------- folly/io/async/test/EventBaseTest.cpp | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/folly/io/async/EventBase.cpp b/folly/io/async/EventBase.cpp index 895e1a49..8d6c03f2 100644 --- a/folly/io/async/EventBase.cpp +++ b/folly/io/async/EventBase.cpp @@ -54,21 +54,7 @@ class EventBase::FunctionRunner // wake up the loop. We can ignore these messages. return; } - - // The function should never throw an exception, because we have no - // way of knowing what sort of error handling to perform. - // - // If it does throw, log a message and abort the program. - try { - msg(); - } catch (const std::exception& ex) { - LOG(ERROR) << "runInEventBaseThread() function threw a " - << typeid(ex).name() << " exception: " << ex.what(); - abort(); - } catch (...) { - LOG(ERROR) << "runInEventBaseThread() function threw an exception"; - abort(); - } + msg(); } }; diff --git a/folly/io/async/test/EventBaseTest.cpp b/folly/io/async/test/EventBaseTest.cpp index 01157f91..ae455c7e 100644 --- a/folly/io/async/test/EventBaseTest.cpp +++ b/folly/io/async/test/EventBaseTest.cpp @@ -1351,6 +1351,21 @@ TEST(EventBaseTest, RunInLoopStopLoop) { ASSERT_LE(c1.getCount(), 11); } +TEST(EventBaseTest, messageAvailableException) { + auto deadManWalking = [] { + EventBase eventBase; + std::thread t([&] { + // Call this from another thread to force use of NotificationQueue in + // runInEventBaseThread + eventBase.runInEventBaseThread( + []() { throw std::runtime_error("boom"); }); + }); + t.join(); + eventBase.loopForever(); + }; + EXPECT_DEATH(deadManWalking(), ".*"); +} + TEST(EventBaseTest, TryRunningAfterTerminate) { EventBase eventBase; CountedLoopCallback c1(&eventBase, 1, -- 2.34.1