/* 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));
}
/**
/**
* 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).
*/
/**
* 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)
/** 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)
arg(a),
user_thread(t),
state(THREAD_CREATED),
+ wait_list(),
last_action_val(VALUE_NONE)
{
int ret;