working towards making datarace detection work
[model-checker.git] / threads.h
index 7d2189b49d9f098a775b1cc158390cf76f49cbf4..e7cd792a134c4b5e223b6f9465af4eaf83753b1e 100644 (file)
--- a/threads.h
+++ b/threads.h
@@ -1,7 +1,13 @@
+/** @file threads.h
+ *  @brief Model Checker Thread class.
+ */
+
 #ifndef __THREADS_H__
 #define __THREADS_H__
 
 #include <ucontext.h>
+#include <stdint.h>
+
 #include "mymemory.h"
 #include "libthreads.h"
 
@@ -9,15 +15,25 @@ typedef int thread_id_t;
 
 #define THREAD_ID_T_NONE       -1
 
+/** @brief Represents the state of a user Thread */
 typedef enum thread_state {
+       /** Thread was just created and hasn't run yet */
        THREAD_CREATED,
+       /** Thread is running */
        THREAD_RUNNING,
+       /**
+        * Thread has yielded to the model-checker but is ready to run. Used
+        * during an action that caused a context switch to the model-checking
+        * context.
+        */
        THREAD_READY,
+       /** Thread has completed its execution */
        THREAD_COMPLETED
 } thread_state;
 
 class ModelAction;
 
+/** @brief A Thread is created for each user-space thread */
 class Thread {
 public:
        Thread(thrd_t *t, void (*func)(void *), void *a);
@@ -36,6 +52,21 @@ public:
        void set_creation(ModelAction *act) { creation = act; }
        ModelAction * get_creation() { return creation; }
 
+       /**
+        * Set a return value for the last action in this thread (e.g., for an
+        * atomic read).
+        * @param value The value to return
+        */
+       void set_return_value(uint64_t value) { last_action_val = value; }
+
+       /**
+        * Retrieve a return value for the last action in this thread. Used,
+        * for instance, for an atomic read to return the 'read' value. Should
+        * be called from a user context.
+        * @return The value 'returned' by the action
+        */
+       uint64_t get_return_value() { return last_action_val; }
+
        friend void thread_startup();
 
        SNAPSHOTALLOC
@@ -51,6 +82,13 @@ private:
        thrd_t *user_thread;
        thread_id_t id;
        thread_state state;
+
+       /**
+        * The value returned by the last action in this thread
+        * @see Thread::set_return_value()
+        * @see Thread::get_return_value()
+        */
+       uint64_t last_action_val;
 };
 
 Thread * thread_current();