X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=threads.cc;h=39f049541d69184cc012bcd042f2400208863a3a;hb=f94de5b6daa067501562ed3047bfb6b4939f9435;hp=9b7954d9386b6f5390ed42a32b43a53f5f5f1ca7;hpb=08b069a092910d66bab08096177d9f97461725e4;p=model-checker.git diff --git a/threads.cc b/threads.cc index 9b7954d..39f0495 100644 --- a/threads.cc +++ b/threads.cc @@ -44,6 +44,9 @@ void thread_startup() /* Call the actual thread function */ curr_thread->start_routine(curr_thread->arg); + + /* Finish thread properly */ + model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, curr_thread)); } /** @@ -101,7 +104,7 @@ int Thread::swap(ucontext_t *ctxt, Thread *t) /** Terminate a thread and free its stack. */ void Thread::complete() { - if (state != THREAD_COMPLETED) { + if (!is_complete()) { DEBUG("completed thread %d\n", get_id()); state = THREAD_COMPLETED; if (stack) @@ -116,10 +119,12 @@ void Thread::complete() * @param a The parameter to pass to this function. */ Thread::Thread(thrd_t *t, void (*func)(void *), void *a) : + pending(NULL), start_routine(func), arg(a), user_thread(t), state(THREAD_CREATED), + wait_list(), last_action_val(VALUE_NONE) { int ret;