changeset 3598:9fe4191f46af

IdealGraphVisualizer: Try to resolve UI concurrency issues by introducing locking for the list of graphs in Group and adding graphs to their group only after they have been fully read in.
author Peter Hofer <peter.hofer@jku.at>
date Wed, 19 Oct 2011 17:49:28 +0200
parents 78c94d5d23fb
children 707bc4847b00
files src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java src/share/tools/IdealGraphVisualizer/Data/test/unit/src/com/sun/hotspot/igv/data/Util.java src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java
diffstat 7 files changed, 58 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java	Wed Oct 19 17:49:28 2011 +0200
@@ -79,7 +79,7 @@
 
                 List<Node> curNodes = new ArrayList<Node>();
                 for (Group g : p.getRight()) {
-                    for (InputGraph graph : g.getGraphs()) {
+                    for (InputGraph graph : g.getGraphListCopy()) {
                         curNodes.add(new GraphNode(graph));
                     }
                     g.getChangedEvent().addListener(this);
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java	Wed Oct 19 17:49:28 2011 +0200
@@ -51,7 +51,7 @@
         if (subFolders.size() == 0) {
             Map<Integer, List<Group>> map = new HashMap<Integer, List<Group>>(groups.size());
             for (Group g : groups) {
-                Integer cur = g.getGraphs().size();
+                Integer cur = g.getGraphsCount();
                 if (!map.containsKey(cur)) {
                     map.put(cur, new ArrayList<Group>());
                 }
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java	Wed Oct 19 17:49:28 2011 +0200
@@ -35,14 +35,15 @@
  */
 public class Group extends Properties.Entity implements ChangedEventProvider<Group> {
 
-    private List<InputGraph> graphs;
+    private final List<InputGraph> graphs;
+
     private InputMethod method;
     private String assembly;
     private transient ChangedEvent<Group> changedEvent;
     private transient boolean complete = true;
 
     public Group() {
-        graphs = new ArrayList<InputGraph>();
+        graphs = Collections.synchronizedList(new ArrayList<InputGraph>());
         changedEvent = new ChangedEvent<Group>(this);
 
         // Ensure that name and type are never null
@@ -86,30 +87,50 @@
         return Collections.unmodifiableList(graphs);
     }
 
+    public int getGraphsCount() {
+        return graphs.size();
+    }
+
+    public List<InputGraph> getGraphListCopy() {
+        synchronized (graphs) {
+            return new ArrayList<InputGraph>(graphs);
+        }
+    }
+
+    public void addGraph(InputGraph graph) {
+        synchronized (graphs) {
+            graph.setParent(this, graphs.size());
+            graphs.add(graph);
+        }
+        changedEvent.fire();
+    }
+
     public InputGraph addGraph(String name) {
         return addGraph(name, null);
     }
 
     public InputGraph addGraph(String name, Pair<InputGraph, InputGraph> pair) {
-        InputGraph g = new InputGraph(graphs.size(), this, name, pair);
-        graphs.add(g);
+        InputGraph g;
+        synchronized (graphs) {
+            g = new InputGraph(graphs.size(), this, name, pair);
+            graphs.add(g);
+        }
         changedEvent.fire();
         return g;
     }
 
     public void removeGraph(InputGraph g) {
-        int index = graphs.indexOf(g);
-        if (index != -1) {
-            graphs.remove(g);
+        if (graphs.remove(g)) {
             changedEvent.fire();
         }
     }
 
     public Set<Integer> getAllNodes() {
         Set<Integer> result = new HashSet<Integer>();
-        for (InputGraph g : graphs) {
-            Set<Integer> ids = g.getNodesAsSet();
-            result.addAll(g.getNodesAsSet());
+        synchronized (graphs) {
+            for (InputGraph g : graphs) {
+                result.addAll(g.getNodesAsSet());
+            }
         }
         return result;
     }
@@ -118,9 +139,11 @@
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("Group " + getProperties().toString() + "\n");
-        for (InputGraph g : graphs) {
-            sb.append(g.toString());
-            sb.append("\n");
+        synchronized (graphs) {
+            for (InputGraph g : graphs) {
+                sb.append(g.toString());
+                sb.append('\n');
+            }
         }
         return sb.toString();
     }
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java	Wed Oct 19 17:49:28 2011 +0200
@@ -49,6 +49,10 @@
     private Pair<InputGraph, InputGraph> sourceGraphs;
     private int parentIndex;
 
+    public static InputGraph createWithoutGroup(String name, Pair<InputGraph, InputGraph> sourceGraphs) {
+        return new InputGraph(-1, null, name, sourceGraphs);
+    }
+
     InputGraph(int parentIndex, Group parent, String name, Pair<InputGraph, InputGraph> sourceGraphs) {
         this.parentIndex = parentIndex;
         this.parent = parent;
@@ -60,6 +64,14 @@
         blockEdges = new LinkedHashSet<InputBlockEdge>();
         nodeToBlock = new LinkedHashMap<Integer, InputBlock>();
     }
+    
+    public void setParent(Group parent, int parentIndex) {
+        assert (this.parent == null);
+        assert (this.parentIndex == -1);
+
+        this.parent = parent;
+        this.parentIndex = parentIndex;
+    }
 
     public InputBlockEdge addBlockEdge(InputBlock left, InputBlock right) {
         InputBlockEdge edge = new InputBlockEdge(left, right);
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java	Wed Oct 19 17:49:28 2011 +0200
@@ -211,14 +211,12 @@
 
         @Override
         protected InputGraph start() throws SAXException {
-
             String name = readAttribute(GRAPH_NAME_PROPERTY);
-            InputGraph curGraph = getParentObject().addGraph(name);
+            InputGraph curGraph = InputGraph.createWithoutGroup(name, null);
             if (difference) {
-
                 List<InputGraph> list = getParentObject().getGraphs();
-                if (list.size() > 1) {
-                    InputGraph previous = list.get(list.size() - 2);
+                if (list.size() > 0) {
+                    InputGraph previous = list.get(list.size() - 1);
                     for (InputNode n : previous.getNodes()) {
                         curGraph.addNode(n);
                     }
@@ -279,6 +277,9 @@
                 graph.addBlockEdge(left, right);
             }
             blockConnections.clear();
+            
+            // Add to group
+            getParentObject().addGraph(graph);
         }
     };
     // <nodes>
--- a/src/share/tools/IdealGraphVisualizer/Data/test/unit/src/com/sun/hotspot/igv/data/Util.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/test/unit/src/com/sun/hotspot/igv/data/Util.java	Wed Oct 19 17:49:28 2011 +0200
@@ -70,7 +70,7 @@
 
     public static void assertGroupEquals(Group a, Group b) {
 
-        if (a.getGraphs().size() != b.getGraphs().size()) {
+        if (a.getGraphsCount() != b.getGraphsCount()) {
             fail();
         }
 
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java	Wed Oct 19 15:11:33 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java	Wed Oct 19 17:49:28 2011 +0200
@@ -294,7 +294,7 @@
             }
         });
 
-        if (diagram.getGraph().getGroup().getGraphs().size() == 1) {
+        if (diagram.getGraph().getGroup().getGraphsCount() == 1) {
             rangeSlider.setVisible(false);
         }