From 1b1bd56777358ef2fa538a9b7b62c6e8c823489b Mon Sep 17 00:00:00 2001 From: johannst Date: Sat, 26 Sep 2020 23:58:24 +0200 Subject: added finished flag to thread + catch exceptions in thread entry function as unwinding across entry fn would be catastrophic --- lib/executor.cc | 3 +++ lib/thread.cc | 16 +++++++++++++--- lib/thread.h | 3 +++ 3 files changed, 19 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/executor.cc b/lib/executor.cc index fb79b49..af49f0e 100644 --- a/lib/executor.cc +++ b/lib/executor.cc @@ -12,6 +12,9 @@ namespace nMatcha { void Executor::run() { for (const std::unique_ptr& t : mThreads) { + if (t->isFinished()) { + continue; + } yield_to(t.get()); } } diff --git a/lib/thread.cc b/lib/thread.cc index d665f49..ec7fd64 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -6,7 +6,9 @@ #include "executor.h" #include -#include // uintN_t +#include // uintN_t +#include +#include #include // mmap #include // sysconf @@ -15,7 +17,7 @@ namespace { } // namespace namespace nMatcha { - Thread::Thread() : mStackPtr(nullptr), mExecutor(nullptr) { + Thread::Thread() : mStackPtr(nullptr), mFinished(false), mExecutor(nullptr) { const long PAGE_SIZE = get_pagesize(); const long STACK_SIZE = 8 * PAGE_SIZE; @@ -64,7 +66,15 @@ namespace nMatcha { void Thread::entry(void* obj) { Thread* t = static_cast(obj); - t->threadFn(); + try { + t->threadFn(); + } catch (const std::exception& e) { + std::cerr << "Thread: caught unhandled std::exception!\n" << e.what() << std::endl; + } catch (...) { + std::cerr << "Thread: caught unhandled unknown exception!" << std::endl; + } + t->mFinished = true; + t->yield(); } void Thread::yield() { diff --git a/lib/thread.h b/lib/thread.h index e392052..d983734 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -13,12 +13,15 @@ namespace nMatcha { virtual void threadFn() = 0; + bool isFinished() const { return mFinished; } + protected: void yield(); private: static void entry(void* obj); void* mStackPtr; + bool mFinished; friend struct Executor; const Executor* mExecutor; -- cgit v1.2.3