From 16f6b4ea070af9eef247d80bab1328300161595c Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 7 Jun 2024 17:53:57 +0300 Subject: [PATCH] implemented the most important functions for rwlocks --- src/core/libraries/kernel/thread_management.h | 2 +- .../libraries/kernel/threads/kernel_threads.h | 18 +-- .../kernel/threads/kernel_threads_rwlock.cpp | 124 +++++++++++++----- 3 files changed, 103 insertions(+), 41 deletions(-) diff --git a/src/core/libraries/kernel/thread_management.h b/src/core/libraries/kernel/thread_management.h index 0b14777e..be45dedf 100644 --- a/src/core/libraries/kernel/thread_management.h +++ b/src/core/libraries/kernel/thread_management.h @@ -33,7 +33,7 @@ using ScePthreadMutex = PthreadMutexInternal*; using ScePthreadMutexattr = PthreadMutexattrInternal*; using ScePthreadCond = PthreadCondInternal*; using ScePthreadCondattr = PthreadCondAttrInternal*; -using OrbisPthreadRwlock = PthreadRwInternal*; +using OrbisPthreadRwlock = PthreadRwInternal*; using OrbisPthreadRwlockattr = PthreadRwLockAttrInernal*; using pthreadEntryFunc = PS4_SYSV_ABI void* (*)(void*); diff --git a/src/core/libraries/kernel/threads/kernel_threads.h b/src/core/libraries/kernel/threads/kernel_threads.h index 26c55e4b..a2a2eb48 100644 --- a/src/core/libraries/kernel/threads/kernel_threads.h +++ b/src/core/libraries/kernel/threads/kernel_threads.h @@ -13,9 +13,10 @@ namespace Libraries::Kernel { /**** * rwlock calls */ -int PS4_SYSV_ABI posix_pthread_rwlock_destroy(); -int PS4_SYSV_ABI posix_pthread_rwlock_init(); -int PS4_SYSV_ABI posix_pthread_rwlock_rdlock(); +int PS4_SYSV_ABI posix_pthread_rwlock_destroy(OrbisPthreadRwlock* rwlock); +int PS4_SYSV_ABI posix_pthread_rwlock_init(OrbisPthreadRwlock* rwlock, + const OrbisPthreadRwlockattr* attr, const char* name); +int PS4_SYSV_ABI posix_pthread_rwlock_rdlock(OrbisPthreadRwlock* rwlock); int PS4_SYSV_ABI posix_pthread_rwlock_reltimedrdlock_np(); int PS4_SYSV_ABI posix_pthread_rwlock_reltimedwrlock_np(); int PS4_SYSV_ABI posix_pthread_rwlock_setname_np(); @@ -25,20 +26,21 @@ int PS4_SYSV_ABI posix_pthread_rwlock_tryrdlock(OrbisPthreadRwlock* rwlock); int PS4_SYSV_ABI posix_pthread_rwlock_trywrlock(OrbisPthreadRwlock* rwlock); int PS4_SYSV_ABI posix_pthread_rwlock_unlock(OrbisPthreadRwlock* rwlock); 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(OrbisPthreadRwlockattr* attr); int PS4_SYSV_ABI posix_pthread_rwlockattr_getpshared(); int PS4_SYSV_ABI posix_pthread_rwlockattr_gettype_np(); -int PS4_SYSV_ABI posix_pthread_rwlockattr_init(); +int PS4_SYSV_ABI posix_pthread_rwlockattr_init(OrbisPthreadRwlockattr* attr); int PS4_SYSV_ABI posix_pthread_rwlockattr_setpshared(); int PS4_SYSV_ABI posix_pthread_rwlockattr_settype_np(); -int PS4_SYSV_ABI scePthreadRwlockattrDestroy(); +int PS4_SYSV_ABI scePthreadRwlockattrDestroy(OrbisPthreadRwlockattr* attr); int PS4_SYSV_ABI scePthreadRwlockattrGetpshared(); int PS4_SYSV_ABI scePthreadRwlockattrGettype(); -int PS4_SYSV_ABI scePthreadRwlockattrInit(); +int PS4_SYSV_ABI scePthreadRwlockattrInit(OrbisPthreadRwlockattr* attr); int PS4_SYSV_ABI scePthreadRwlockattrSetpshared(); int PS4_SYSV_ABI scePthreadRwlockattrSettype(); int PS4_SYSV_ABI scePthreadRwlockDestroy(OrbisPthreadRwlock* rwlock); -int PS4_SYSV_ABI scePthreadRwlockInit(); +int PS4_SYSV_ABI scePthreadRwlockInit(OrbisPthreadRwlock* rwlock, + const OrbisPthreadRwlockattr* attr, const char* name); int PS4_SYSV_ABI scePthreadRwlockRdlock(OrbisPthreadRwlock* rwlock); int PS4_SYSV_ABI scePthreadRwlockTimedrdlock(); int PS4_SYSV_ABI scePthreadRwlockTimedwrlock(); diff --git a/src/core/libraries/kernel/threads/kernel_threads_rwlock.cpp b/src/core/libraries/kernel/threads/kernel_threads_rwlock.cpp index 89c4ccdb..cbedb7cb 100644 --- a/src/core/libraries/kernel/threads/kernel_threads_rwlock.cpp +++ b/src/core/libraries/kernel/threads/kernel_threads_rwlock.cpp @@ -8,19 +8,39 @@ namespace Libraries::Kernel { -int PS4_SYSV_ABI posix_pthread_rwlock_destroy() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); +extern PThreadCxt* g_pthread_cxt; + +int PS4_SYSV_ABI posix_pthread_rwlock_destroy(OrbisPthreadRwlock* rwlock) { + int result = pthread_rwlock_destroy(&(*rwlock)->pth_rwlock); + delete *rwlock; + *rwlock = nullptr; + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_destroy: error = {}", result); + result += ORBIS_KERNEL_ERROR_UNKNOWN; + } + return result; +} + +int PS4_SYSV_ABI posix_pthread_rwlock_init(OrbisPthreadRwlock* rwlock, + const OrbisPthreadRwlockattr* attr, const char* name) { + *rwlock = new PthreadRwInternal{}; + if (attr == nullptr || *attr == nullptr) { + attr = g_pthread_cxt->getDefaultRwattr(); + } + int result = pthread_rwlock_init(&(*rwlock)->pth_rwlock, &(*attr)->attr_rwlock); + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_init: error = {}", result); + } return ORBIS_OK; } -int PS4_SYSV_ABI posix_pthread_rwlock_init() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; -} - -int PS4_SYSV_ABI posix_pthread_rwlock_rdlock() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI posix_pthread_rwlock_rdlock(OrbisPthreadRwlock* rwlock) { + int result = pthread_rwlock_rdlock(&(*rwlock)->pth_rwlock); + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_rdlock: error = {}", result); + result += ORBIS_KERNEL_ERROR_UNKNOWN; + } + return result; } int PS4_SYSV_ABI posix_pthread_rwlock_reltimedrdlock_np() { @@ -75,14 +95,19 @@ int PS4_SYSV_ABI posix_pthread_rwlock_unlock(OrbisPthreadRwlock* rwlock) { int PS4_SYSV_ABI posix_pthread_rwlock_wrlock(OrbisPthreadRwlock* rwlock) { int result = pthread_rwlock_wrlock(&(*rwlock)->pth_rwlock); if (result != 0) { - LOG_ERROR(Kernel_Pthread, "scePthreadRwlockWrlock: error = {}", result); + LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlock_wrlock: error = {}", result); } return result; } -int PS4_SYSV_ABI posix_pthread_rwlockattr_destroy() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI posix_pthread_rwlockattr_destroy(OrbisPthreadRwlockattr* attr) { + int result = pthread_rwlockattr_destroy(&(*attr)->attr_rwlock); + delete *attr; + *attr = nullptr; + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlockattr_destroy: error = {}", result); + } + return result; } int PS4_SYSV_ABI posix_pthread_rwlockattr_getpshared() { @@ -95,9 +120,13 @@ int PS4_SYSV_ABI posix_pthread_rwlockattr_gettype_np() { return ORBIS_OK; } -int PS4_SYSV_ABI posix_pthread_rwlockattr_init() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI posix_pthread_rwlockattr_init(OrbisPthreadRwlockattr* attr) { + *attr = new PthreadRwLockAttrInernal{}; + int result = pthread_rwlockattr_init(&(*attr)->attr_rwlock); + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "posix_pthread_rwlockattr_init: error = {}", result); + } + return result; } int PS4_SYSV_ABI posix_pthread_rwlockattr_setpshared() { @@ -110,9 +139,15 @@ int PS4_SYSV_ABI posix_pthread_rwlockattr_settype_np() { return ORBIS_OK; } -int PS4_SYSV_ABI scePthreadRwlockattrDestroy() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI scePthreadRwlockattrDestroy(OrbisPthreadRwlockattr* attr) { + int result = pthread_rwlockattr_destroy(&(*attr)->attr_rwlock); + delete *attr; + *attr = nullptr; + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "scePthreadRwlockattrDestroy: error = {}", result); + result += ORBIS_KERNEL_ERROR_UNKNOWN; + } + return result; } int PS4_SYSV_ABI scePthreadRwlockattrGetpshared() { @@ -125,9 +160,14 @@ int PS4_SYSV_ABI scePthreadRwlockattrGettype() { return ORBIS_OK; } -int PS4_SYSV_ABI scePthreadRwlockattrInit() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI scePthreadRwlockattrInit(OrbisPthreadRwlockattr* attr) { + *attr = new PthreadRwLockAttrInernal{}; + int result = pthread_rwlockattr_init(&(*attr)->attr_rwlock); + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "scePthreadRwlockattrInit: error = {}", result); + result += ORBIS_KERNEL_ERROR_UNKNOWN; + } + return result; } int PS4_SYSV_ABI scePthreadRwlockattrSetpshared() { @@ -141,18 +181,38 @@ int PS4_SYSV_ABI scePthreadRwlockattrSettype() { } int PS4_SYSV_ABI scePthreadRwlockDestroy(OrbisPthreadRwlock* rwlock) { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); - return ORBIS_OK; + int result = pthread_rwlock_destroy(&(*rwlock)->pth_rwlock); + delete *rwlock; + *rwlock = nullptr; + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "scePthreadRwlockDestroy: error = {}", result); + result += ORBIS_KERNEL_ERROR_UNKNOWN; + } + return result; } -int PS4_SYSV_ABI scePthreadRwlockInit() { - LOG_ERROR(Kernel_Pthread, "(STUBBED) called"); +int PS4_SYSV_ABI scePthreadRwlockInit(OrbisPthreadRwlock* rwlock, + const OrbisPthreadRwlockattr* attr, const char* name) { + *rwlock = new PthreadRwInternal{}; + if (rwlock == nullptr || *rwlock == nullptr) { + return ORBIS_KERNEL_ERROR_EINVAL; + } + + if (attr == nullptr || *attr == nullptr) { + attr = g_pthread_cxt->getDefaultRwattr(); + } + (*rwlock)->name = name; + int result = pthread_rwlock_init(&(*rwlock)->pth_rwlock, &(*attr)->attr_rwlock); + if (result != 0) { + LOG_ERROR(Kernel_Pthread, "scePthreadRwlockInit: error = {}", result); + result += ORBIS_KERNEL_ERROR_UNKNOWN; + } return ORBIS_OK; } int PS4_SYSV_ABI scePthreadRwlockRdlock(OrbisPthreadRwlock* rwlock) { if (rwlock == nullptr || *rwlock == nullptr) { - return SCE_KERNEL_ERROR_EINVAL; + return ORBIS_KERNEL_ERROR_EINVAL; } int result = pthread_rwlock_rdlock(&(*rwlock)->pth_rwlock); if (result != 0) { @@ -174,7 +234,7 @@ int PS4_SYSV_ABI scePthreadRwlockTimedwrlock() { int PS4_SYSV_ABI scePthreadRwlockTryrdlock(OrbisPthreadRwlock* rwlock) { if (rwlock == nullptr || *rwlock == nullptr) { - return SCE_KERNEL_ERROR_EINVAL; + return ORBIS_KERNEL_ERROR_EINVAL; } int result = pthread_rwlock_tryrdlock(&(*rwlock)->pth_rwlock); if (result != 0) { @@ -186,7 +246,7 @@ int PS4_SYSV_ABI scePthreadRwlockTryrdlock(OrbisPthreadRwlock* rwlock) { int PS4_SYSV_ABI scePthreadRwlockTrywrlock(OrbisPthreadRwlock* rwlock) { if (rwlock == nullptr || *rwlock == nullptr) { - return SCE_KERNEL_ERROR_EINVAL; + return ORBIS_KERNEL_ERROR_EINVAL; } int result = pthread_rwlock_trywrlock(&(*rwlock)->pth_rwlock); if (result != 0) { @@ -198,7 +258,7 @@ int PS4_SYSV_ABI scePthreadRwlockTrywrlock(OrbisPthreadRwlock* rwlock) { int PS4_SYSV_ABI scePthreadRwlockUnlock(OrbisPthreadRwlock* rwlock) { if (rwlock == nullptr || *rwlock == nullptr) { - return SCE_KERNEL_ERROR_EINVAL; + return ORBIS_KERNEL_ERROR_EINVAL; } int result = pthread_rwlock_unlock(&(*rwlock)->pth_rwlock); if (result != 0) { @@ -210,7 +270,7 @@ int PS4_SYSV_ABI scePthreadRwlockUnlock(OrbisPthreadRwlock* rwlock) { int PS4_SYSV_ABI scePthreadRwlockWrlock(OrbisPthreadRwlock* rwlock) { if (rwlock == nullptr || *rwlock == nullptr) { - return SCE_KERNEL_ERROR_EINVAL; + return ORBIS_KERNEL_ERROR_EINVAL; } int result = pthread_rwlock_wrlock(&(*rwlock)->pth_rwlock); if (result != 0) {