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
Notes:
sideshowbarker
2024-07-18 05:01:22 +09:00
Author: https://github.com/kleinesfilmroellchen Commit: https://github.com/SerenityOS/serenity/commit/601ede331b Pull-request: https://github.com/SerenityOS/serenity/pull/16011 Reviewed-by: https://github.com/ADKaster ✅
1 changed files with 53 additions and 0 deletions
|
@ -18,6 +18,28 @@ namespace Threading {
|
|||
|
||||
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 {
|
||||
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());
|
||||
}
|
||||
};
|
||||
|
||||
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
Reference in a new issue