return model->get_current_thread();
}
-#ifdef TLS
void modelexit() {
model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, thread_current()));
}
-#endif
-void main_thread_startup() {
-#ifdef TLS
+void initMainThread() {
atexit(modelexit);
Thread * curr_thread = thread_current();
-
- /* Add dummy "start" action, just to create a first clock vector */
model->switch_to_master(new ModelAction(THREAD_START, std::memory_order_seq_cst, curr_thread));
-#endif
- thread_startup();
}
/**
}
if (!pthread_exit_p) {
- pthread_exit_p = (void (*)(void *))dlsym(RTLD_NEXT, "pthread_exit");
+ *((void (**)(void *)) &pthread_exit_p) = (void (*)(void *))dlsym(RTLD_NEXT, "pthread_exit");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(EXIT_FAILURE);
context.uc_stack.ss_flags = 0;
context.uc_link = model->get_system_context();
#ifdef TLS
- if (model != NULL)
- makecontext(&context, setup_context, 0);
- else
- makecontext(&context, main_thread_startup, 0);
+ makecontext(&context, setup_context, 0);
#else
makecontext(&context, thread_startup, 0);
#endif
if (stack)
stack_free(stack);
#ifdef TLS
- if (this != model->getInitThread() && !model->getParams()->threadsnocleanup) {
+ if (this != model->getInitThread()) {
ASSERT(thread_current()==NULL);
real_pthread_mutex_unlock(&mutex2);
real_pthread_join(thread, NULL);