X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=threads.h;h=a379494d43bd93ee78dea0f3f0bb98dcd0af60a4;hb=e919b30ee6f7aa594c61fc305e6e88e789dbd700;hp=6872ffa18dcedbdc547242b03b512946cde17c9a;hpb=7c003db5218470054490a6777c97c6611b933a12;p=c11tester.git diff --git a/threads.h b/threads.h index 6872ffa1..a379494d 100644 --- a/threads.h +++ b/threads.h @@ -7,13 +7,11 @@ #include #include +#include #include "mymemory.h" #include "libthreads.h" - -typedef int thread_id_t; - -#define THREAD_ID_T_NONE -1 +#include "modeltypes.h" /** @brief Represents the state of a user Thread */ typedef enum thread_state { @@ -21,13 +19,13 @@ typedef enum thread_state { THREAD_CREATED, /** Thread is running */ THREAD_RUNNING, + /** Thread is not currently running but is ready to run */ + THREAD_READY, /** - * 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 is waiting on another action (e.g., thread completion, lock + * release, etc.) */ - THREAD_READY, - THREAD_ASSERTED, + THREAD_BLOCKED, /** Thread has completed its execution */ THREAD_COMPLETED } thread_state; @@ -68,6 +66,41 @@ public: */ 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); } + + unsigned int num_wait_list() { + return wait_list.size(); + } + + ModelAction * get_waiter(unsigned int i) { + return wait_list[i]; + } + + ModelAction * get_pending() { return pending; } + void set_pending(ModelAction *act) { pending = 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(); SNAPSHOTALLOC @@ -76,6 +109,7 @@ private: Thread *parent; ModelAction *creation; + ModelAction *pending; void (*start_routine)(void *); void *arg; ucontext_t context; @@ -84,6 +118,13 @@ 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()