From d42dfdf4b903763997d47b6e2214c2ce33b9bf8e Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 9 Jun 2021 21:59:17 +0800 Subject: import(life): Add operating system experiement. --- works/life/operating-system-experiment/Thread.cpp | 67 +++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 works/life/operating-system-experiment/Thread.cpp (limited to 'works/life/operating-system-experiment/Thread.cpp') diff --git a/works/life/operating-system-experiment/Thread.cpp b/works/life/operating-system-experiment/Thread.cpp new file mode 100644 index 0000000..b91ca69 --- /dev/null +++ b/works/life/operating-system-experiment/Thread.cpp @@ -0,0 +1,67 @@ +#include "Thread.h" + +#include +#include +#include + +namespace cru { +Thread::Thread(Thread &&other) noexcept + : joined_(other.joined_), thread_handle_(other.thread_handle_) { + other.joined_ = false; + other.thread_handle_ = nullptr; +} + +Thread &Thread::operator=(Thread &&other) noexcept { + if (this != &other) { + joined_ = other.joined_; + thread_handle_ = other.thread_handle_; + other.joined_ = false; + other.thread_handle_ = nullptr; + } + + return *this; +} + +Thread::~Thread() { Destroy(); } + +void Thread::Join() { + assert(thread_handle_); + joined_ = true; + WaitForSingleObject(thread_handle_, INFINITE); +} + +void Thread::Detach() { + assert(thread_handle_); + detached_ = true; +} + +void Thread::swap(Thread &other) noexcept { +#ifdef CRU_WINDOWS + Thread temp = std::move(*this); + *this = std::move(other); + other = std::move(temp); +#else +#endif +} + +void Thread::Destroy() noexcept { + if (!detached_ && !joined_ && thread_handle_ != nullptr) { + std::terminate(); + } else { + joined_ = false; + thread_handle_ = nullptr; + } +} + +namespace details { +#ifdef CRU_WINDOWS +DWORD WINAPI ThreadProc(_In_ LPVOID lpParameter) { + auto p = static_cast *>(lpParameter); + (*p)(); + delete p; + return 0; +} +#else +#endif +} // namespace details +} // namespace cru \ No newline at end of file -- cgit v1.2.3