about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-23 11:39:07 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-23 11:39:07 +0200
commitd9ff07b60564e100ab89331c6988797b15ac6711 (patch)
tree73391661add7c460d7af43094b8691b6a19d6fcc /src
parentdbdb3d6af60ba92fbd1bab207bdd587627fcb528 (diff)
downloadbox64-d9ff07b60564e100ab89331c6988797b15ac6711.tar.gz
box64-d9ff07b60564e100ab89331c6988797b15ac6711.zip
[BOX32] Improved semaphore wrapping
Diffstat (limited to 'src')
-rwxr-xr-xsrc/wrapped32/wrappedlibpthread.c74
1 files changed, 44 insertions, 30 deletions
diff --git a/src/wrapped32/wrappedlibpthread.c b/src/wrapped32/wrappedlibpthread.c
index 5589d360..72a3f5c4 100755
--- a/src/wrapped32/wrappedlibpthread.c
+++ b/src/wrapped32/wrappedlibpthread.c
@@ -56,60 +56,74 @@ EXPORT void my32___pthread_initialize()
     // nothing, the lib initialize itself now
 }
 
-EXPORT int my32_sem_close(void** sem)
+#define SEM_SIGN 0x542554aabc123578LL     // just some random stuff
+typedef struct my_sem_32_s {
+    uint64_t sign;
+    sem_t   *sem;
+} my_sem_32_t;
+
+EXPORT int my32_sem_close(sem_t* sem)
 {
-    int ret = 0;
-    ret = sem_close(*sem);
-    box_free(sem);
-    return ret;
+    return sem_close(sem);
 }
-EXPORT int my32_sem_destroy(void** sem)
+EXPORT int my32_sem_destroy(my_sem_32_t* sem)
 {
+    if(sem->sign != SEM_SIGN)
+        return sem_destroy((sem_t*)sem);
     int ret = 0;
-    ret = sem_destroy(*sem);
-    box_free(*sem);
-    *sem = NULL;
+    ret = sem_destroy(sem->sem);
+    box_free(sem->sem);
+    sem->sem = NULL;
     return ret;
 }
-EXPORT int my32_sem_getvalue(void** sem, int* val)
+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, val);
-    box_free(*sem);
-    *sem = NULL;
+    ret = sem_getvalue(sem->sem, val);
     return ret;
 }
-EXPORT int my32_sem_init(void** sem, int pshared, uint32_t val)
+EXPORT int my32_sem_init(my_sem_32_t* sem, int pshared, uint32_t val)
 {
     int ret = 0;
-    *sem = box_calloc(1, sizeof(sem_t));
-    ret = sem_init(*sem, pshared, val);
+    sem->sign = SEM_SIGN;
+    sem->sem = box_calloc(1, sizeof(sem_t));
+    ret = sem_init(sem->sem, pshared, val);
     return ret;
 }
 EXPORT void* my32_sem_open(const char* name, int flags)
 {
-    sem_t* sem = sem_open(name, flags);
-    if(!sem)
-        return sem;
-    void** ret = (void**)box_calloc(1, sizeof(void*));
-    *ret = sem;
-    return ret;
+    return sem_open(name, flags);
 }
-EXPORT int my32_sem_post(void** sem)
+EXPORT int my32_sem_post(my_sem_32_t* sem)
 {
-    return sem_post(*sem);
+    if(sem->sign != SEM_SIGN)
+        return sem_post((sem_t*)sem);
+    return sem_post(sem->sem);
 }
-EXPORT int my32_sem_timedwait(void** sem, void* t)
+EXPORT int my32_sem_timedwait(my_sem_32_t* sem, struct timespec * t)
 {
-    return sem_timedwait(*sem, t);
+    // 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);
 }
-EXPORT int my32_sem_trywait(void** sem)
+EXPORT int my32_sem_trywait(my_sem_32_t* sem)
 {
-    return sem_trywait(*sem);
+    if(sem->sign != SEM_SIGN)
+        return sem_trywait((sem_t*)sem);
+    return sem_trywait(sem->sem);
 }
-EXPORT int my32_sem_wait(void** sem)
+EXPORT int my32_sem_wait(my_sem_32_t* sem)
 {
-    return sem_wait(*sem);
+    if(sem->sign != SEM_SIGN)
+        return sem_wait((sem_t*)sem);
+    return sem_wait(sem->sem);
 }