Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 01 Aug 2012 08:13:59 +0000
From:      gmiller@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r239982 - in soc2012/gmiller/locking-head: . lib/libwitness
Message-ID:  <20120801081359.4A3BE1065670@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gmiller
Date: Wed Aug  1 08:13:59 2012
New Revision: 239982
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=239982

Log:
   r240027@FreeBSD-dev:  root | 2012-07-24 11:56:51 -0500
   Fix crashes and graph generation errors that produced infinite loops and
   more crashes.

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

Modified: soc2012/gmiller/locking-head/lib/libwitness/graph.c
==============================================================================
--- soc2012/gmiller/locking-head/lib/libwitness/graph.c	Wed Aug  1 08:12:56 2012	(r239981)
+++ soc2012/gmiller/locking-head/lib/libwitness/graph.c	Wed Aug  1 08:13:59 2012	(r239982)
@@ -34,6 +34,7 @@
 scan_graph(struct lock_info *graph, struct lock_info *lock)
 {
 	int		ret;
+	struct lock_info *child;
 
 	if (graph == NULL) {
 		return (0);
@@ -43,9 +44,11 @@
 		return (1);
 	}
 
-	ret = scan_graph(graph->child, lock);
-	if (!ret) {
-		ret = scan_graph(graph->sibling, lock);
+	ret = 0;
+	child = graph->child;
+	while (ret == 0 && child != NULL) {
+		ret = scan_graph(child, lock);
+		child = child->sibling;
 	}
 
 	return (ret);
@@ -74,28 +77,21 @@
 				child->sibling = from->child;
 				from->child = child;
 			}
+
+			break;
 		}
 
+		previous = child;
 		child = next;
 	}
 }
 
-static void
-optimize_links(struct lock_info *to)
-{
-	struct lock_info *from;
-
-	SLIST_FOREACH(from, &graph_roots, root_next) {
-		if (scan_graph(from, to)) {
-			optimize_path(from, to);
-		}
-	}
-}
-
 int
 insert_lock(struct lock_info *from, struct lock_info *to)
 {
 	struct lock_info *child;
+	struct lock_info *node;
+	struct lock_info *node_temp;
 
 	if (from == to || from == NULL || to == NULL) {
 		return (0);
@@ -105,19 +101,29 @@
 		return (-1);
 	}
 
-	SLIST_REMOVE(&graph_roots, from, lock_info, root_next);
+	if (SLIST_FIRST(&graph_roots) == to) {
+		SLIST_REMOVE_HEAD(&graph_roots, root_next);
+	} else {
+		SLIST_FOREACH_SAFE(node, &graph_roots, root_next, node_temp) {
+			if (SLIST_NEXT(node, root_next) == to) {
+				SLIST_REMOVE_AFTER(node, root_next);
+			}
+		}
+	}
 
-	to->sibling = from->child;
-	from->child = to;
+	if (to != from->child) {
+		to->sibling = from->child;
+		from->child = to;
+	}
 
 	child = to->sibling;
 	while (child != NULL) {
-		optimize_links(child);
+		optimize_path(from, child);
 
 		child = child->sibling;
 	}
 
-	optimize_links(to);
+	optimize_path(from, to);
 
 	return (0);
 }



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