about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-10 15:10:28 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-10 15:10:28 +0200
commit7794a623aa27351b12a50fe9bf9f92ddac10d512 (patch)
treeae816a0d7f5094fc2899db81486f854886628643 /src/libtools
parent0443edc03481221ab2ebe100319ab23dc193150f (diff)
downloadbox64-7794a623aa27351b12a50fe9bf9f92ddac10d512.tar.gz
box64-7794a623aa27351b12a50fe9bf9f92ddac10d512.zip
[BOX32] Fix and simplified 32bits threads handling
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/threads.c16
-rwxr-xr-xsrc/libtools/threads32.c18
2 files changed, 8 insertions, 26 deletions
diff --git a/src/libtools/threads.c b/src/libtools/threads.c
index da514e43..f51f95c6 100644
--- a/src/libtools/threads.c
+++ b/src/libtools/threads.c
@@ -134,19 +134,8 @@ static void emuthread_destroy(void* p)
 	emuthread_t *et = (emuthread_t*)p;
 	if(!et)
 		return;
-	// check tlsdata
-	/*void* ptr;
-	if (my_context && (ptr = pthread_getspecific(my_context->tlskey)) != NULL)
-        free_tlsdatasize(ptr);*/
-	// free x64emu
-	#ifdef BOX32
-	/*if(box64_is32bits && !et->join)	// not removing  hash key from old pthread_t
-		to_hash_d(et->self);*/
-	#endif
-	if(et) {
-		FreeX64Emu(&et->emu);
-		box_free(et);
-	}
+	FreeX64Emu(&et->emu);
+	box_free(et);
 }
 
 static void emuthread_cancel(void* p)
@@ -188,7 +177,6 @@ void thread_set_emu(x64emu_t* emu)
 	#ifdef BOX32
 	if(box64_is32bits) {
 		et->self = (uintptr_t)pthread_self();
-		et->hself = to_hash(et->self);
 	}
 	#endif
 	pthread_setspecific(thread_key, et);
diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c
index bd437633..755c2cd2 100755
--- a/src/libtools/threads32.c
+++ b/src/libtools/threads32.c
@@ -98,14 +98,9 @@ static void emuthread_destroy(void* p)
 	emuthread_t *et = (emuthread_t*)p;
 	if(!et)
 		return;
-	// destroy the hash key if thread is not joinable
-	if(!et->join)
-		to_hash_d(et->self);
 	// destroy thread emu and all
-	if(et) {
-		FreeX64Emu(&et->emu);
-		free(et);
-	}
+	FreeX64Emu(&et->emu);
+	free(et);
 }
 
 static void emuthread_cancel(void* p)
@@ -120,7 +115,6 @@ static void emuthread_cancel(void* p)
 		DynaRun(et->emu);	// will return after a __pthread_unwind_next()
 	}
 	free(et->cancels);
-	to_hash_d(et->self);
 	et->cancels=NULL;
 	et->cancel_size = et->cancel_cap = 0;
 }
@@ -141,7 +135,6 @@ static void* pthread_routine(void* p)
 	emuthread_t *et = (emuthread_t*)p;
 	et->emu->type = EMUTYPE_MAIN;
 	et->self = (uintptr_t)pthread_self();
-	et->hself = to_hash(et->self);
 	// setup callstack and run...
 	x64emu_t* emu = et->emu;
 	Push_32(emu, 0);	// PUSH 0 (backtrace marker: return address is 0)
@@ -213,7 +206,7 @@ EXPORT int my32_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_r
 		own = 1;
 	}
 
-	emuthread_t *et = (emuthread_t*)calloc(1, sizeof(emuthread_t));
+	emuthread_t *et = (emuthread_t*)box_calloc(1, sizeof(emuthread_t));
     x64emu_t *emuthread = NewX64Emu(my_context, (uintptr_t)start_routine, (uintptr_t)stack, stacksize, own);
 	SetupX64Emu(emuthread, emu);
 	et->emu = emuthread;
@@ -583,7 +576,7 @@ static pthread_attr_t* get_attr(void* attr)
 		return NULL;
 	my32_x64_attr_t* my32_attr = (my32_x64_attr_t*)attr;
 	if(my32_attr->sign!=ATTR_SIGN) {
-		my32_attr->attr = (pthread_attr_t*)calloc(1, sizeof(pthread_attr_t));
+		my32_attr->attr = (pthread_attr_t*)box_calloc(1, sizeof(pthread_attr_t));
 		my32_attr->sign = ATTR_SIGN;
 	}
 	return my32_attr->attr;
@@ -595,7 +588,7 @@ static void del_attr(void* attr)
 	my32_x64_attr_t* my32_attr = (my32_x64_attr_t*)attr;
 	if(my32_attr->sign==ATTR_SIGN) {
 		my32_attr->sign = 0;
-		free(my32_attr->attr);
+		box_free(my32_attr->attr);
 	}
 }
 
@@ -811,6 +804,7 @@ EXPORT int my32_pthread_mutex_destroy(pthread_mutex_t *m)
 	if(k!=kh_end(unaligned_mutex)) {
 		pthread_mutex_t *n = kh_value(unaligned_mutex, k);
 		kh_del(mutex, unaligned_mutex, k);
+		pthread_rwlock_unlock(&m_lock);
 		int ret = pthread_mutex_destroy(n);
 		free(n);
 		return ret;