add support for pthread_create (in progress)
[c11tester.git] / threads.cc
index a06af84636978f1bbd31f960c0c2368d79fc609a..d7034e93e0d5d34afcfe0377dda9b4688dce91f5 100644 (file)
@@ -52,7 +52,6 @@ void thread_startup()
 
        /* Call the actual thread function */
        curr_thread->start_routine(curr_thread->arg);
-
        /* Finish thread properly */
        model->switch_to_master(new ModelAction(THREAD_FINISH, std::memory_order_seq_cst, curr_thread));
 }
@@ -170,9 +169,37 @@ Thread::Thread(thread_id_t tid, thrd_t *t, void (*func)(void *), void *a, Thread
        if (ret)
                model_print("Error in create_context\n");
 
-       user_thread->priv = this;
+       // user_thread->priv = this; // WL
+}
+
+/**
+ * Construct a new thread for pthread.
+ * @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");
 }
 
+
 /** Destructor */
 Thread::~Thread()
 {
@@ -207,6 +234,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;