|
|
|
@@ -21,14 +21,91 @@
|
|
|
|
|
// Structure representing the lock
|
|
|
|
|
struct __lock {
|
|
|
|
|
SceLwMutexWorkarea mutex;
|
|
|
|
|
int32_t thread_id;
|
|
|
|
|
int32_t count;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___sfp_recursive_mutex
|
|
|
|
|
struct __lock __lock___sfp_recursive_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___atexit_recursive_mutex
|
|
|
|
|
struct __lock __lock___atexit_recursive_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___at_quick_exit_mutex
|
|
|
|
|
struct __lock __lock___at_quick_exit_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___malloc_recursive_mutex
|
|
|
|
|
struct __lock __lock___malloc_recursive_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___env_recursive_mutex
|
|
|
|
|
struct __lock __lock___env_recursive_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___tz_mutex
|
|
|
|
|
struct __lock __lock___tz_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___dd_hash_mutex
|
|
|
|
|
struct __lock __lock___dd_hash_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___lock___arc4random_mutex
|
|
|
|
|
struct __lock __lock___arc4random_mutex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static inline void __common_lock_init(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelCreateLwMutex(&lock->mutex, "lock API mutex", PSP_LW_MUTEX_ATTR_THFIFO, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void __common_lock_init_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelCreateLwMutex(&lock->mutex, "lock API mutex Recursive", PSP_LW_MUTEX_ATTR_RECURSIVE, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void __common_lock_close(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelDeleteLwMutex(&lock->mutex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void __common_lock_close_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelDeleteLwMutex(&lock->mutex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_init
|
|
|
|
|
void __retarget_lock_init(_LOCK_T *lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelCreateLwMutex(&(*lock)->mutex, "lock API mutex", 0, 0, 0);
|
|
|
|
|
_LOCK_T new_lock = (_LOCK_T)malloc(sizeof(struct __lock));
|
|
|
|
|
__common_lock_init(new_lock);
|
|
|
|
|
*lock = new_lock;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_init_recursive
|
|
|
|
|
void __retarget_lock_init_recursive(_LOCK_T *lock)
|
|
|
|
|
{
|
|
|
|
|
_LOCK_T new_lock = (_LOCK_T)malloc(sizeof(struct __lock));
|
|
|
|
|
__common_lock_init_recursive(new_lock);
|
|
|
|
|
*lock = new_lock;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_close
|
|
|
|
|
void __retarget_lock_close(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
__common_lock_close(lock);
|
|
|
|
|
free(lock);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_close_recursive
|
|
|
|
|
void __retarget_lock_close_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
__common_lock_close_recursive(lock);
|
|
|
|
|
free(lock);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@@ -39,10 +116,10 @@ void __retarget_lock_acquire(_LOCK_T lock)
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_release
|
|
|
|
|
void __retarget_lock_release(_LOCK_T lock)
|
|
|
|
|
#ifdef F___retarget_lock_acquire_recursive
|
|
|
|
|
void __retarget_lock_acquire_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelUnlockLwMutex(&lock->mutex, 1);
|
|
|
|
|
sceKernelLockLwMutex(&lock->mutex, 1, 0);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@@ -53,60 +130,88 @@ int __retarget_lock_try_acquire(_LOCK_T lock)
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_close
|
|
|
|
|
void __retarget_lock_close(_LOCK_T lock)
|
|
|
|
|
#ifdef F___retarget_lock_try_acquire_recursive
|
|
|
|
|
int __retarget_lock_try_acquire_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelDeleteLwMutex(&lock->mutex);
|
|
|
|
|
return sceKernelTryLockLwMutex(&lock->mutex, 1);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_init_recursive
|
|
|
|
|
void __retarget_lock_init_recursive(_LOCK_T *lock)
|
|
|
|
|
#ifdef F___retarget_lock_release
|
|
|
|
|
void __retarget_lock_release(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
sceKernelCreateLwMutex(&(*lock)->mutex, "lock API recursive mutex", 0, 0, 0);
|
|
|
|
|
(*lock)->count = 0;
|
|
|
|
|
(*lock)->thread_id = sceKernelGetThreadId();
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_acquire_recursive
|
|
|
|
|
void __retarget_lock_acquire_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
int32_t thread_id = sceKernelGetThreadId();
|
|
|
|
|
if (lock->count == 0 || lock->thread_id != thread_id) {
|
|
|
|
|
sceKernelLockLwMutex(&lock->mutex, 1, 0);
|
|
|
|
|
}
|
|
|
|
|
lock->count++;
|
|
|
|
|
sceKernelUnlockLwMutex(&lock->mutex, 1);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_release_recursive
|
|
|
|
|
void __retarget_lock_release_recursive(_LOCK_T lock)
|
|
|
|
|
{
|
|
|
|
|
int32_t thread_id = sceKernelGetThreadId();
|
|
|
|
|
if (lock->count == 1 || lock->thread_id != thread_id) {
|
|
|
|
|
sceKernelUnlockLwMutex(&lock->mutex, 1);
|
|
|
|
|
}
|
|
|
|
|
lock->count--;
|
|
|
|
|
sceKernelUnlockLwMutex(&lock->mutex, 1);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_try_acquire_recursive
|
|
|
|
|
int __retarget_lock_try_acquire_recursive(_LOCK_T lock)
|
|
|
|
|
#ifdef F___locks_init
|
|
|
|
|
extern struct __lock __lock___malloc_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___atexit_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___at_quick_exit_mutex;
|
|
|
|
|
extern struct __lock __lock___sfp_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___env_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___tz_mutex;
|
|
|
|
|
extern struct __lock __lock___dd_hash_mutex;
|
|
|
|
|
extern struct __lock __lock___arc4random_mutex;
|
|
|
|
|
|
|
|
|
|
void __locks_init()
|
|
|
|
|
{
|
|
|
|
|
int res = 0;
|
|
|
|
|
int32_t thread_id = sceKernelGetThreadId();
|
|
|
|
|
if (lock->count == 0 || lock->thread_id != thread_id) {
|
|
|
|
|
res = sceKernelTryLockLwMutex(&lock->mutex, 1) != 0;
|
|
|
|
|
}
|
|
|
|
|
lock->count++;
|
|
|
|
|
return res;
|
|
|
|
|
_LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
|
|
|
|
|
_LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_env = &__lock___env_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_tz = &__lock___tz_mutex;
|
|
|
|
|
_LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
|
|
|
|
|
_LOCK_T lock_arc4random = &__lock___arc4random_mutex;
|
|
|
|
|
|
|
|
|
|
__common_lock_init_recursive(lock_malloc);
|
|
|
|
|
__common_lock_init_recursive(lock_atexit);
|
|
|
|
|
__common_lock_init(lock_quick_exit);
|
|
|
|
|
__common_lock_init_recursive(lock_sfp);
|
|
|
|
|
__common_lock_init_recursive(lock_env);
|
|
|
|
|
__common_lock_init(lock_tz);
|
|
|
|
|
__common_lock_init(lock_dd_hash);
|
|
|
|
|
__common_lock_init(lock_arc4random);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef F___retarget_lock_close_recursive
|
|
|
|
|
void __retarget_lock_close_recursive(_LOCK_T lock)
|
|
|
|
|
#ifdef F___locks_deinit
|
|
|
|
|
extern struct __lock __lock___malloc_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___atexit_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___at_quick_exit_mutex;
|
|
|
|
|
extern struct __lock __lock___sfp_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___env_recursive_mutex;
|
|
|
|
|
extern struct __lock __lock___tz_mutex;
|
|
|
|
|
extern struct __lock __lock___dd_hash_mutex;
|
|
|
|
|
extern struct __lock __lock___arc4random_mutex;
|
|
|
|
|
|
|
|
|
|
void __locks_deinit()
|
|
|
|
|
{
|
|
|
|
|
sceKernelDeleteLwMutex(&lock->mutex);
|
|
|
|
|
_LOCK_T lock_malloc = &__lock___malloc_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_atexit = &__lock___atexit_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_quick_exit = &__lock___at_quick_exit_mutex;
|
|
|
|
|
_LOCK_T lock_sfp = &__lock___sfp_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_env = &__lock___env_recursive_mutex;
|
|
|
|
|
_LOCK_T lock_tz = &__lock___tz_mutex;
|
|
|
|
|
_LOCK_T lock_dd_hash = &__lock___dd_hash_mutex;
|
|
|
|
|
_LOCK_T lock_arc4random = &__lock___arc4random_mutex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__common_lock_close_recursive(lock_malloc);
|
|
|
|
|
__common_lock_close_recursive(lock_atexit);
|
|
|
|
|
__common_lock_close(lock_quick_exit);
|
|
|
|
|
__common_lock_close_recursive(lock_sfp);
|
|
|
|
|
__common_lock_close_recursive(lock_env);
|
|
|
|
|
__common_lock_close(lock_tz);
|
|
|
|
|
__common_lock_close(lock_dd_hash);
|
|
|
|
|
__common_lock_close(lock_arc4random);
|
|
|
|
|
}
|
|
|
|
|
#endif
|