From: Brian Norris <banorris@uci.edu>
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://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=38dbc133c5e2712828cf13e17d05331d2b48dcf2;p=cdsspec-compiler.git

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 44d3f8f..d9aae2d 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 00bb5c2..3e44804 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 ba7b547..6a9391f 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);
 }