From 6475a98e4e3305703004e4ea7417ac93bde51153 Mon Sep 17 00:00:00 2001 From: weiyu Date: Thu, 17 Jan 2019 13:17:01 -0800 Subject: [PATCH] add a new thread constructor for pthread --- threads-model.h | 2 ++ threads.cc | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/threads-model.h b/threads-model.h index 733d825f..11f2d547 100644 --- a/threads-model.h +++ b/threads-model.h @@ -42,6 +42,7 @@ class Thread { public: Thread(thread_id_t tid); Thread(thread_id_t tid, thrd_t *t, void (*func)(void *), void *a, Thread *parent); + Thread(thread_id_t tid, thrd_t *t, void *(*func)(void *), void *a, Thread *parent); ~Thread(); void complete(); @@ -131,6 +132,7 @@ private: ModelAction *pending; void (*start_routine)(void *); + void *(*pstart_routine)(void *); void *arg; ucontext_t context; void *stack; diff --git a/threads.cc b/threads.cc index a06af846..3d10f453 100644 --- a/threads.cc +++ b/threads.cc @@ -51,8 +51,10 @@ void thread_startup() model->switch_to_master(new ModelAction(THREAD_START, std::memory_order_seq_cst, curr_thread)); /* Call the actual thread function */ - curr_thread->start_routine(curr_thread->arg); - + if ( !curr_thread->start_routine ) + curr_thread->start_routine(curr_thread->arg); + else + curr_thread->pstart_routine(curr_thread->arg); /* Finish thread properly */ model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, curr_thread)); } @@ -173,6 +175,36 @@ Thread::Thread(thread_id_t tid, thrd_t *t, void (*func)(void *), void *a, Thread user_thread->priv = this; } +/** + * to be modified + * Construct a new thread for pthread_create. + * @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(thread_id_t tid, thrd_t *t, void* (*func)(void *), void *a, Thread *parent) : + parent(parent), + creation(NULL), + pending(NULL), + start_routine(NULL), + pstart_routine(func), + arg(a), + user_thread(t), + id(tid), + state(THREAD_CREATED), + last_action_val(VALUE_NONE), + model_thread(false) +{ + int ret; + + /* Initialize state */ + ret = create_context(); + if (ret) + model_print("Error in create_context\n"); + + user_thread->priv = this; +} + /** Destructor */ Thread::~Thread() { @@ -207,6 +239,9 @@ Thread * Thread::waiting_on() const if (pending->get_type() == THREAD_JOIN) return pending->get_thread_operand(); + else if (pending->get_type() == PTHREAD_JOIN) { + // WL: to be added + } else if (pending->is_lock()) return (Thread *)pending->get_mutex()->get_state()->locked; return NULL; -- 2.34.1