From: bdemsky Date: Wed, 27 Nov 2019 21:08:07 +0000 (-0800) Subject: TSAN style tls destructor X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=c335c989221c8d995d27c83077c6f769318c9d36 TSAN style tls destructor --- diff --git a/execution.cc b/execution.cc index 6057ec51..6fe05696 100644 --- a/execution.cc +++ b/execution.cc @@ -73,6 +73,9 @@ ModelExecution::ModelExecution(ModelChecker *m, Scheduler *scheduler) : add_thread(model_thread); fuzzer->register_engine(m->get_history(), this); scheduler->register_engine(this); +#ifdef TLS + pthread_key_create(&pthreadkey, tlsdestructor); +#endif } /** @brief Destructor */ diff --git a/execution.h b/execution.h index 1a381807..a8ab02cc 100644 --- a/execution.h +++ b/execution.h @@ -92,9 +92,14 @@ public: void setFinished() {isfinished = true;} void restore_last_seq_num(); - +#ifdef TLS + pthread_key_t getPthreadKey() {return pthreadkey;} +#endif SNAPSHOTALLOC private: +#ifdef TLS + pthread_key_t pthreadkey; +#endif int get_execution_number() const; ModelChecker *model; diff --git a/threads-model.h b/threads-model.h index f2162a89..f2efd6c0 100644 --- a/threads-model.h +++ b/threads-model.h @@ -157,6 +157,7 @@ private: ucontext_t context; void *stack; #ifdef TLS + void * helper_stack; public: char *tls; ucontext_t helpercontext; @@ -185,6 +186,7 @@ private: #ifdef TLS uintptr_t get_tls_addr(); +void tlsdestructor(void *v); #endif Thread * thread_current(); diff --git a/threads.cc b/threads.cc index 0da9282a..e8ffb3a9 100644 --- a/threads.cc +++ b/threads.cc @@ -89,8 +89,10 @@ void thread_startup() void *retval = curr_thread->pstart_routine(curr_thread->arg); curr_thread->set_pthread_return(retval); } +#ifndef TLS /* Finish thread properly */ model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, curr_thread)); +#endif } static int (*pthread_mutex_init_p)(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) = NULL; @@ -196,9 +198,16 @@ void * helper_thread(void * ptr) { int ret = getcontext(&curr_thread->helpercontext); ASSERT(!ret); + //Setup destructor + if (pthread_setspecific(model->get_execution()->getPthreadKey(), (const void *)4)) { + printf("Destructor setup failed\n"); + exit(-1); + } + + /* Initialize new managed context */ - void *helperstack = stack_allocate(STACK_SIZE); - curr_thread->helpercontext.uc_stack.ss_sp = helperstack; + curr_thread->helper_stack = stack_allocate(STACK_SIZE); + curr_thread->helpercontext.uc_stack.ss_sp = curr_thread->helper_stack; curr_thread->helpercontext.uc_stack.ss_size = STACK_SIZE; curr_thread->helpercontext.uc_stack.ss_flags = 0; curr_thread->helpercontext.uc_link = model->get_system_context(); @@ -206,15 +215,28 @@ void * helper_thread(void * ptr) { model_swapcontext(&curr_thread->context, &curr_thread->helpercontext); + //start the real thread thread_startup(); - //now the real thread has control again - stack_free(helperstack); - return NULL; } +#ifdef TLS +void tlsdestructor(void *v) { + uintptr_t count = (uintptr_t) v; + if (count > 0) { + if (pthread_setspecific(model->get_execution()->getPthreadKey(), (const void *)(count - 1))) { + printf("Destructor setup failed\n"); + exit(-1); + } + return; + } + /* Finish thread properly */ + model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, thread_current())); +} +#endif + void setup_context() { Thread * curr_thread = thread_current(); @@ -321,15 +343,10 @@ void Thread::complete() stack_free(stack); #ifdef TLS if (this != model->getInitThread() && !model->getParams()->threadsnocleanup) { - modellock = 1; ASSERT(thread_current()==NULL); - Thread * curr_thread = model->getScheduler()->get_current_thread(); - //Make any current_thread calls work in code to free - model->getScheduler()->set_current_thread(this); real_pthread_mutex_unlock(&mutex2); real_pthread_join(thread, NULL); - model->getScheduler()->set_current_thread(curr_thread); - modellock = 0; + stack_free(helper_stack); } #endif }