X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=threads.h;h=87a21ef2633f46f14de70240f052bc50af2adcce;hb=f6c5b783a43b8b5d8d069e44ecf91cc770b5d47b;hp=ed9cbfed118a20561f271aaace5acc67f5b47f6e;hpb=85c090982c2a8dd6e236aa8f3d0a79f974ab9603;p=model-checker.git diff --git a/threads.h b/threads.h index ed9cbfe..87a21ef 100644 --- a/threads.h +++ b/threads.h @@ -6,6 +6,9 @@ #define __THREADS_H__ #include +#include +#include + #include "mymemory.h" #include "libthreads.h" @@ -13,10 +16,20 @@ 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 is not currently running but is ready to run */ THREAD_READY, + /** + * Thread is waiting on another action (e.g., thread completion, lock + * release, etc.) + */ + THREAD_BLOCKED, + /** Thread has completed its execution */ THREAD_COMPLETED } thread_state; @@ -46,7 +59,7 @@ public: * atomic read). * @param value The value to return */ - void set_return_value(int value) { last_action_val = value; } + void set_return_value(uint64_t value) { last_action_val = value; } /** * Retrieve a return value for the last action in this thread. Used, @@ -54,7 +67,32 @@ public: * be called from a user context. * @return The value 'returned' by the action */ - int get_return_value() { return last_action_val; } + uint64_t get_return_value() { return last_action_val; } + + /** @return True if this thread is finished executing */ + bool is_complete() { return state == THREAD_COMPLETED; } + + /** @return True if this thread is blocked */ + bool is_blocked() { return state == THREAD_BLOCKED; } + + /** @return True if no threads are waiting on this Thread */ + bool wait_list_empty() { return wait_list.empty(); } + + /** + * Add a ModelAction to the waiting list for this thread. + * @param t The ModelAction to add. Must be a JOIN. + */ + void push_wait_list(ModelAction *act) { wait_list.push_back(act); } + + /** + * Remove one ModelAction from the waiting list + * @return The ModelAction that was removed from the waiting list + */ + ModelAction * pop_wait_list() { + ModelAction *ret = wait_list.front(); + wait_list.pop_back(); + return ret; + } friend void thread_startup(); @@ -72,12 +110,19 @@ private: thread_id_t id; thread_state state; + /** + * A list of ModelActions waiting on this Thread. Particularly, this + * list is used for thread joins, where another Thread waits for this + * Thread to complete + */ + std::vector wait_list; + /** * The value returned by the last action in this thread * @see Thread::set_return_value() * @see Thread::get_return_value() */ - int last_action_val; + uint64_t last_action_val; }; Thread * thread_current();