#ifndef CONFIG_H
#define CONFIG_H
+/** Turn on debugging. */
+/* #ifndef CONFIG_DEBUG
+ #define CONFIG_DEBUG
+ #endif
+*/
+
+
/** Do we have a 48 bit virtual address (64 bit machine) or 32 bit addresses.
* Set to 1 for 48-bit, 0 for 32-bit. */
#ifndef BIT48
-
#ifdef _LP64
#define BIT48 1
#else
#define BIT48 0
#endif
-
#endif /* BIT48 */
+/** Snapshotting configurables */
+
+/** If USE_MPROTECT_SNAPSHOT=1, then snapshot by using mmap() and mprotect()
+ * If USE_MPROTECT_SNAPSHOT=0, then snapshot by using fork() */
+#define USE_MPROTECT_SNAPSHOT 1
+
+/** Size of signal stack */
+#define SIGSTACKSIZE 32768
+
+/** Page size configuration */
+#define PAGESIZE 4096
+
+/** Thread parameters */
+
+/* Size of stack to allocate for a thread. */
+#define STACK_SIZE (1024 * 1024)
+
+
#endif
#define _SNAPSHOT_H
#include "snapshot-interface.h"
-
-#define PAGESIZE 4096
-
-/* If USE_MPROTECT_SNAPSHOT=1, then snapshot by using mmap() and mprotect()
- If USE_MPROTECT_SNAPSHOT=0, then snapshot by using fork() */
-#define USE_MPROTECT_SNAPSHOT 1
-
-/* Size of signal stack */
-#define SIGSTACKSIZE 32768
+#include "config.h"
void addMemoryRegionToSnapShot( void * ptr, unsigned int numPages );
snapshot_id takeSnapshot( );
* @brief Thread functions.
*/
-
#include "libthreads.h"
#include "common.h"
#include "threads.h"
/* global "model" object */
#include "model.h"
-#define STACK_SIZE (1024 * 1024)
-
+/** Allocate a stack for a new thread. */
static void * stack_allocate(size_t size)
{
return malloc(size);
}
+/** Free a stack for a terminated thread. */
static void stack_free(void *stack)
{
free(stack);
}
+/** Return the currently executing thread. */
+
Thread * thread_current(void)
{
ASSERT(model);
curr_thread->start_routine(curr_thread->arg);
}
+/** Create a thread context for a new thread so we can use
+ * setcontext/getcontext/swapcontext to swap it out.
+ * @return 0 on success.
+ */
+
int Thread::create_context()
{
int ret;
return swapcontext(ctxt, &t->context);
}
+
+/** Terminate a thread and free its stack. */
+
void Thread::complete()
{
if (state != THREAD_COMPLETED) {
}
}
+/** Create a new thread.
+ * Takes the following parameters:
+ * @param t The thread identifier of the newly created thread.
+ * @param func The function that the thread will call.
+ * @param a The parameter to pass to this function. */
+
Thread::Thread(thrd_t *t, void (*func)(void *), void *a) :
start_routine(func),
arg(a),
model->remove_thread(this);
}
+/** Return the thread_id_t corresponding to this Thread object. */
+
thread_id_t Thread::get_id()
{
return id;