#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 {
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();
static int swap(Thread *t, ucontext_t *ctxt);
thread_state get_state() const { return state; }
- void set_state(thread_state s) { state = s; }
+ void set_state(thread_state s);
thread_id_t get_id() const;
thrd_t get_thrd_t() const { return *user_thread; }
Thread * get_parent() const { return parent; }
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
*/
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;
* 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
static inline thread_id_t thrd_to_id(thrd_t t)
{
- return t;
+ return t.priv->get_id();
}
/**