X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=threads.h;h=e7cd792a134c4b5e223b6f9465af4eaf83753b1e;hp=e52c324eb0fb81119d8063625c21387443105b18;hb=c6ecd39c5c0483a5aaa370a1b4bbd07b2af77eb2;hpb=9fd8ac15f03e8ca01a20563e06c44b8b93090892 diff --git a/threads.h b/threads.h index e52c324e..e7cd792a 100644 --- 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 +#include + #include "mymemory.h" #include "libthreads.h" @@ -9,13 +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); @@ -31,12 +49,31 @@ public: thrd_t get_thrd_t() { return *user_thread; } Thread * get_parent() { return parent; } + 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 private: int create_context(); Thread *parent; + ModelAction *creation; void (*start_routine)(void *); void *arg; @@ -45,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();