bugfix - add stl-model.h wrappers, to provide more control over STL
[c11tester.git] / threads-model.h
index 344d58badada9f13297a149c220c0f33d505238a..e77e80cc71de39663fd4078307c7c2220fee68a6 100644 (file)
@@ -7,11 +7,16 @@
 
 #include <ucontext.h>
 #include <stdint.h>
-#include <vector>
 
 #include "mymemory.h"
 #include <threads.h>
 #include "modeltypes.h"
+#include "stl-model.h"
+
+struct thread_params {
+       thrd_start_t func;
+       void *arg;
+};
 
 /** @brief Represents the state of a user Thread */
 typedef enum thread_state {
@@ -36,7 +41,7 @@ class ModelAction;
 class Thread {
 public:
        Thread(thread_id_t tid);
-       Thread(thrd_t *t, void (*func)(void *), void *a);
+       Thread(thrd_t *t, void (*func)(void *), void *a, Thread *parent);
        ~Thread();
        void complete();
 
@@ -90,8 +95,17 @@ public:
                return wait_list[i];
        }
 
+       /** @return The pending (next) ModelAction for this Thread
+        *  @see Thread::pending */
        ModelAction * get_pending() const { return pending; }
+
+       /** @brief Set the pending (next) ModelAction for this Thread
+        *  @param act The pending ModelAction
+        *  @see Thread::pending */
        void set_pending(ModelAction *act) { pending = act; }
+
+       Thread * waiting_on() const;
+
        /**
         * Remove one ModelAction from the waiting list
         * @return The ModelAction that was removed from the waiting list
@@ -114,10 +128,22 @@ public:
         */
 private:
        int create_context();
-       Thread *parent;
+
+       /** @brief The parent Thread which created this Thread */
+       Thread * const parent;
+
+       /** @brief The THREAD_CREATE ModelAction which created this Thread */
        ModelAction *creation;
 
+       /**
+        * @brief The next ModelAction to be run by this Thread
+        *
+        * This action should be kept updated by the ModelChecker, so that we
+        * always know what the next ModelAction's memory_order, action type,
+        * and location are.
+        */
        ModelAction *pending;
+
        void (*start_routine)(void *);
        void *arg;
        ucontext_t context;
@@ -131,7 +157,7 @@ private:
         * list is used for thread joins, where another Thread waits for this
         * Thread to complete
         */
-       std::vector< ModelAction *, SnapshotAlloc<ModelAction *> > wait_list;
+       SnapVector<ModelAction *> wait_list;
 
        /**
         * The value returned by the last action in this thread
@@ -148,7 +174,7 @@ Thread * thread_current();
 
 static inline thread_id_t thrd_to_id(thrd_t t)
 {
-       return t;
+       return t.priv->get_id();
 }
 
 /**