diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-12-08 14:51:29 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-12-08 14:51:29 +0100 |
| commit | bdee719767b1af42767d348ab2b30ee028bbd19e (patch) | |
| tree | 0c4f3178a6487c95502c154e74624422f3713588 /src/libtools | |
| parent | 42263e0be9a8e721371fb8cd0d5edda174886c45 (diff) | |
| download | box64-bdee719767b1af42767d348ab2b30ee028bbd19e.tar.gz box64-bdee719767b1af42767d348ab2b30ee028bbd19e.zip | |
[BOX32] Improved mutex handling, again
Diffstat (limited to 'src/libtools')
| -rwxr-xr-x | src/libtools/threads32.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c index 3299771b..4e216b80 100755 --- a/src/libtools/threads32.c +++ b/src/libtools/threads32.c @@ -828,7 +828,7 @@ typedef struct fake_pthread_mutext_s { int __kind; ptr_t real_mutex; } fakse_phtread_mutex_t; -#define KIND_SIGN 0xbad000 +#define KIND_SIGN 0xbad001 pthread_mutex_t* createNewMutex() { pthread_mutex_t* ret = (pthread_mutex_t*)box_calloc(1, sizeof(pthread_mutex_t)); @@ -839,14 +839,29 @@ pthread_mutex_t* createNewMutex() pthread_mutex_t* getAlignedMutex(pthread_mutex_t* m) { fakse_phtread_mutex_t* fake = (fakse_phtread_mutex_t*)m; - if(fake->__kind==0) { + if(!fake->__lock && !fake->__count && !fake->__owner && !fake->__kind && !fake->i386__kind && !fake->real_mutex) { + fake->real_mutex = KIND_SIGN; + } + if(!fake->__lock && !fake->__count && !fake->__owner && !fake->__kind && fake->i386__kind==1 && !fake->real_mutex) { + // recusrive mutex should also work + fake->real_mutex = KIND_SIGN; + fake->__kind = 1; + fake->i386__kind = 0; + } + if(fake->real_mutex==KIND_SIGN) { return m; // type 0 can fit... } if(fake->__kind==KIND_SIGN) return from_ptrv(fake->real_mutex); // this should not appens! - printf_log(LOG_NONE, "BOX32: Warning, fallback on alligned mutex %p\n", m); + printf_log(LOG_INFO, "BOX32: Warning, fallback on aligned mutex %p\n", m); fake->real_mutex = to_ptrv(createNewMutex()); + pthread_mutexattr_t attr = {0}; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, fake->i386__kind); + pthread_mutex_init(from_ptrv(fake->real_mutex), &attr); + pthread_mutexattr_destroy(&attr); + fake->__kind==KIND_SIGN; return from_ptrv(fake->real_mutex); } EXPORT int my32_pthread_mutex_destroy(pthread_mutex_t *m) |