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"
|
|
|
|
|
|
2024-01-13 18:57:02 +01:00
|
|
|
#include "../KernelAllocator.hpp"
|
|
|
|
|
#include "../ucontext.hpp"
|
2023-07-20 14:10:38 +02:00
|
|
|
#include "../utils/SharedCV.hpp"
|
2023-07-04 19:06:56 +02:00
|
|
|
#include "../utils/SharedMutex.hpp"
|
2024-01-13 18:57:02 +01:00
|
|
|
#include <atomic>
|
2023-07-17 06:33:25 +02:00
|
|
|
#include <thread>
|
2023-07-03 13:10:16 +02:00
|
|
|
|
|
|
|
|
namespace orbis {
|
|
|
|
|
struct Process;
|
2024-01-13 18:57:02 +01:00
|
|
|
|
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
|
|
|
|
2024-01-13 18:57:02 +01: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
|
|
|
|
2024-01-13 18:57:02 +01: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
|
|
|
|
2023-07-20 15:12:57 +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();
|
|
|
|
|
|
2024-01-13 18:57:02 +01:00
|
|
|
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
|
|
|
};
|
2023-10-31 12:22:22 +01:00
|
|
|
|
|
|
|
|
extern thread_local Thread *g_currentThread;
|
2023-07-03 13:10:16 +02:00
|
|
|
} // namespace orbis
|