mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 03:37:45 +00:00
LibThreading: Add a thread state enum
This will later be used by Thread to keep track of its state more simply and obviously.
This commit is contained in:
parent
fe004d3389
commit
601ede331b
1 changed files with 53 additions and 0 deletions
|
@ -18,6 +18,28 @@ namespace Threading {
|
||||||
|
|
||||||
AK_TYPEDEF_DISTINCT_ORDERED_ID(intptr_t, ThreadError);
|
AK_TYPEDEF_DISTINCT_ORDERED_ID(intptr_t, ThreadError);
|
||||||
|
|
||||||
|
// States of userspace threads are simplified over actual kernel states (and possibly POSIX states).
|
||||||
|
// There are only a couple of well-defined transitions between these states, and any attempt to call a function in a state where this is not allowed will crash the program.
|
||||||
|
enum class ThreadState : u8 {
|
||||||
|
// Thread has been constructed but not started.
|
||||||
|
// Transitions to Running via start().
|
||||||
|
Startable,
|
||||||
|
// Thread has been started, might be running, and can be joined.
|
||||||
|
// Note that join() (valid to call in this state) only changes the thread state after the thread has exited, so it only ever transitions from Exited to Joined.
|
||||||
|
// Transitions to Detached via detach(), transitions to Exited when the thread finishes its action function.
|
||||||
|
Running,
|
||||||
|
// Thread has not been detached and exited, and has to still be joined.
|
||||||
|
// Transitions to Joined via join().
|
||||||
|
Exited,
|
||||||
|
// Thread has been started but also detached, meaning it cannot be joined.
|
||||||
|
// Transitions to DetachedExited when the thread finishes its action function.
|
||||||
|
Detached,
|
||||||
|
// Thread has exited but was detached, meaning it cannot be joined.
|
||||||
|
DetachedExited,
|
||||||
|
// Thread has exited and been joined.
|
||||||
|
Joined,
|
||||||
|
};
|
||||||
|
|
||||||
class Thread final : public Core::Object {
|
class Thread final : public Core::Object {
|
||||||
C_OBJECT(Thread);
|
C_OBJECT(Thread);
|
||||||
|
|
||||||
|
@ -71,3 +93,34 @@ struct AK::Formatter<Threading::Thread> : AK::Formatter<FormatString> {
|
||||||
return Formatter<FormatString>::format(builder, "Thread \"{}\"({})"sv, thread.thread_name(), thread.tid());
|
return Formatter<FormatString>::format(builder, "Thread \"{}\"({})"sv, thread.thread_name(), thread.tid());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct AK::Formatter<Threading::ThreadState> : AK::Formatter<FormatString> {
|
||||||
|
ErrorOr<void> format(FormatBuilder& builder, Threading::ThreadState state)
|
||||||
|
{
|
||||||
|
String name = "";
|
||||||
|
switch (state) {
|
||||||
|
case Threading::ThreadState::Detached:
|
||||||
|
name = "Detached";
|
||||||
|
break;
|
||||||
|
case Threading::ThreadState::DetachedExited:
|
||||||
|
name = "DetachedExited";
|
||||||
|
break;
|
||||||
|
case Threading::ThreadState::Exited:
|
||||||
|
name = "Exited";
|
||||||
|
break;
|
||||||
|
case Threading::ThreadState::Joined:
|
||||||
|
name = "Joined";
|
||||||
|
break;
|
||||||
|
case Threading::ThreadState::Running:
|
||||||
|
name = "Running";
|
||||||
|
break;
|
||||||
|
case Threading::ThreadState::Startable:
|
||||||
|
name = "Startable";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
return Formatter<FormatString>::format(builder, "{}"sv, name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue