about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-08 14:51:29 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-08 14:51:29 +0100
commitbdee719767b1af42767d348ab2b30ee028bbd19e (patch)
tree0c4f3178a6487c95502c154e74624422f3713588 /src/libtools
parent42263e0be9a8e721371fb8cd0d5edda174886c45 (diff)
downloadbox64-bdee719767b1af42767d348ab2b30ee028bbd19e.tar.gz
box64-bdee719767b1af42767d348ab2b30ee028bbd19e.zip
[BOX32] Improved mutex handling, again
Diffstat (limited to 'src/libtools')
-rwxr-xr-xsrc/libtools/threads32.c21
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)