X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=threads.cc;h=0da9282aa942bd2966bf939d6409636fa99049e5;hp=cb814fc5e233599461b8573f5680087c53119655;hb=291ac33e363ce8a7b39441c0fa5c8e44ff84cdc6;hpb=2aabbb0f33109838e3256b019f1759ec6b3f8f7e diff --git a/threads.cc b/threads.cc index cb814fc5..0da9282a 100644 --- a/threads.cc +++ b/threads.cc @@ -13,6 +13,7 @@ /* global "model" object */ #include "model.h" #include "execution.h" +#include "schedule.h" #ifdef TLS #include @@ -92,8 +93,7 @@ void thread_startup() model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, curr_thread)); } -#ifdef TLS -static int (*pthread_mutex_init_p) (pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) = NULL; +static int (*pthread_mutex_init_p)(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) = NULL; int real_pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) { return pthread_mutex_init_p(__mutex, __mutexattr); @@ -123,6 +123,12 @@ int real_pthread_join (pthread_t __th, void ** __thread_return) { return pthread_join_p(__th, __thread_return); } +static void (*pthread_exit_p)(void *) __attribute__((noreturn))= NULL; + +void real_pthread_exit (void * value_ptr) { + pthread_exit_p(value_ptr); +} + void real_init_all() { char * error; if (!pthread_mutex_init_p) { @@ -160,8 +166,17 @@ void real_init_all() { exit(EXIT_FAILURE); } } + + if (!pthread_exit_p) { + pthread_exit_p = (void (*)(void *))dlsym(RTLD_NEXT, "pthread_exit"); + if ((error = dlerror()) != NULL) { + fputs(error, stderr); + exit(EXIT_FAILURE); + } + } } +#ifdef TLS void finalize_helper_thread() { Thread * curr_thread = thread_current(); real_pthread_mutex_lock(&curr_thread->mutex); @@ -207,7 +222,7 @@ void setup_context() { model->switch_to_master(new ModelAction(THREAD_START, std::memory_order_seq_cst, curr_thread)); real_init_all(); - + /* Initialize our lock */ real_pthread_mutex_init(&curr_thread->mutex, NULL); real_pthread_mutex_init(&curr_thread->mutex2, NULL); @@ -305,10 +320,15 @@ void Thread::complete() if (stack) stack_free(stack); #ifdef TLS - if (this != model->getInitThread()) { + 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; } #endif