From: Brian Norris Date: Wed, 11 Jul 2012 21:52:56 +0000 (-0700) Subject: action / threads: add THREAD_START action at start of each thread X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=commitdiff_plain;h=38dbc133c5e2712828cf13e17d05331d2b48dcf2 action / threads: add THREAD_START action at start of each thread The datarace code needs every thread to have at least one action in it, so that the action has a valid non-zero clock. --- diff --git a/action.cc b/action.cc index 44d3f8f1..d9aae2d4 100644 --- a/action.cc +++ b/action.cc @@ -153,6 +153,9 @@ void ModelAction::print(void) const case THREAD_CREATE: type_str = "thread create"; break; + case THREAD_START: + type_str = "thread start"; + break; case THREAD_YIELD: type_str = "thread yield"; break; diff --git a/action.h b/action.h index 00bb5c2f..3e448041 100644 --- a/action.h +++ b/action.h @@ -19,6 +19,7 @@ * ModelAction */ typedef enum action_type { THREAD_CREATE, /**< A thread creation action */ + THREAD_START, /**< First action in each thread */ THREAD_YIELD, /**< A thread yield action */ THREAD_JOIN, /**< A thread join action */ ATOMIC_READ, /**< An atomic read action */ diff --git a/threads.cc b/threads.cc index ba7b5473..6a9391f0 100644 --- a/threads.cc +++ b/threads.cc @@ -23,10 +23,18 @@ Thread * thread_current(void) return model->scheduler->get_current_thread(); } -/* This method just gets around makecontext not being 64-bit clean */ - +/** + * Provides a startup wrapper for each thread, allowing some initial + * model-checking data to be recorded. This method also gets around makecontext + * not being 64-bit clean + */ void thread_startup() { Thread * curr_thread = thread_current(); + + /* Add dummy "start" action, just to create a first clock vector */ + model->switch_to_master(new ModelAction(THREAD_START, memory_order_seq_cst, curr_thread)); + + /* Call the actual thread function */ curr_thread->start_routine(curr_thread->arg); }