threads: add waiting_on()
authorBrian Norris <banorris@uci.edu>
Sun, 3 Mar 2013 07:53:29 +0000 (23:53 -0800)
committerBrian Norris <banorris@uci.edu>
Sun, 3 Mar 2013 07:53:29 +0000 (23:53 -0800)
For use with deadlock detection

threads-model.h
threads.cc

index 2cd09ab53739de7d327de3e5758af6b7ba66465d..b15c40944aedadb3114d1239d1f16b6259e51535 100644 (file)
@@ -104,6 +104,8 @@ public:
         *  @see Thread::pending */
        void set_pending(ModelAction *act) { pending = act; }
 
+       Thread * waiting_on() const;
+
        /**
         * Remove one ModelAction from the waiting list
         * @return The ModelAction that was removed from the waiting list
index 762bbff34c2463a3dbaf6179e3af3e1eb977ca8b..f417b3ff353fa3a59a23328c44dfb6b908f4727c 100644 (file)
@@ -5,6 +5,7 @@
 #include <string.h>
 
 #include <threads.h>
+#include <mutex>
 #include "common.h"
 #include "threads-model.h"
 #include "action.h"
@@ -197,3 +198,19 @@ void Thread::set_state(thread_state s)
        ASSERT(s == THREAD_COMPLETED || state != THREAD_COMPLETED);
        state = s;
 }
+
+/**
+ * Get the Thread that this Thread is waiting on
+ * @return The thread we are waiting on, if any; otherwise NULL
+ */
+Thread * Thread::waiting_on() const
+{
+       if (!pending)
+               return NULL;
+
+       if (pending->get_type() == THREAD_JOIN)
+               return pending->get_thread_operand();
+       else if (pending->is_lock())
+               return (Thread *)pending->get_mutex()->get_state()->locked;
+       return NULL;
+}