From 9ab763adc965ca76a8d65b9898d20c60cdb44445 Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Sun, 20 May 2012 23:50:34 -0700 Subject: [PATCH] fix various problems with my 64-bit clean hack found missing initializer bug in scheduler --- libthreads.cc | 2 +- libthreads.h | 2 +- main.cc | 2 +- schedule.cc | 7 +++++++ schedule.h | 3 +++ threads.cc | 4 ++-- threads.h | 5 +++-- 7 files changed, 18 insertions(+), 7 deletions(-) diff --git a/libthreads.cc b/libthreads.cc index b5760ae..205821e 100644 --- a/libthreads.cc +++ b/libthreads.cc @@ -8,7 +8,7 @@ /* * User program API functions */ -int thrd_create(thrd_t *t, void (*start_routine)(), void *arg) +int thrd_create(thrd_t *t, void (*start_routine)(void *), void *arg) { int ret; DBG(); diff --git a/libthreads.h b/libthreads.h index a899881..f6de95b 100644 --- a/libthreads.h +++ b/libthreads.h @@ -5,7 +5,7 @@ extern "C" { #endif - typedef void (*thrd_start_t)(); + typedef void (*thrd_start_t)(void *); typedef int thrd_t; diff --git a/main.cc b/main.cc index 967fd39..d24602b 100644 --- a/main.cc +++ b/main.cc @@ -57,7 +57,7 @@ void real_main() { do { /* Start user program */ - model->add_thread(new Thread(&user_thread, &user_main, NULL)); + model->add_thread(new Thread(&user_thread, (void (*)(void *)) &user_main, NULL)); /* Wait for all threads to complete */ thread_wait_finish(); diff --git a/schedule.cc b/schedule.cc index 40f9894..328bda6 100644 --- a/schedule.cc +++ b/schedule.cc @@ -1,8 +1,15 @@ +/* -*- Mode: C; indent-tabs-mode: t -*- */ + #include "threads.h" #include "schedule.h" #include "common.h" #include "model.h" +Scheduler::Scheduler(): +current(NULL) +{ +} + void Scheduler::add_thread(Thread *t) { DEBUG("thread %d\n", t->get_id()); diff --git a/schedule.h b/schedule.h index 8267fee..e81ea93 100644 --- a/schedule.h +++ b/schedule.h @@ -1,3 +1,5 @@ +/* -*- Mode: C; indent-tabs-mode: t -*- */ + #ifndef __SCHEDULE_H__ #define __SCHEDULE_H__ @@ -9,6 +11,7 @@ class Thread; class Scheduler { public: + Scheduler(); void add_thread(Thread *t); void remove_thread(Thread *t); Thread * next_thread(void); diff --git a/threads.cc b/threads.cc index 0ed7bdc..35000dc 100644 --- a/threads.cc +++ b/threads.cc @@ -45,7 +45,7 @@ int Thread::create_context() 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); + makecontext(&context, thread_startup, 0); return 0; } @@ -70,7 +70,7 @@ void Thread::complete() } } -Thread::Thread(thrd_t *t, void (*func)(), void *a) { +Thread::Thread(thrd_t *t, void (*func)(void *), void *a) { int ret; user_thread = t; diff --git a/threads.h b/threads.h index b592804..5731906 100644 --- a/threads.h +++ b/threads.h @@ -18,7 +18,7 @@ typedef enum thread_state { class Thread { public: - Thread(thrd_t *t, void (*func)(), void *a); + Thread(thrd_t *t, void (*func)(void *), void *a); ~Thread(); void complete(); @@ -30,12 +30,13 @@ public: thread_id_t get_id(); thrd_t get_thrd_t() { return *user_thread; } Thread * get_parent() { return parent; } + friend void thread_startup(); MEMALLOC private: int create_context(); Thread *parent; - void (*start_routine)(); + void (*start_routine)(void *); void *arg; ucontext_t context; void *stack; -- 2.34.1