diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-10 15:10:28 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-10 15:10:28 +0200 |
| commit | 7794a623aa27351b12a50fe9bf9f92ddac10d512 (patch) | |
| tree | ae816a0d7f5094fc2899db81486f854886628643 /src/libtools | |
| parent | 0443edc03481221ab2ebe100319ab23dc193150f (diff) | |
| download | box64-7794a623aa27351b12a50fe9bf9f92ddac10d512.tar.gz box64-7794a623aa27351b12a50fe9bf9f92ddac10d512.zip | |
[BOX32] Fix and simplified 32bits threads handling
Diffstat (limited to 'src/libtools')
| -rw-r--r-- | src/libtools/threads.c | 16 | ||||
| -rwxr-xr-x | src/libtools/threads32.c | 18 |
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; |