diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2019-08-25 18:55:56 +0300 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-08-26 11:31:14 +0200 |
commit | e1a6f8a27d772ad27507394aeb4a7db55d93467c (patch) | |
tree | a67bedeb5841d7deb4f2a9c5364719151eddab3b /Libraries/LibThread/Thread.cpp | |
parent | d5f34872031a90bb449c4c1f9b5080f25a842238 (diff) | |
download | serenity-e1a6f8a27d772ad27507394aeb4a7db55d93467c.zip |
LibThread: Introduce a new threading library
This library is meant to provide C++-style wrappers over lower
level APIs such as syscalls and pthread_* functions, as well as
utilities for easily running pieces of logic on different
threads.
Diffstat (limited to 'Libraries/LibThread/Thread.cpp')
-rw-r--r-- | Libraries/LibThread/Thread.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Libraries/LibThread/Thread.cpp b/Libraries/LibThread/Thread.cpp new file mode 100644 index 0000000000..de5296f353 --- /dev/null +++ b/Libraries/LibThread/Thread.cpp @@ -0,0 +1,39 @@ +#include <LibThread/Thread.h> +#include <unistd.h> + +LibThread::Thread::Thread(Function<int()> action) + : CObject(nullptr) + , m_action(move(action)) +{ +} + +LibThread::Thread::~Thread() +{ + if (m_tid != -1) { + dbg() << "trying to destroy a running thread!"; + ASSERT_NOT_REACHED(); + } +} + +void LibThread::Thread::start() +{ + int rc = create_thread([](void* arg) { + Thread* self = static_cast<Thread*>(arg); + int exit_code = self->m_action(); + self->m_tid = -1; + exit_thread(exit_code); + return exit_code; + }, static_cast<void*>(this)); + + ASSERT(rc > 0); + dbg() << "Started a thread, tid = " << rc; + m_tid = rc; +} + +void LibThread::Thread::quit(int code) +{ + ASSERT(m_tid == gettid()); + + m_tid = -1; + exit_thread(code); +} |