Approach 2
[c11tester.git] / threads.cc
index 8b55a91b186b61534ec124ca2a990283c11a3ffb..a576697f561087fe2c09c607e44ef02bb0c6fa8c 100644 (file)
@@ -14,6 +14,7 @@
 #include "model.h"
 #include "execution.h"
 #include "schedule.h"
+#include "clockvector.h"
 
 #ifdef TLS
 #include <dlfcn.h>
@@ -359,6 +360,7 @@ void Thread::complete()
  */
 Thread::Thread(thread_id_t tid) :
        parent(NULL),
+       acq_fence_cv(new ClockVector()),
        creation(NULL),
        pending(NULL),
        start_routine(NULL),
@@ -384,6 +386,7 @@ Thread::Thread(thread_id_t tid) :
  */
 Thread::Thread(thread_id_t tid, thrd_t *t, void (*func)(void *), void *a, Thread *parent) :
        parent(parent),
+       acq_fence_cv(new ClockVector()),
        creation(NULL),
        pending(NULL),
        start_routine(func),
@@ -416,6 +419,7 @@ Thread::Thread(thread_id_t tid, thrd_t *t, void (*func)(void *), void *a, Thread
  */
 Thread::Thread(thread_id_t tid, thrd_t *t, void *(*func)(void *), void *a, Thread *parent) :
        parent(parent),
+       acq_fence_cv(new ClockVector()),
        creation(NULL),
        pending(NULL),
        start_routine(NULL),
@@ -444,6 +448,8 @@ Thread::~Thread()
 {
        if (!is_complete())
                complete();
+
+       delete acq_fence_cv;
 }
 
 /** @return The thread_id_t corresponding to this Thread object. */
@@ -490,6 +496,14 @@ Thread * Thread::waiting_on() const
 bool Thread::is_waiting_on(const Thread *t) const
 {
        Thread *wait;
+
+       // One thread relocks a recursive mutex
+       if (waiting_on() == t && pending->is_lock()) {
+               int mutex_type = pending->get_mutex()->get_state()->type;
+               if (mutex_type == PTHREAD_MUTEX_RECURSIVE)
+                       return false;
+       }
+
        for (wait = waiting_on();wait != NULL;wait = wait->waiting_on())
                if (wait == t)
                        return true;