* @brief Thread functions.
*/
-#include "libthreads.h"
+#include <string.h>
+
+#include <threads.h>
#include "common.h"
-#include "threads.h"
+#include "threads-model.h"
/* global "model" object */
#include "model.h"
/** Allocate a stack for a new thread. */
static void * stack_allocate(size_t size)
{
- return malloc(size);
+ return snapshot_malloc(size);
}
/** Free a stack for a terminated thread. */
static void stack_free(void *stack)
{
- free(stack);
+ snapshot_free(stack);
}
/** Return the currently executing thread. */
* Provides a startup wrapper for each thread, allowing some initial
* model-checking data to be recorded. This method also gets around makecontext
* not being 64-bit clean
- * @todo We should make the START event always immediately follow the
- * CREATE event, so we don't get redundant traces...
*/
void thread_startup()
{
void Thread::complete()
{
if (!is_complete()) {
- DEBUG("completed thread %d\n", get_id());
+ DEBUG("completed thread %d\n", id_to_int(get_id()));
state = THREAD_COMPLETED;
if (stack)
stack_free(stack);
}
}
+/**
+ * @brief Construct a new model-checker Thread
+ *
+ * A model-checker Thread is used for accounting purposes only. It will never
+ * have its own stack, and it should never be inserted into the Scheduler.
+ *
+ * @param tid The thread ID to assign
+ */
+Thread::Thread(thread_id_t tid) :
+ parent(NULL),
+ creation(NULL),
+ pending(NULL),
+ start_routine(NULL),
+ arg(NULL),
+ stack(NULL),
+ user_thread(NULL),
+ id(tid),
+ state(THREAD_READY), /* Thread is always ready? */
+ wait_list(),
+ last_action_val(0),
+ model_thread(true)
+{
+ memset(&context, 0, sizeof(context));
+}
+
/**
* Construct a new thread.
* @param t The thread identifier of the newly created thread.
* @param a The parameter to pass to this function.
*/
Thread::Thread(thrd_t *t, void (*func)(void *), void *a) :
+ creation(NULL),
+ pending(NULL),
start_routine(func),
arg(a),
user_thread(t),
state(THREAD_CREATED),
wait_list(),
- last_action_val(VALUE_NONE)
+ last_action_val(VALUE_NONE),
+ model_thread(false)
{
int ret;
/* Initialize state */
ret = create_context();
if (ret)
- printf("Error in create_context\n");
+ model_print("Error in create_context\n");
id = model->get_next_id();
*user_thread = id;
}
/** @return The thread_id_t corresponding to this Thread object. */
-thread_id_t Thread::get_id()
+thread_id_t Thread::get_id() const
{
return id;
}