-#include <stdlib.h>
-
#include "libthreads.h"
-#include "schedule.h"
#include "common.h"
#include "threads.h"
static void * stack_allocate(size_t size)
{
- return userMalloc(size);
+ return malloc(size);
}
static void stack_free(void *stack)
{
- userFree(stack);
+ free(stack);
}
Thread * thread_current(void)
{
+ ASSERT(model);
return model->scheduler->get_current_thread();
}
+/* This method just gets around makecontext not being 64-bit clean */
+
+void thread_startup() {
+ Thread * curr_thread = thread_current();
+ curr_thread->start_routine(curr_thread->arg);
+}
+
int Thread::create_context()
{
int ret;
context.uc_stack.ss_size = STACK_SIZE;
context.uc_stack.ss_flags = 0;
context.uc_link = model->get_system_context();
- makecontext(&context, start_routine, 1, arg);
+ makecontext(&context, thread_startup, 0);
return 0;
}
}
}
-void * Thread::operator new(size_t size) {
- return userMalloc(size);
-}
-
-void Thread::operator delete(void *ptr) {
- userFree(ptr);
-}
-
-Thread::Thread(thrd_t *t, void (*func)(), void *a) {
+Thread::Thread(thrd_t *t, void (*func)(void *), void *a) :
+ start_routine(func),
+ arg(a),
+ user_thread(t),
+ state(THREAD_CREATED),
+ last_action_val(VALUE_NONE)
+{
int ret;
- user_thread = t;
- start_routine = func;
- arg = a;
-
/* Initialize state */
ret = create_context();
if (ret)
printf("Error in create_context\n");
- state = THREAD_CREATED;
id = model->get_next_id();
*user_thread = id;
parent = thread_current();