X-Git-Url: http://plrg.eecs.uci.edu/git/?p=model-checker.git;a=blobdiff_plain;f=threads.h;h=939676027ecea091b776735a0b372dcd515ad1ad;hp=44e1013768e911c6aaec6aa8564fd2a629b94cc7;hb=8362b1efa92635ab49bd937edf451e3b2e0981bc;hpb=5e5d8b86e9dbbfb4873adc717508f0b66679f13c diff --git a/threads.h b/threads.h index 44e1013..9396760 100644 --- a/threads.h +++ b/threads.h @@ -1,43 +1,132 @@ +/** @file threads.h + * @brief Model Checker Thread class. + */ + #ifndef __THREADS_H__ #define __THREADS_H__ #include +#include +#include +#include "mymemory.h" #include "libthreads.h" +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 is waiting on another action (e.g., thread completion, lock + * release, etc.) + */ + THREAD_BLOCKED, + /** Thread has completed its execution */ THREAD_COMPLETED } thread_state; +class ModelAction; + +/** @brief A Thread is created for each user-space thread */ class Thread { public: - void * operator new(size_t size); - void operator delete(void *ptr); - Thread(thrd_t *t, void (*func)(), void *a); - Thread(thrd_t *t); + Thread(thrd_t *t, void (*func)(void *), void *a); ~Thread(); void complete(); - int swap(Thread *t); + + static int swap(ucontext_t *ctxt, Thread *t); + static int swap(Thread *t, ucontext_t *ctxt); thread_state get_state() { return state; } void set_state(thread_state s) { state = s; } thread_id_t get_id(); 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; } + + /** @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 thread to the waiting list for this thread. + * @param t The Thread to add + */ + void push_wait_list(Thread *t) { wait_list.push_back(t); } + + /** + * Remove one Thread from the waiting list + * @return The Thread that was removed from the waiting list + */ + Thread * pop_wait_list() { + Thread *ret = wait_list.front(); + wait_list.pop_back(); + return ret; + } + + friend void thread_startup(); + + SNAPSHOTALLOC private: int create_context(); + Thread *parent; + ModelAction *creation; - void (*start_routine)(); + void (*start_routine)(void *); void *arg; ucontext_t context; void *stack; thrd_t *user_thread; thread_id_t id; thread_state state; + + /** + * A list of Threads 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() + */ + uint64_t last_action_val; }; Thread * thread_current(); @@ -47,4 +136,14 @@ static inline thread_id_t thrd_to_id(thrd_t t) return t; } +static inline thread_id_t int_to_id(int i) +{ + return i; +} + +static inline int id_to_int(thread_id_t id) +{ + return id; +} + #endif /* __THREADS_H__ */