Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Jun 2012 20:01:59 +0000
From:      gmiller@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r238505 - in soc2012/gmiller/locking-head: . lib/libwitness
Message-ID:  <20120628200159.7AAE41065674@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gmiller
Date: Thu Jun 28 20:01:59 2012
New Revision: 238505
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=238505

Log:
   r238486@FreeBSD-dev:  root | 2012-06-20 04:45:15 -0500
   Maintain a lock order graph and add checks (but no error messages or
   recording of the LoR data yet).

Modified:
  soc2012/gmiller/locking-head/   (props changed)
  soc2012/gmiller/locking-head/lib/libwitness/graph.c
  soc2012/gmiller/locking-head/lib/libwitness/lists.c
  soc2012/gmiller/locking-head/lib/libwitness/witness.h

Modified: soc2012/gmiller/locking-head/lib/libwitness/graph.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/graph.c	Thu Jun 28 20:01:47 2012	(r238504)
+++ soc2012/gmiller/locking-head/lib/libwitness/graph.c	Thu Jun 28 20:01:59 2012	(r238505)
@@ -52,23 +52,10 @@
 	return (NULL);
 }
 
-static struct graph_node *
-get_node(void *lock)
-{
-	if (root != NULL) {
-		return (scan_graph(root, lock));
-	}
-
-	return (NULL);
-}
-
-int
+/* XXX: produces suboptimal graph, fix this before the end of the project */
+static int
 insert_edge(struct graph_node *from, struct graph_node *to)
 {
-#if 1
-  // suppress warning
-  get_node(from->lock);
-#endif
 	if (from == to) {
 		return (0);
 	}
@@ -77,8 +64,30 @@
 		return (-1);
 	}
 
-	/* XXX */
+	to->sibling = from->child;
+	from->child = to;
 
 	return (0);
 }
 
+static struct graph_node *
+lookup_node(void *lock)
+{
+	struct graph_node *node;
+
+	node = scan_graph(root, lock);
+	if (node == NULL) {
+		node = malloc(sizeof(struct graph_node));
+		node->lock = lock;
+		node->child = NULL;
+		node->sibling = NULL;
+	}
+
+	return (node);
+}
+
+int
+insert_lock(void *new_lock, void *previous)
+{
+	return (insert_edge(lookup_node(previous), lookup_node(new_lock)));
+}

Modified: soc2012/gmiller/locking-head/lib/libwitness/lists.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/lists.c	Thu Jun 28 20:01:47 2012	(r238504)
+++ soc2012/gmiller/locking-head/lib/libwitness/lists.c	Thu Jun 28 20:01:59 2012	(r238505)
@@ -47,12 +47,19 @@
 add_lock(void *lock)
 {
 	struct lock_entry *entry;
+	struct lock_entry *next;
+
+	next = SLIST_FIRST(&lock_head);
 
 	entry = malloc(sizeof(*entry));
 	entry->lock = lock;
 
 	SLIST_INSERT_HEAD(&lock_head, entry, lock_next);
 
+	if (insert_lock(entry, next) < 0) {
+	  /* XXX: LoR */
+	}
+
 	printf("inserted lock %p\n", lock);
 	dump_locks();
 }

Modified: soc2012/gmiller/locking-head/lib/libwitness/witness.h
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/witness.h	Thu Jun 28 20:01:47 2012	(r238504)
+++ soc2012/gmiller/locking-head/lib/libwitness/witness.h	Thu Jun 28 20:01:59 2012	(r238505)
@@ -47,4 +47,4 @@
 void	add_lock(void *lock);
 void	remove_lock(void *lock);
 
-int	insert_edge(struct graph_node *from, struct graph_node *to);
+int	insert_lock(void *new_lock, void *previous);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120628200159.7AAE41065674>