diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-08-24 11:31:59 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-08-24 11:32:04 +0200 |
| commit | e964b458942131f95b48936a97c808911c6161fa (patch) | |
| tree | 3f1c1ec812ab32517679f2e9b40c473d1138a325 /src | |
| parent | b8526c79201bdc6d08909d01bb0e41f7cb48ecfc (diff) | |
| download | box64-e964b458942131f95b48936a97c808911c6161fa.tar.gz box64-e964b458942131f95b48936a97c808911c6161fa.zip | |
[BOX32][WRAPPER] Fixed some SIGBUS with 32bits smeaphores
Diffstat (limited to 'src')
| -rwxr-xr-x | src/wrapped32/wrappedlibpthread.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/wrapped32/wrappedlibpthread.c b/src/wrapped32/wrappedlibpthread.c index dbeee699..541a10c1 100755 --- a/src/wrapped32/wrappedlibpthread.c +++ b/src/wrapped32/wrappedlibpthread.c @@ -62,7 +62,20 @@ 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) +static sem_t* get_sem(void* sem) +{ + if(!(((uintptr_t)sem)&0x07)) + return sem; + // sem is unaligned, create a wrapped sem + sem_t *new_sem = box_calloc(1, sizeof(sem_t)); + memcpy(new_sem, sem, sizeof(sem_t)); + my_sem_32_t* old = sem; + old->sign = SEM_SIGN; + old->sem = new_sem; + return new_sem; +} + +#define GET_SEM(sem) sem_t* _sem = (sem->sign != SEM_SIGN)?(get_sem(sem)):(sem->sem) EXPORT int my32_sem_close(sem_t* sem) { return sem_close(sem); |