changeset 30:db3d17330c0a

Update for new region state protocol
author shade
date Fri, 15 Sep 2017 12:38:48 +0200
parents a5a481b56059
children 97914d0e20b0
files pom.xml src/main/java/org/openjdk/shenandoah/RegionFlag.java src/main/java/org/openjdk/shenandoah/RegionStat.java src/main/java/org/openjdk/shenandoah/RegionState.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java src/main/java/org/openjdk/shenandoah/Snapshot.java src/test/java/org/openjdk/shenandoah/RenderLegendTest.java
diffstat 7 files changed, 101 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/pom.xml	Thu Jun 15 20:09:13 2017 +0200
+++ b/pom.xml	Fri Sep 15 12:38:48 2017 +0200
@@ -56,6 +56,14 @@
         </plugins>
     </build>
 
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+        </dependency>
+    </dependencies>
+
     <profiles>
         <profile>
             <id>tools.jar-8</id>
--- a/src/main/java/org/openjdk/shenandoah/RegionFlag.java	Thu Jun 15 20:09:13 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-package org.openjdk.shenandoah;
-
-public enum RegionFlag {
-
-    UNUSED,
-
-    HUMONGOUS,
-
-    IN_COLLECTION_SET,
-
-    PINNED,
-
-}
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java	Thu Jun 15 20:09:13 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java	Fri Sep 15 12:38:48 2017 +0200
@@ -18,7 +18,7 @@
     private static final int SHARED_SHIFT = 28;
     private static final int FLAGS_SHIFT  = 58;
 
-    private final EnumSet<RegionFlag> flags;
+    private final RegionState state;
     private final BitSet incoming;
     private final float liveLvl;
     private final float usedLvl;
@@ -26,16 +26,17 @@
     private final float gclabLvl;
     private final float sharedLvl;
 
-    public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, float sharedLvl, EnumSet<RegionFlag> flags) {
+    public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, float sharedLvl, RegionState state) {
         this.incoming = null;
         this.usedLvl = usedLvl;
         this.liveLvl = liveLvl;
         this.tlabLvl = tlabLvl;
         this.gclabLvl = gclabLvl;
         this.sharedLvl = sharedLvl;
-        this.flags = flags;
+        this.state = state;
     }
 
