From: Brian Norris <banorris@uci.edu>
Date: Sun, 3 Mar 2013 07:53:29 +0000 (-0800)
Subject: threads: add waiting_on()
X-Git-Tag: oopsla2013~169
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0a650d68e478aff11bf8b72ee04ed7cc6a102ce8;p=model-checker.git

threads: add waiting_on()

For use with deadlock detection
---

diff --git a/threads-model.h b/threads-model.h
index 2cd09ab..b15c409 100644
--- a/threads-model.h
+++ b/threads-model.h
@@ -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
diff --git a/threads.cc b/threads.cc
index 762bbff..f417b3f 100644
--- a/threads.cc
+++ b/threads.cc
@@ -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;
+}