From 38dbc133c5e2712828cf13e17d05331d2b48dcf2 Mon Sep 17 00:00:00 2001 From: Brian Norris Date: Wed, 11 Jul 2012 14:52:56 -0700 Subject: [PATCH] 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. --- action.cc | 3 +++ action.h | 1 + threads.cc | 12 ++++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) 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); } -- 2.34.1