+
     public RegionStat(long data, String matrix) {
         usedLvl  = ((data >>> USED_SHIFT)  & PERCENT_MASK) / 100F;
         liveLvl  = ((data >>> LIVE_SHIFT)  & PERCENT_MASK) / 100F;
@@ -44,13 +45,7 @@
         sharedLvl = ((data >>> SHARED_SHIFT) & PERCENT_MASK) / 100F;
 
         long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK;
-
-        flags = EnumSet.noneOf(RegionFlag.class);
-
-        if ((stat & 1) > 0) flags.add(RegionFlag.UNUSED);
-        if ((stat & 2) > 0) flags.add(RegionFlag.IN_COLLECTION_SET);
-        if ((stat & 4) > 0) flags.add(RegionFlag.HUMONGOUS);
-        if ((stat & 8) > 0) flags.add(RegionFlag.PINNED);
+        state = RegionState.fromOrdinal((int) stat);
 
         if (!matrix.isEmpty()) {
             this.incoming = new BitSet();
@@ -111,27 +106,27 @@
             g.drawRect(lx, ly, sharedWidth, h);
         }
 
-        if (flags.contains(RegionFlag.IN_COLLECTION_SET)) {
+        if (state == RegionState.CSET) {
             g.setColor(Colors.CSET);
             g.fillRect(x, y, width, height / 3);
             g.setColor(Color.BLACK);
             g.drawRect(x, y, width, height / 3);
         }
 
-        if (flags.contains(RegionFlag.HUMONGOUS)) {
+        if (state == RegionState.HUMONGOUS) {
             g.setColor(Colors.HUMONGOUS);
             g.fillRect(x, y, width, height / 3);
             g.setColor(Color.BLACK);
             g.drawRect(x, y, width, height / 3);
         }
 
-        if (flags.contains(RegionFlag.UNUSED)) {
+        if (state == RegionState.EMPTY_UNCOMMITTED || state == RegionState.EMPTY_COMMITTED) {
             g.setColor(Color.BLACK);
             g.drawLine(x, y, x + width, y + height);
             g.drawLine(x, y + height, x + width, y);
         }
 
-        if (flags.contains(RegionFlag.PINNED)) {
+        if (state == RegionState.PINNED) {
             g.setColor(Color.RED);
             g.fillOval(x + width/2, y + height/2, width/4, height/4);
         }
@@ -151,13 +146,13 @@
         if (Float.compare(that.usedLvl, usedLvl) != 0) return false;
         if (Float.compare(that.tlabLvl, tlabLvl) != 0) return false;
         if (Float.compare(that.gclabLvl, gclabLvl) != 0) return false;
-        if (!flags.equals(that.flags)) return false;
+        if (!state.equals(that.state)) return false;
         return incoming != null ? incoming.equals(that.incoming) : that.incoming == null;
     }
 
     @Override
     public int hashCode() {
-        int result = flags.hashCode();
+        int result = state.hashCode();
         result = 31 * result + (incoming != null ? incoming.hashCode() : 0);
         result = 31 * result + (liveLvl != +0.0f ? Float.floatToIntBits(liveLvl) : 0);
         result = 31 * result + (usedLvl != +0.0f ? Float.floatToIntBits(usedLvl) : 0);
@@ -186,8 +181,8 @@
         return sharedLvl;
     }
 
-    public EnumSet<RegionFlag> flags() {
-        return flags;
+    public RegionState state() {
+        return state;
     }
 
     public BitSet incoming() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/openjdk/shenandoah/RegionState.java	Fri Sep 15 12:38:48 2017 +0200
@@ -0,0 +1,36 @@
+package org.openjdk.shenandoah;
+
+public enum RegionState {
+
+    EMPTY_UNCOMMITTED,
+
+    EMPTY_COMMITTED,
+
+    REGULAR,
+
+    HUMONGOUS,
+
+    CSET,
+
+    PINNED,
+
+    TRASH,
+
+    ;
+
+    static RegionState fromOrdinal(int idx) {
+        switch (idx) {
+            case 0: return EMPTY_COMMITTED;
+            case 1: return EMPTY_UNCOMMITTED;
+            case 2: return REGULAR;
+            case 3: return HUMONGOUS;
+            case 4: return HUMONGOUS;
+            case 5: return CSET;
+            case 6: return PINNED;
+            case 7: return TRASH;
+            default:
+                throw new IllegalStateException("Unhandled ordinal: " + idx);
+        }
+    }
+
+}
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Thu Jun 15 20:09:13 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Fri Sep 15 12:38:48 2017 +0200
@@ -34,7 +34,7 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
-import static org.openjdk.shenandoah.RegionFlag.*;
+import static org.openjdk.shenandoah.RegionState.*;
 
 class ShenandoahVisualizer {
 
@@ -157,7 +157,7 @@
         f.get();
     }
 
-    private static class Render implements Runnable {
+    public static class Render implements Runnable {
         public static final int LINE = 20;
 
         final DataProvider data;
@@ -237,52 +237,52 @@
             }
         }
 
-        public synchronized void renderLegend(Graphics g) {
+        public synchronized static void renderLegend(Graphics g) {
             final int sqSize = LINE;
 
             Map<String, RegionStat> items = new LinkedHashMap<>();
 
-            items.put("Unused",
-                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED)));
+            items.put("Empty (uncommitted)",
+                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EMPTY_UNCOMMITTED));
 
-            items.put("Empty",
-                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+            items.put("Empty (committed)",
+                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EMPTY_COMMITTED));
 
             items.put("1/2 Used",
-                    new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, REGULAR));
 
             items.put("Fully Used",
-                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, REGULAR));
 
             items.put("Fully Used, 100% TLAB Allocs",
-                    new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, 0.0f, REGULAR));
 
             items.put("Fully Used, 100% GCLAB Allocs",
-                    new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, REGULAR));
 
             items.put("Fully Used, 100% Shared Allocs",
-                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, REGULAR));
 
             items.put("Fully Used, 50%/50% TLAB/GCLAB Allocs",
-                    new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, 0.0f, REGULAR));
 
             items.put("Fully Used, 33%/33%/33% T/GC/S Allocs",
-                    new RegionStat(1.0f, 0.0f, 1f/3, 1f/3, 1f/3, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 1f/3, 1f/3, 1f/3, REGULAR));
 
             items.put("Fully Live",
-                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, REGULAR));
 
             items.put("Fully Live + Humongous",
-                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS)));
+                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, HUMONGOUS));
 
             items.put("1/3 Live",
-                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, REGULAR));
 
             items.put("1/3 Live + In Collection Set",
-                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, CSET));
 
             items.put("1/3 Live + Pinned",
-                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(PINNED)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, PINNED));
 
             int i = 1;
             for (String key : items.keySet()) {
--- a/src/main/java/org/openjdk/shenandoah/Snapshot.java	Thu Jun 15 20:09:13 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/Snapshot.java	Fri Sep 15 12:38:48 2017 +0200
@@ -108,7 +108,7 @@
     public long collectionSet() {
         long used = 0L;
         for (RegionStat rs : stats) {
-            if (rs.flags().contains(RegionFlag.IN_COLLECTION_SET)) {
+            if (rs.state() == RegionState.CSET) {
                 used += regionSize * rs.used();
             }
         }
@@ -118,7 +118,7 @@
     public long humongous() {
         long used = 0L;
         for (RegionStat rs : stats) {
-            if (rs.flags().contains(RegionFlag.HUMONGOUS)) {
+            if (rs.state() == RegionState.HUMONGOUS) {
                 used += regionSize * rs.used();
             }
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/org/openjdk/shenandoah/RenderLegendTest.java	Fri Sep 15 12:38:48 2017 +0200
@@ -0,0 +1,23 @@
+package org.openjdk.shenandoah;
+
+import org.junit.Test;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+public class RenderLegendTest {
+
+    @Test
+    public void test() throws IOException {
+        BufferedImage img = new BufferedImage(300, 700, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = img.createGraphics();
+        g.setColor(Color.WHITE);
+        g.fillRect(0, 0, 300, 700);
+        ShenandoahVisualizer.Render.renderLegend(g);
+        ImageIO.write(img, "png", new File("legend.png"));
+    }
+
+}