add a new thread constructor for pthread
authorweiyu <weiyuluo1232@gmail.com>
Thu, 17 Jan 2019 21:17:01 +0000 (13:17 -0800)
committerweiyu <weiyuluo1232@gmail.com>
Thu, 17 Jan 2019 21:17:01 +0000 (13:17 -0800)
threads-model.h
threads.cc

index 733d825f243ea5ea32a1bde878f37c97448f77b2..11f2d547233119dc165d86eb62f0de8a5f438df5 100644 (file)
@@ -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);
 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();
 
        ~Thread();
        void complete();
 
@@ -131,6 +132,7 @@ private:
        ModelAction *pending;
 
        void (*start_routine)(void *);
        ModelAction *pending;
 
        void (*start_routine)(void *);
+       void *(*pstart_routine)(void *);
        void *arg;
        ucontext_t context;
        void *stack;
        void *arg;
        ucontext_t context;
        void *stack;
index a06af84636978f1bbd31f960c0c2368d79fc609a..3d10f4533bd10e320b17523cdf7affbcb07a476c 100644 (file)
@@ -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 */
        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));
 }
        /* 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;
 }
 
        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()
 {
 /** Destructor */
 Thread::~Thread()
 {
@@ -207,6 +239,9 @@ Thread * Thread::waiting_on() const
 
        if (pending->get_type() == THREAD_JOIN)
                return pending->get_thread_operand();
 
        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;
        else if (pending->is_lock())
                return (Thread *)pending->get_mutex()->get_state()->locked;
        return NULL;