mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 10:56:58 +02:00
Initial commit
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
#ifndef KYTY_COMMON_THREADS_H_
|
||||
#define KYTY_COMMON_THREADS_H_
|
||||
|
||||
#include "common/common.h"
|
||||
#include "common/subsystems.h"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
namespace Common {
|
||||
|
||||
KYTY_SUBSYSTEM_DEFINE(Threads);
|
||||
|
||||
using thread_func_t = void (*)(void*);
|
||||
using wait_poll_func_t = void (*)();
|
||||
|
||||
struct ThreadPrivate;
|
||||
struct MutexPrivate;
|
||||
struct CondVarPrivate;
|
||||
|
||||
class Thread {
|
||||
public:
|
||||
Thread(thread_func_t func, void* arg);
|
||||
~Thread();
|
||||
|
||||
void Join();
|
||||
void Detach();
|
||||
|
||||
// Once a thread has finished, the id may be reused by another thread.
|
||||
[[nodiscard]] std::string GetId() const;
|
||||
|
||||
// The id is unique and can't be reused by another thread.
|
||||
[[nodiscard]] int GetUniqueId() const;
|
||||
|
||||
static void Sleep(uint32_t millis);
|
||||
static void SleepMicro(uint32_t micros);
|
||||
static void SleepNano(uint64_t nanos);
|
||||
static bool IsMainThread();
|
||||
|
||||
// Get current thread id
|
||||
// Once a thread has finished, the id may be reused by another thread.
|
||||
static std::string GetThreadId();
|
||||
|
||||
// Get current thread id
|
||||
// The id is unique and can't be reused by another thread.
|
||||
static int GetThreadIdUnique();
|
||||
|
||||
KYTY_CLASS_NO_COPY(Thread);
|
||||
|
||||
private:
|
||||
std::unique_ptr<ThreadPrivate> m_thread;
|
||||
};
|
||||
|
||||
class Mutex {
|
||||
public:
|
||||
Mutex();
|
||||
~Mutex();
|
||||
|
||||
void Lock();
|
||||
void Unlock();
|
||||
bool TryLock();
|
||||
|
||||
friend class CondVar;
|
||||
|
||||
KYTY_CLASS_NO_COPY(Mutex);
|
||||
|
||||
private:
|
||||
std::unique_ptr<MutexPrivate> m_mutex;
|
||||
};
|
||||
|
||||
class CondVar {
|
||||
public:
|
||||
CondVar();
|
||||
~CondVar();
|
||||
|
||||
void Wait(Mutex* mutex);
|
||||
bool WaitFor(Mutex* mutex, uint32_t micros);
|
||||
void Signal();
|
||||
void SignalAll();
|
||||
|
||||
static void SignalThread(int thread_id);
|
||||
static void SetWaitPollCallback(wait_poll_func_t callback);
|
||||
|
||||
KYTY_CLASS_NO_COPY(CondVar);
|
||||
|
||||
private:
|
||||
std::unique_ptr<CondVarPrivate> m_cond_var;
|
||||
};
|
||||
|
||||
class LockGuard {
|
||||
public:
|
||||
using mutex_type = Mutex;
|
||||
|
||||
// NOLINTNEXTLINE(google-runtime-references)
|
||||
explicit LockGuard(mutex_type& m): m_mutex(m) { m_mutex.Lock(); }
|
||||
|
||||
~LockGuard() { m_mutex.Unlock(); }
|
||||
|
||||
KYTY_CLASS_NO_COPY(LockGuard);
|
||||
|
||||
private:
|
||||
mutex_type& m_mutex;
|
||||
};
|
||||
|
||||
} // namespace Common
|
||||
|
||||
#endif /* KYTY_COMMON_THREADS_H_ */
|
||||
Reference in New Issue
Block a user