summaryrefslogtreecommitdiff
path: root/Libraries/LibThread/Thread.cpp
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2019-08-25 18:55:56 +0300
committerAndreas Kling <awesomekling@gmail.com>2019-08-26 11:31:14 +0200
commite1a6f8a27d772ad27507394aeb4a7db55d93467c (patch)
treea67bedeb5841d7deb4f2a9c5364719151eddab3b /Libraries/LibThread/Thread.cpp
parentd5f34872031a90bb449c4c1f9b5080f25a842238 (diff)
downloadserenity-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.cpp39
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);
+}