threads: add a wait_list
[model-checker.git] / threads.h
index f7efcf967236b4c57ed22440ffa16a49bca1c5be..25b1d6466a4abbb37f0aa633c4a9028cf1459955 100644 (file)
--- a/threads.h
+++ b/threads.h
@@ -7,6 +7,7 @@
 
 #include <ucontext.h>
 #include <stdint.h>
+#include <vector>
 
 #include "mymemory.h"
 #include "libthreads.h"
@@ -70,6 +71,25 @@ public:
        /** @return True if this thread is finished executing */
        bool is_complete() { return state == THREAD_COMPLETED; }
 
+       /** @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
@@ -86,6 +106,13 @@ private:
        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<Thread *> wait_list;
+
        /**
         * The value returned by the last action in this thread
         * @see Thread::set_return_value()