rpcsx/orbis-kernel/include/orbis/thread/Thread.hpp

59 lines
1.2 KiB
C++
Raw Normal View History

2023-07-03 13:10:16 +02:00
#pragma once
2023-07-06 18:16:25 +02:00
#include "ThreadState.hpp"
2023-07-03 13:10:16 +02:00
#include "orbis-config.hpp"
#include "types.hpp"
#include "../KernelAllocator.hpp"
#include "../ucontext.hpp"
2023-07-20 14:10:38 +02:00
#include "../utils/SharedCV.hpp"
#include "../utils/SharedMutex.hpp"
#include <atomic>
2023-07-17 06:33:25 +02:00
#include <thread>
2023-07-03 13:10:16 +02:00
namespace orbis {
struct Process;
2023-07-03 13:10:16 +02:00
struct Thread {
2023-07-20 14:10:38 +02:00
utils::shared_mutex mtx;
2023-07-03 13:10:16 +02:00
Process *tproc = nullptr;
uint64_t retval[2]{};
void *context{};
ptr<void> stackStart;
ptr<void> stackEnd;
uint64_t fsBase{};
uint64_t gsBase{};
2023-07-17 06:33:25 +02:00
char name[32]{};
2023-07-03 13:10:16 +02:00
SigSet sigMask = {0x7fff'ffff, ~0u, ~0u, ~0u};
utils::shared_mutex suspend_mtx;
utils::shared_cv suspend_cv;
kdeque<int> signalQueue;
kvector<UContext> sigReturns;
std::atomic<unsigned> suspended{0};
2023-07-03 13:10:16 +02:00
std::int64_t hostTid = -1;
2023-07-03 13:10:16 +02:00
lwpid_t tid = -1;
ThreadState state = ThreadState::INACTIVE;
2023-07-17 06:33:25 +02:00
std::thread handle;
2023-07-06 16:23:50 +02:00
// Used to wake up thread in sleep queue
utils::shared_cv sync_cv;
uint64_t evfResultPattern;
uint64_t evfIsCancelled;
2023-07-20 17:18:12 +02:00
// Print backtrace
void where();
void suspend();
void resume();
void sendSignal(int signo);
2023-07-06 16:23:50 +02:00
// FIXME: implement thread destruction
void incRef() {}
void decRef() {}
2023-07-03 13:10:16 +02:00
};
extern thread_local Thread *g_currentThread;
2023-07-03 13:10:16 +02:00
} // namespace orbis