Badminton-Scoreboard/Libraries/libil2cpp/include/vm/Thread.h
2023-10-08 10:24:48 +08:00

165 lines
5.8 KiB
C++

#pragma once
#include <stdint.h>
#include <vector>
#include <string>
#include "il2cpp-config.h"
#include "os/Thread.h"
#include "utils/NonCopyable.h"
struct MethodInfo;
struct Il2CppArray;
struct Il2CppDomain;
struct Il2CppObject;
struct Il2CppThread;
struct Il2CppInternalThread;
struct Il2CppString;
namespace il2cpp
{
namespace vm
{
// System.Threading.ThreadState
enum ThreadState
{
kThreadStateRunning = 0x00000000,
kThreadStateStopRequested = 0x00000001,
kThreadStateSuspendRequested = 0x00000002,
kThreadStateBackground = 0x00000004,
kThreadStateUnstarted = 0x00000008,
kThreadStateStopped = 0x00000010,
kThreadStateWaitSleepJoin = 0x00000020,
kThreadStateSuspended = 0x00000040,
kThreadStateAbortRequested = 0x00000080,
kThreadStateAborted = 0x00000100,
// This enum is used with the ~ operator to clear values. to avoid undefined
// behavior in C++, the cleared state of each value should also be present
// in the enum.
kThreadStateRunningCleared = ~kThreadStateRunning,
kThreadStateStopRequestedCleared = ~kThreadStateStopRequested,
kThreadStateSuspendRequestedCleared = ~kThreadStateSuspendRequested,
kThreadStateBackgroundCleared = ~kThreadStateBackground,
kThreadStateUnstartedCleared = ~kThreadStateUnstarted,
kThreadStateStoppedCleared = ~kThreadStateStopped,
kThreadStateWaitSleepJoinCleared = ~kThreadStateWaitSleepJoin,
kThreadStateSuspendedCleared = ~kThreadStateSuspended,
kThreadStateAbortRequestedCleared = ~kThreadStateAbortRequested,
kThreadStateAbortedCleared = ~kThreadStateAborted,
};
// System.Threading.ApartmentState
enum ThreadApartmentState
{
kThreadApartmentStateSTA = 0x00000000,
kThreadApartmentStateMTA = 0x00000001,
kThreadApartmentStateUnknown = 0x00000002
};
class LIBIL2CPP_CODEGEN_API Thread
{
public:
static std::string GetName(Il2CppInternalThread* thread);
static void SetName(Il2CppThread* thread, Il2CppString* name);
static void SetName(Il2CppInternalThread* thread, Il2CppString* name);
static Il2CppThread* Current();
static Il2CppThread* Attach(Il2CppDomain *domain);
static void Detach(Il2CppThread *thread);
static void WalkFrameStack(Il2CppThread *thread, Il2CppFrameWalkFunc func, void *user_data);
static Il2CppThread** GetAllAttachedThreads(size_t &size);
static void AbortAllThreads();
static Il2CppThread* Main();
static bool IsVmThread(Il2CppThread *thread);
static uint64_t GetId(Il2CppThread *thread);
static uint64_t GetId(Il2CppInternalThread* thread);
static void RequestInterrupt(Il2CppThread* thread);
static void CheckCurrentThreadForInterruptAndThrowIfNecessary();
static bool RequestAbort(Il2CppThread* thread);
static void CheckCurrentThreadForAbortAndThrowIfNecessary();
static void ResetAbort(Il2CppThread* thread);
static bool RequestAbort(Il2CppInternalThread* thread);
static void ResetAbort(Il2CppInternalThread* thread);
static void SetPriority(Il2CppThread* thread, int32_t priority);
static int32_t GetPriority(Il2CppThread* thread);
struct NativeThreadAbortException {};
public:
// internal
static void Initialize();
static void Uninitialize();
static void AdjustStaticData();
static int32_t AllocThreadStaticData(int32_t size);
static void FreeThreadStaticData(Il2CppThread *thread);
static void* GetThreadStaticData(int32_t offset);
static void* GetThreadStaticDataForThread(int32_t offset, Il2CppThread* thread);
static void* GetThreadStaticDataForThread(int32_t offset, Il2CppInternalThread* thread);
static void Register(Il2CppThread *thread);
static void Unregister(Il2CppThread *thread);
static void SetupInternalManagedThread(Il2CppThread* thread, os::Thread* osThread);
/// Initialize and register thread.
/// NOTE: Must be called on thread!
static void InitializeManagedThread(Il2CppThread *thread, Il2CppDomain* domain);
static void UninitializeManagedThread(Il2CppThread *thread);
static void SetMain(Il2CppThread* thread);
static void SetState(Il2CppThread *thread, ThreadState value);
static ThreadState GetState(Il2CppThread *thread);
static void ClrState(Il2CppThread* thread, ThreadState clr);
static void FullMemoryBarrier();
static int32_t GetNewManagedId();
static Il2CppInternalThread* CurrentInternal();
static void ClrState(Il2CppInternalThread* thread, ThreadState clr);
static void SetState(Il2CppInternalThread *thread, ThreadState value);
static ThreadState GetState(Il2CppInternalThread *thread);
static bool TestState(Il2CppInternalThread* thread, ThreadState value);
static Il2CppInternalThread* CreateInternal(void(*func)(void*), void* arg, bool threadpool_thread, uint32_t stack_size);
static void Stop(Il2CppInternalThread* thread);
static void Sleep(uint32_t ms);
static bool YieldInternal();
static void SetDefaultAffinityMask(int64_t affinityMask);
private:
static Il2CppThread* s_MainThread;
};
class ThreadStateSetter : il2cpp::utils::NonCopyable
{
public:
ThreadStateSetter(ThreadState state) : m_State(state)
{
m_Thread = il2cpp::vm::Thread::Current();
Thread::SetState(m_Thread, m_State);
}
~ThreadStateSetter()
{
Thread::ClrState(m_Thread, m_State);
}
private:
ThreadState m_State;
Il2CppThread* m_Thread;
};
} /* namespace vm */
} /* namespace il2cpp */