mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 17:44:58 +00:00
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.
This commit is contained in:
parent
d5f3487203
commit
e1a6f8a27d
9 changed files with 211 additions and 3 deletions
39
Libraries/LibThread/Thread.cpp
Normal file
39
Libraries/LibThread/Thread.cpp
Normal file
|
@ -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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue