implemented part of rwlock functions (WIP)

This commit is contained in:
georgemoralis 2024-06-07 09:15:34 +03:00
parent f6f3cedc42
commit 2500080773
4 changed files with 108 additions and 38 deletions

View File

@ -251,6 +251,7 @@ constexpr int ORBIS_OK = 0x00000000;
constexpr int ORBIS_FAIL = 0xFFFFFFFF; constexpr int ORBIS_FAIL = 0xFFFFFFFF;
// Libkernel library // Libkernel library
constexpr int ORBIS_KERNEL_ERROR_UNKNOWN = 0x80020000;
constexpr int ORBIS_KERNEL_ERROR_EPERM = 0x80020001; constexpr int ORBIS_KERNEL_ERROR_EPERM = 0x80020001;
constexpr int ORBIS_KERNEL_ERROR_ENOENT = 0x80020002; constexpr int ORBIS_KERNEL_ERROR_ENOENT = 0x80020002;
constexpr int ORBIS_KERNEL_ERROR_ESRCH = 0x80020003; constexpr int ORBIS_KERNEL_ERROR_ESRCH = 0x80020003;

View File

@ -23,6 +23,8 @@ struct PthreadMutexInternal;
struct PthreadMutexattrInternal; struct PthreadMutexattrInternal;
struct PthreadCondInternal; struct PthreadCondInternal;
struct PthreadCondAttrInternal; struct PthreadCondAttrInternal;
struct PthreadRwInternal;
struct PthreadRwLockAttrInernal;
using SceKernelSchedParam = ::sched_param; using SceKernelSchedParam = ::sched_param;
using ScePthread = PthreadInternal*; using ScePthread = PthreadInternal*;
@ -31,6 +33,8 @@ using ScePthreadMutex = PthreadMutexInternal*;
using ScePthreadMutexattr = PthreadMutexattrInternal*; using ScePthreadMutexattr = PthreadMutexattrInternal*;
using ScePthreadCond = PthreadCondInternal*; using ScePthreadCond = PthreadCondInternal*;
using ScePthreadCondattr = PthreadCondAttrInternal*; using ScePthreadCondattr = PthreadCondAttrInternal*;
using OrbisPthreadRwlock = PthreadRwInternal*;
using OrbisPthreadRwlockattr = PthreadRwLockAttrInernal*;
using pthreadEntryFunc = PS4_SYSV_ABI void* (*)(void*); using pthreadEntryFunc = PS4_SYSV_ABI void* (*)(void*);
@ -84,6 +88,17 @@ struct PthreadCondAttrInternal {
pthread_condattr_t cond_attr; pthread_condattr_t cond_attr;
}; };
struct PthreadRwLockAttrInernal {
u8 reserved[64];
pthread_rwlockattr_t attr_rwlock;
int type;
};
struct PthreadRwInternal {
pthread_rwlock_t pth_rwlock;
std::string name;
};
class PThreadPool { class PThreadPool {
public: public:
ScePthread Create(); ScePthread Create();
@ -119,12 +134,19 @@ public:
void SetPthreadPool(PThreadPool* pool) { void SetPthreadPool(PThreadPool* pool) {
m_pthread_pool = pool; m_pthread_pool = pool;
} }
OrbisPthreadRwlockattr* getDefaultRwattr() {
return &m_default_Rwattr;
}
void setDefaultRwattr(OrbisPthreadRwlockattr attr) {
m_default_Rwattr = attr;
}
private: private:
ScePthreadMutexattr m_default_mutexattr = nullptr; ScePthreadMutexattr m_default_mutexattr = nullptr;
ScePthreadCondattr m_default_condattr = nullptr; ScePthreadCondattr m_default_condattr = nullptr;
ScePthreadAttr m_default_attr = nullptr; ScePthreadAttr m_default_attr = nullptr;
PThreadPool* m_pthread_pool = nullptr; PThreadPool* m_pthread_pool = nullptr;
OrbisPthreadRwlockattr m_default_Rwattr = nullptr;
}; };
void init_pthreads(); void init_pthreads();

View File

@ -21,10 +21,10 @@ int PS4_SYSV_ABI posix_pthread_rwlock_reltimedwrlock_np();
int PS4_SYSV_ABI posix_pthread_rwlock_setname_np(); int PS4_SYSV_ABI posix_pthread_rwlock_setname_np();
int PS4_SYSV_ABI posix_pthread_rwlock_timedrdlock(); int PS4_SYSV_ABI posix_pthread_rwlock_timedrdlock();
int PS4_SYSV_ABI posix_pthread_rwlock_timedwrlock(); int PS4_SYSV_ABI posix_pthread_rwlock_timedwrlock();
int PS4_SYSV_ABI posix_pthread_rwlock_tryrdlock(); int PS4_SYSV_ABI posix_pthread_rwlock_tryrdlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI posix_pthread_rwlock_trywrlock(); int PS4_SYSV_ABI posix_pthread_rwlock_trywrlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI posix_pthread_rwlock_unlock(); int PS4_SYSV_ABI posix_pthread_rwlock_unlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI posix_pthread_rwlock_wrlock(); int PS4_SYSV_ABI posix_pthread_rwlock_wrlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI posix_pthread_rwlockattr_destroy(); int PS4_SYSV_ABI posix_pthread_rwlockattr_destroy();
int PS4_SYSV_ABI posix_pthread_rwlockattr_getpshared(); int PS4_SYSV_ABI posix_pthread_rwlockattr_getpshared();
int PS4_SYSV_ABI posix_pthread_rwlockattr_gettype_np(); int PS4_SYSV_ABI posix_pthread_rwlockattr_gettype_np();
@ -37,15 +37,15 @@ int PS4_SYSV_ABI scePthreadRwlockattrGettype();
int PS4_SYSV_ABI scePthreadRwlockattrInit(); int PS4_SYSV_ABI scePthreadRwlockattrInit();
int PS4_SYSV_ABI scePthreadRwlockattrSetpshared(); int PS4_SYSV_ABI scePthreadRwlockattrSetpshared();
int PS4_SYSV_ABI scePthreadRwlockattrSettype(); int PS4_SYSV_ABI scePthreadRwlockattrSettype();
int PS4_SYSV_ABI scePthreadRwlockDestroy(); int PS4_SYSV_ABI scePthreadRwlockDestroy(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI scePthreadRwlockInit(); int PS4_SYSV_ABI scePthreadRwlockInit();
int PS4_SYSV_ABI scePthreadRwlockRdlock(); int PS4_SYSV_ABI scePthreadRwlockRdlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI scePthreadRwlockTimedrdlock(); int PS4_SYSV_ABI scePthreadRwlockTimedrdlock();
int PS4_SYSV_ABI scePthreadRwlockTimedwrlock(); int PS4_SYSV_ABI scePthreadRwlockTimedwrlock();
int PS4_SYSV_ABI scePthreadRwlockTryrdlock(); int PS4_SYSV_ABI scePthreadRwlockTryrdlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI scePthreadRwlockTrywrlock(); int PS4_SYSV_ABI scePthreadRwlockTrywrlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI scePthreadRwlockUnlock(); int PS4_SYSV_ABI scePthreadRwlockUnlock(OrbisPthreadRwlock* rwlock);
int PS4_SYSV_ABI scePthreadRwlockWrlock(); int PS4_SYSV_ABI scePthreadRwlockWrlock(OrbisPthreadRwlock* rwlock);
void ThreadsRwlockSymbolsRegister(Core::Loader::SymbolsResolver* sym); void ThreadsRwlockSymbolsRegister(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::Kernel } // namespace Libraries::Kernel

View File

@ -48,24 +48,36 @@ int PS4_SYSV_ABI posix_pthread_rwlock_timedwrlock() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI posix_pthread_rwlock_tryrdlock() { int PS4_SYSV_ABI posix_pthread_rwlock_tryrdlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); int result = pthread_rwlock_tryrdlock(&(*rwlock)->pth_rwlock);
return ORBIS_OK; if (result != 0) {
LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_tryrdlock: error = {}", result);
}
return result;
} }
int PS4_SYSV_ABI posix_pthread_rwlock_trywrlock() { int PS4_SYSV_ABI posix_pthread_rwlock_trywrlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); int result = pthread_rwlock_trywrlock(&(*rwlock)->pth_rwlock);
return ORBIS_OK; if (result != 0) {
LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_trywrlock: error = {}", result);
}
return result;
} }
int PS4_SYSV_ABI posix_pthread_rwlock_unlock() { int PS4_SYSV_ABI posix_pthread_rwlock_unlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); int result = pthread_rwlock_unlock(&(*rwlock)->pth_rwlock);
return ORBIS_OK; if (result != 0) {
LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_unlock: error = {}", result);
}
return result;
} }
int PS4_SYSV_ABI posix_pthread_rwlock_wrlock() { int PS4_SYSV_ABI posix_pthread_rwlock_wrlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); int result = pthread_rwlock_wrlock(&(*rwlock)->pth_rwlock);
return ORBIS_OK; if (result != 0) {
LOG_ERROR(Kernel_Pthread, "scePthreadRwlockWrlock: error = {}", result);
}
return result;
} }
int PS4_SYSV_ABI posix_pthread_rwlockattr_destroy() { int PS4_SYSV_ABI posix_pthread_rwlockattr_destroy() {
@ -128,7 +140,7 @@ int PS4_SYSV_ABI scePthreadRwlockattrSettype() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI scePthreadRwlockDestroy() { int PS4_SYSV_ABI scePthreadRwlockDestroy(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); LOG_ERROR(Kernel_Pthread, "(STUBBED) called");
return ORBIS_OK; return ORBIS_OK;
} }
@ -138,9 +150,16 @@ int PS4_SYSV_ABI scePthreadRwlockInit() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI scePthreadRwlockRdlock() { int PS4_SYSV_ABI scePthreadRwlockRdlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); if (rwlock == nullptr || *rwlock == nullptr) {
return ORBIS_OK; return SCE_KERNEL_ERROR_EINVAL;
}
int result = pthread_rwlock_rdlock(&(*rwlock)->pth_rwlock);
if (result != 0) {
LOG_ERROR(Kernel_Pthread, "scePthreadRwlockRdlock: error = {}", result);
result += ORBIS_KERNEL_ERROR_UNKNOWN;
}
return result;
} }
int PS4_SYSV_ABI scePthreadRwlockTimedrdlock() { int PS4_SYSV_ABI scePthreadRwlockTimedrdlock() {
@ -153,24 +172,52 @@ int PS4_SYSV_ABI scePthreadRwlockTimedwrlock() {
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI scePthreadRwlockTryrdlock() { int PS4_SYSV_ABI scePthreadRwlockTryrdlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); if (rwlock == nullptr || *rwlock == nullptr) {
return ORBIS_OK; return SCE_KERNEL_ERROR_EINVAL;
}
int result = pthread_rwlock_tryrdlock(&(*rwlock)->pth_rwlock);
if (result != 0) {
LOG_ERROR(Kernel_Pthread, "scePthreadRwlockTryrdlock: error = {}", result);
result += ORBIS_KERNEL_ERROR_UNKNOWN;
}
return result;
} }
int PS4_SYSV_ABI scePthreadRwlockTrywrlock() { int PS4_SYSV_ABI scePthreadRwlockTrywrlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); if (rwlock == nullptr || *rwlock == nullptr) {
return ORBIS_OK; return SCE_KERNEL_ERROR_EINVAL;
}
int result = pthread_rwlock_trywrlock(&(*rwlock)->pth_rwlock);
if (result != 0) {
LOG_ERROR(Kernel_Pthread, "scePthreadRwlockTrywrlock: error = {}", result);
result += ORBIS_KERNEL_ERROR_UNKNOWN;
}
return result;
} }
int PS4_SYSV_ABI scePthreadRwlockUnlock() { int PS4_SYSV_ABI scePthreadRwlockUnlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); if (rwlock == nullptr || *rwlock == nullptr) {
return ORBIS_OK; return SCE_KERNEL_ERROR_EINVAL;
}
int result = pthread_rwlock_unlock(&(*rwlock)->pth_rwlock);
if (result != 0) {
LOG_ERROR(Kernel_Pthread, "scePthreadRwlockUnlock: error = {}", result);
result += ORBIS_KERNEL_ERROR_UNKNOWN;
}
return result;
} }
int PS4_SYSV_ABI scePthreadRwlockWrlock() { int PS4_SYSV_ABI scePthreadRwlockWrlock(OrbisPthreadRwlock* rwlock) {
LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); if (rwlock == nullptr || *rwlock == nullptr) {
return ORBIS_OK; return SCE_KERNEL_ERROR_EINVAL;
}
int result = pthread_rwlock_wrlock(&(*rwlock)->pth_rwlock);
if (result != 0) {
LOG_ERROR(Kernel_Pthread, "scePthreadRwlockWrlock: error = {}", result);
result += ORBIS_KERNEL_ERROR_UNKNOWN;
}
return result;
} }
void ThreadsRwlockSymbolsRegister(Core::Loader::SymbolsResolver* sym) { void ThreadsRwlockSymbolsRegister(Core::Loader::SymbolsResolver* sym) {