8#ifndef THREADWAITDIAGNOSTIC_H
9#define THREADWAITDIAGNOSTIC_H
11#include "pedigree/kernel/process/WaitQueue.h"
12#include "pedigree/kernel/utilities/StaticString.h"
22 reason(WaitQueue::WakeReason::Waiting),
30 uintptr_t channelOwner;
31 uintptr_t channelValue;
32 WaitQueue::WakeReason reason;
38inline const char* threadWaitReasonName(WaitQueue::WakeReason reason) {
40 case WaitQueue::WakeReason::Waiting:
42 case WaitQueue::WakeReason::Signalled:
44 case WaitQueue::WakeReason::Event:
46 case WaitQueue::WakeReason::Unwinding:
48 case WaitQueue::WakeReason::Terminating:
50 case WaitQueue::WakeReason::Spurious:
59 line +=
" [INVALID: sleeping without waitq]";
65 line.append(wait.queue, 16);
67 line.append(wait.channelOwner, 16);
69 line.append(wait.channelValue, 16);
71 line += threadWaitReasonName(wait.reason);
73 line.append(wait.stateLevel);
75 if (wait.mutexOwner) {
77 line.append(wait.mutexOwner, 16);
80 line += wait.queued ?
", queued]" :
", publishing]";