diff options
author | johannst <johannes.stoelp@gmail.com> | 2020-09-26 23:58:24 +0200 |
---|---|---|
committer | johannst <johannes.stoelp@gmail.com> | 2020-09-26 23:58:24 +0200 |
commit | 1b1bd56777358ef2fa538a9b7b62c6e8c823489b (patch) | |
tree | eeeb80ac415999857093631696c81b02d2217bcc /lib/thread.cc | |
parent | 5cbdde2c97229a552852af57232c4e5bbe814a38 (diff) | |
download | matcha-threads-1b1bd56777358ef2fa538a9b7b62c6e8c823489b.tar.gz matcha-threads-1b1bd56777358ef2fa538a9b7b62c6e8c823489b.zip |
added finished flag to thread + catch exceptions in thread entry function as unwinding across entry fn would be catastrophic
Diffstat (limited to 'lib/thread.cc')
-rw-r--r-- | lib/thread.cc | 16 |
1 files changed, 13 insertions, 3 deletions
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 <cassert> -#include <cstdint> // uintN_t +#include <cstdint> // uintN_t +#include <exception> +#include <iostream> #include <sys/mman.h> // mmap #include <unistd.h> // 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<Thread*>(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() { |