add a new thread constructor for pthread
[c11tester.git] / threads.cc
index a06af84..3d10f45 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 */
-       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;