X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=threads.cc;h=7fa4507ee94397e7e092730567901de94cf07a46;hp=7fa4281d36597db401dfb0b93da45f27f60a1ead;hb=46bea910632f80a1565e50060b0d0444637dfe14;hpb=0e49f3778dcb00bcf9c1690b37864021822d5353 diff --git a/threads.cc b/threads.cc index 7fa4281..7fa4507 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)); } /** @@ -73,8 +76,9 @@ int Thread::create_context() /** * Swaps the current context to another thread of execution. This form switches * from a user Thread to a system context. - * @param t Thread representing the current context - * @param ctxt Context to switch to + * @param t Thread representing the currently-running thread. The current + * context is saved here. + * @param ctxt Context to which we will swap. Must hold a valid system context. * @return Does not return, unless we return to Thread t's context. See * swapcontext(3) (returns 0 for success, -1 for failure). */ @@ -86,9 +90,9 @@ int Thread::swap(Thread *t, ucontext_t *ctxt) /** * Swaps the current context to another thread of execution. This form switches * from a system context to a user Thread. - * @param t Thread representing the current context - * @param ctxt Context to switch to - * @return Does not return, unless we return to Thread t's context. See + * @param ctxt System context variable to which to save the current context. + * @param t Thread to which we will swap. Must hold a valid user context. + * @return Does not return, unless we return to the system context (ctxt). See * swapcontext(3) (returns 0 for success, -1 for failure). */ int Thread::swap(ucontext_t *ctxt, Thread *t) @@ -100,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) @@ -119,6 +123,7 @@ Thread::Thread(thrd_t *t, void (*func)(void *), void *a) : arg(a), user_thread(t), state(THREAD_CREATED), + wait_list(), last_action_val(VALUE_NONE) { int ret;