X-Git-Url: http://plrg.eecs.uci.edu/git/?p=c11tester.git;a=blobdiff_plain;f=threads.h;h=ed9cbfed118a20561f271aaace5acc67f5b47f6e;hp=38eac0a9cba43bc4107ee02f02eaaf4763b9595a;hb=85c090982c2a8dd6e236aa8f3d0a79f974ab9603;hpb=cca49f0c63efac9a730d9f26b9b90fabdd881337 diff --git a/threads.h b/threads.h index 38eac0a9..ed9cbfed 100644 --- a/threads.h +++ b/threads.h @@ -1,8 +1,12 @@ +/** @file threads.h + * @brief Model Checker Thread class. + */ + #ifndef __THREADS_H__ #define __THREADS_H__ #include - +#include "mymemory.h" #include "libthreads.h" typedef int thread_id_t; @@ -16,11 +20,12 @@ typedef enum thread_state { 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, void (*func)(void *), void *a); ~Thread(); void complete(); @@ -31,16 +36,48 @@ public: 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(int 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 + */ + int get_return_value() { return last_action_val; } + + 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; + + /** + * The value returned by the last action in this thread + * @see Thread::set_return_value() + * @see Thread::get_return_value() + */ + int last_action_val; }; Thread * thread_current();