shadPS4/src/core/libraries/kernel/thread_management.h

204 lines
6.2 KiB
C
Raw Normal View History

2024-02-23 22:32:32 +01:00
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
2023-07-17 22:46:25 +02:00
#pragma once
2024-04-05 18:33:38 +02:00
#include <atomic>
#include <mutex>
2024-02-23 22:32:32 +01:00
#include <string>
#include <vector>
2023-07-18 17:54:46 +02:00
#include <pthread.h>
#include <sched.h>
2023-11-10 18:52:41 +01:00
#include "common/types.h"
namespace Core::Loader {
class SymbolsResolver;
}
2024-04-13 23:35:48 +02:00
namespace Libraries::Kernel {
constexpr int ORBIS_KERNEL_PRIO_FIFO_DEFAULT = 700;
constexpr int ORBIS_KERNEL_PRIO_FIFO_HIGHEST = 256;
constexpr int ORBIS_KERNEL_PRIO_FIFO_LOWEST = 767;
2023-07-17 22:46:25 +02:00
2023-11-16 08:14:10 +01:00
struct PthreadInternal;
2023-07-18 17:54:46 +02:00
struct PthreadAttrInternal;
2023-11-10 18:52:41 +01:00
struct PthreadMutexInternal;
struct PthreadMutexattrInternal;
2023-11-16 08:14:10 +01:00
struct PthreadCondInternal;
struct PthreadCondAttrInternal;
struct PthreadRwInternal;
struct PthreadRwLockAttrInternal;
class PthreadKeys;
2023-07-18 17:54:46 +02:00
2023-11-10 18:52:41 +01:00
using SceKernelSchedParam = ::sched_param;
2023-11-16 07:49:26 +01:00
using ScePthread = PthreadInternal*;
2023-07-18 17:54:46 +02:00
using ScePthreadAttr = PthreadAttrInternal*;
2023-11-10 18:52:41 +01:00
using ScePthreadMutex = PthreadMutexInternal*;
using ScePthreadMutexattr = PthreadMutexattrInternal*;
2023-11-16 08:14:10 +01:00
using ScePthreadCond = PthreadCondInternal*;
using ScePthreadCondattr = PthreadCondAttrInternal*;
using OrbisPthreadRwlock = PthreadRwInternal*;
using OrbisPthreadRwlockattr = PthreadRwLockAttrInternal*;
using OrbisPthreadKey = u32;
2023-07-18 17:54:46 +02:00
using PthreadKeyDestructor = PS4_SYSV_ABI void (*)(void*);
using PthreadEntryFunc = PS4_SYSV_ABI void* (*)(void*);
2023-11-16 07:49:26 +01:00
2023-07-18 17:54:46 +02:00
struct PthreadInternal {
2024-02-23 22:32:32 +01:00
u8 reserved[4096];
std::string name;
pthread_t pth;
ScePthreadAttr attr;
PthreadEntryFunc entry;
2024-04-04 18:16:10 +02:00
void* arg;
std::atomic_bool is_started;
std::atomic_bool is_detached;
std::atomic_bool is_almost_done;
std::atomic_bool is_free;
using Destructor = std::pair<OrbisPthreadKey, PthreadKeyDestructor>;
std::vector<Destructor> key_destructors;
2024-07-04 10:22:43 +02:00
int prio;
2023-07-18 17:54:46 +02:00
};
2023-11-06 00:11:54 +01:00
2023-07-18 17:54:46 +02:00
struct PthreadAttrInternal {
2024-02-23 22:32:32 +01:00
u8 reserved[64];
2023-07-18 17:54:46 +02:00
u64 affinity;
size_t guard_size;
int policy;
bool detached;
pthread_attr_t pth_attr;
2023-07-18 17:54:46 +02:00
};
2023-11-10 18:52:41 +01:00
struct PthreadMutexInternal {
2024-02-23 22:32:32 +01:00
u8 reserved[256];
2023-11-10 18:52:41 +01:00
std::string name;
pthread_mutex_t pth_mutex;
};
2023-07-18 17:54:46 +02:00
2023-11-10 18:52:41 +01:00
struct PthreadMutexattrInternal {
2024-02-23 22:32:32 +01:00
u8 reserved[64];
2023-11-10 18:52:41 +01:00
pthread_mutexattr_t pth_mutex_attr;
int pprotocol;
};
2023-11-16 08:14:10 +01:00
struct PthreadCondInternal {
2024-02-23 22:32:32 +01:00
u8 reserved[256];
2023-11-16 08:14:10 +01:00
std::string name;
pthread_cond_t cond;
};
struct PthreadCondAttrInternal {
2024-02-23 22:32:32 +01:00
u8 reserved[64];
2023-11-16 08:14:10 +01:00
pthread_condattr_t cond_attr;
clockid_t clock;
2023-11-16 08:14:10 +01:00
};
struct PthreadRwLockAttrInternal {
u8 reserved[64];
pthread_rwlockattr_t attr_rwlock;
int type;
};
struct PthreadRwInternal {
pthread_rwlock_t pth_rwlock;
std::string name;
};
2024-04-04 18:16:10 +02:00
class PThreadPool {
public:
ScePthread Create();
2024-04-04 18:16:10 +02:00
private:
std::vector<ScePthread> m_threads;
std::mutex m_mutex;
};
2023-11-10 18:52:41 +01:00
class PThreadCxt {
public:
ScePthreadMutexattr* getDefaultMutexattr() {
return &m_default_mutexattr;
}
void setDefaultMutexattr(ScePthreadMutexattr attr) {
m_default_mutexattr = attr;
}
ScePthreadCondattr* getDefaultCondattr() {
return &m_default_condattr;
}
void setDefaultCondattr(ScePthreadCondattr attr) {
m_default_condattr = attr;
}
2024-04-04 18:16:10 +02:00
ScePthreadAttr* GetDefaultAttr() {
return &m_default_attr;
}
void SetDefaultAttr(ScePthreadAttr attr) {
m_default_attr = attr;
}
PThreadPool* GetPthreadPool() {
return m_pthread_pool;
}
void SetPthreadPool(PThreadPool* pool) {
m_pthread_pool = pool;
}
OrbisPthreadRwlockattr* getDefaultRwattr() {
return &m_default_Rwattr;
}
void setDefaultRwattr(OrbisPthreadRwlockattr attr) {
m_default_Rwattr = attr;
}
private:
2023-11-10 18:52:41 +01:00
ScePthreadMutexattr m_default_mutexattr = nullptr;
2023-11-16 08:14:10 +01:00
ScePthreadCondattr m_default_condattr = nullptr;
2024-04-04 18:16:10 +02:00
ScePthreadAttr m_default_attr = nullptr;
PThreadPool* m_pthread_pool = nullptr;
OrbisPthreadRwlockattr m_default_Rwattr = nullptr;
2023-11-10 18:52:41 +01:00
};
2023-11-12 09:57:50 +01:00
2023-11-10 18:52:41 +01:00
void init_pthreads();
2023-11-12 09:57:50 +01:00
void pthreadInitSelfMainThread();
2023-11-10 18:52:41 +01:00
int PS4_SYSV_ABI scePthreadAttrInit(ScePthreadAttr* attr);
int PS4_SYSV_ABI scePthreadAttrSetdetachstate(ScePthreadAttr* attr, int detachstate);
int PS4_SYSV_ABI scePthreadAttrSetinheritsched(ScePthreadAttr* attr, int inheritSched);
int PS4_SYSV_ABI scePthreadAttrSetschedparam(ScePthreadAttr* attr,
const SceKernelSchedParam* param);
2023-11-10 18:52:41 +01:00
int PS4_SYSV_ABI scePthreadAttrSetschedpolicy(ScePthreadAttr* attr, int policy);
ScePthread PS4_SYSV_ABI scePthreadSelf();
int PS4_SYSV_ABI scePthreadAttrSetaffinity(ScePthreadAttr* pattr,
const /*SceKernelCpumask*/ u64 mask);
2023-11-16 07:49:26 +01:00
int PS4_SYSV_ABI scePthreadSetaffinity(ScePthread thread, const /*SceKernelCpumask*/ u64 mask);
2024-07-28 17:43:44 +02:00
int PS4_SYSV_ABI scePthreadGetaffinity(ScePthread thread, /*SceKernelCpumask*/ u64* mask);
int PS4_SYSV_ABI scePthreadCreate(ScePthread* thread, const ScePthreadAttr* attr,
PthreadEntryFunc start_routine, void* arg, const char* name);
2024-07-28 17:43:44 +02:00
int PS4_SYSV_ABI scePthreadSetprio(ScePthread thread, int prio);
2023-11-10 18:52:41 +01:00
/***
* Mutex calls
*/
int PS4_SYSV_ABI scePthreadMutexInit(ScePthreadMutex* mutex, const ScePthreadMutexattr* attr,
const char* name);
2023-11-10 18:52:41 +01:00
int PS4_SYSV_ABI scePthreadMutexattrInit(ScePthreadMutexattr* attr);
int PS4_SYSV_ABI scePthreadMutexattrSettype(ScePthreadMutexattr* attr, int type);
int PS4_SYSV_ABI scePthreadMutexattrSetprotocol(ScePthreadMutexattr* attr, int protocol);
int PS4_SYSV_ABI scePthreadMutexLock(ScePthreadMutex* mutex);
int PS4_SYSV_ABI scePthreadMutexUnlock(ScePthreadMutex* mutex);
2023-11-10 18:52:41 +01:00
/****
2023-11-16 12:31:12 +01:00
* Cond calls
*/
int PS4_SYSV_ABI scePthreadCondInit(ScePthreadCond* cond, const ScePthreadCondattr* attr,
const char* name);
2023-11-16 12:31:12 +01:00
int PS4_SYSV_ABI scePthreadCondattrInit(ScePthreadCondattr* attr);
int PS4_SYSV_ABI scePthreadCondBroadcast(ScePthreadCond* cond);
int PS4_SYSV_ABI scePthreadCondWait(ScePthreadCond* cond, ScePthreadMutex* mutex);
/****
2023-11-10 18:52:41 +01:00
* Posix calls
*/
int PS4_SYSV_ABI posix_pthread_mutex_init(ScePthreadMutex* mutex, const ScePthreadMutexattr* attr);
2023-11-10 20:08:32 +01:00
int PS4_SYSV_ABI posix_pthread_mutex_lock(ScePthreadMutex* mutex);
int PS4_SYSV_ABI posix_pthread_mutex_unlock(ScePthreadMutex* mutex);
2023-11-16 12:31:12 +01:00
int PS4_SYSV_ABI posix_pthread_cond_broadcast(ScePthreadCond* cond);
2023-07-18 17:54:46 +02:00
2024-04-13 23:35:48 +02:00
void pthreadSymbolsRegister(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::Kernel