about summary refs log tree commit diff stats
path: root/src/wrapped32/wrappedlibpthread.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-23 19:45:13 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-23 19:45:13 +0200
commit7317472b5f62316e5817f9e89ae2ddf99862412d (patch)
treefa07f9df10da8400097c372289ec58094de5f6e2 /src/wrapped32/wrappedlibpthread.c
parent9271684e5a9f356056a6038f652ec1c15ed16ed2 (diff)
downloadbox64-7317472b5f62316e5817f9e89ae2ddf99862412d.tar.gz
box64-7317472b5f62316e5817f9e89ae2ddf99862412d.zip
[BOX32][WRAPPER] More 32bits wrapped functions, and a few fixes on threads handling
Diffstat (limited to 'src/wrapped32/wrappedlibpthread.c')
-rwxr-xr-xsrc/wrapped32/wrappedlibpthread.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/src/wrapped32/wrappedlibpthread.c b/src/wrapped32/wrappedlibpthread.c
index 72a3f5c4..dbeee699 100755
--- a/src/wrapped32/wrappedlibpthread.c
+++ b/src/wrapped32/wrappedlibpthread.c
@@ -62,6 +62,7 @@ typedef struct my_sem_32_s {
     sem_t   *sem;
 } my_sem_32_t;
 
+#define GET_SEM(sem) sem_t* _sem = (sem->sign != SEM_SIGN)?((sem_t*)sem):(sem->sem)
 EXPORT int my32_sem_close(sem_t* sem)
 {
     return sem_close(sem);
@@ -78,11 +79,8 @@ EXPORT int my32_sem_destroy(my_sem_32_t* sem)
 }
 EXPORT int my32_sem_getvalue(my_sem_32_t* sem, int* val)
 {
-    if(sem->sign != SEM_SIGN)
-        return sem_getvalue((sem_t*)sem, val);
-    int ret = 0;
-    ret = sem_getvalue(sem->sem, val);
-    return ret;
+    GET_SEM(sem);
+    return sem_getvalue(_sem, val);
 }
 EXPORT int my32_sem_init(my_sem_32_t* sem, int pshared, uint32_t val)
 {
@@ -98,32 +96,31 @@ EXPORT void* my32_sem_open(const char* name, int flags)
 }
 EXPORT int my32_sem_post(my_sem_32_t* sem)
 {
-    if(sem->sign != SEM_SIGN)
-        return sem_post((sem_t*)sem);
-    return sem_post(sem->sem);
+    GET_SEM(sem);
+    return sem_post(_sem);
 }
 EXPORT int my32_sem_timedwait(my_sem_32_t* sem, struct timespec * t)
 {
+    GET_SEM(sem);
+    // Not sure it's usefull
+    //if(!sem_trywait(_sem)))
+    //    return 0;
     // some x86 game are not computing timeout correctly (ex: Anomaly Warzone Earth linux version)
     while(t->tv_nsec>=1000000000) {
         t->tv_nsec-=1000000000;
         t->tv_sec+=1;
     }
-    if(sem->sign != SEM_SIGN)
-        return sem_timedwait((sem_t*)sem, t);
-    return sem_timedwait(sem->sem, t);
+    return sem_timedwait(_sem, t);
 }
 EXPORT int my32_sem_trywait(my_sem_32_t* sem)
 {
-    if(sem->sign != SEM_SIGN)
-        return sem_trywait((sem_t*)sem);
-    return sem_trywait(sem->sem);
+    GET_SEM(sem);
+    return sem_trywait(_sem);
 }
 EXPORT int my32_sem_wait(my_sem_32_t* sem)
 {
-    if(sem->sign != SEM_SIGN)
-        return sem_wait((sem_t*)sem);
-    return sem_wait(sem->sem);
+    GET_SEM(sem);
+    return sem_wait(_sem);
 }