changeset 26:da66467f2884

Refactoring.
author shade
date Thu, 11 May 2017 19:29:06 +0200
parents 0aaf8f291161
children 0a0c91d93ea2
files src/main/java/org/openjdk/shenandoah/Colors.java src/main/java/org/openjdk/shenandoah/DataProvider.java src/main/java/org/openjdk/shenandoah/RegionStat.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java
diffstat 4 files changed, 84 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/openjdk/shenandoah/Colors.java	Thu May 11 19:10:06 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/Colors.java	Thu May 11 19:29:06 2017 +0200
@@ -4,13 +4,18 @@
 
 public class Colors {
 
-    static final Color TLAB_ALLOC  = new Color(0, 250, 250);
-    static final Color TLAB_ALLOC_BORDER  = new Color(0, 191, 190);
-    static final Color GCLAB_ALLOC = new Color(185, 0, 250);
-    static final Color GCLAB_ALLOC_BORDER = new Color(118, 0, 160);
-    static final Color USED        = new Color(150, 150, 150);
-    static final Color LIVE        = new Color(0, 200, 0);
-    static final Color LIVE_BORDER = new Color(0, 100, 0);
-    static final Color CSET        = Color.YELLOW;
-    static final Color HUMONGOUS   = Color.RED;
+    static final Color TIMELINE_IDLE        = Color.BLACK;
+    static final Color TIMELINE_MARK        = new Color(100, 100, 0);
+    static final Color TIMELINE_EVACUATING  = new Color(100, 0, 0);
+    static final Color TIMELINE_UPDATEREFS  = new Color(0, 100, 100);
+
+    static final Color TLAB_ALLOC           = new Color(0, 250, 250);
+    static final Color TLAB_ALLOC_BORDER    = new Color(0, 191, 190);
+    static final Color GCLAB_ALLOC          = new Color(185, 0, 250);
+    static final Color GCLAB_ALLOC_BORDER   = new Color(118, 0, 160);
+    static final Color USED                 = new Color(150, 150, 150);
+    static final Color LIVE                 = new Color(0, 200, 0);
+    static final Color LIVE_BORDER          = new Color(0, 100, 0);
+    static final Color CSET                 = Color.YELLOW;
+    static final Color HUMONGOUS            = Color.RED;
 }
--- a/src/main/java/org/openjdk/shenandoah/DataProvider.java	Thu May 11 19:10:06 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/DataProvider.java	Thu May 11 19:29:06 2017 +0200
@@ -46,7 +46,7 @@
         List<RegionStat> stats = new ArrayList<>();
         for (int c = 0; c < maxRegions; c++) {
             StringMonitor mtrx = matrix[c];
-            stats.add(new RegionStat(maxSize, data[c].longValue(), (mtrx == null ? "" : mtrx.stringValue())));
+            stats.add(new RegionStat(data[c].longValue(), (mtrx == null ? "" : mtrx.stringValue())));
         }
 
         long time = timestamp.longValue();
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java	Thu May 11 19:10:06 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java	Thu May 11 19:29:06 2017 +0200
@@ -9,22 +9,23 @@
 public class RegionStat {
 
     private static final int PERCENT_MASK = 0x7f;
+    private static final int FLAGS_MASK   = 0x3f;
+
     private static final int USED_SHIFT   = 0;
     private static final int LIVE_SHIFT   = 7;
     private static final int TLAB_SHIFT   = 14;
     private static final int GCLAB_SHIFT  = 21;
-    private static final int FLAGS_MASK = 0x3f;
-    private static final int FLAGS_SHIFT = 58;
+    private static final int FLAGS_SHIFT  = 58;
 
     private final EnumSet<RegionFlag> flags;
     private final BitSet incoming;
-    private final double liveLvl;
-    private final double usedLvl;
-    private final double tlabLvl;
-    private final double gclabLvl;
+    private final float liveLvl;
+    private final float usedLvl;
+    private final float tlabLvl;
+    private final float gclabLvl;
 
-    public RegionStat(double usedLvl, double liveLvl, double tlabLvl, double gclabLvl, EnumSet<RegionFlag> flags) {
-        this.incoming = new BitSet();
+    public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, EnumSet<RegionFlag> flags) {
+        this.incoming = null;
         this.usedLvl = usedLvl;
         this.liveLvl = liveLvl;
         this.tlabLvl = tlabLvl;
@@ -32,11 +33,11 @@
         this.flags = flags;
     }
 
-    public RegionStat(long maxSize, long data, String matrix) {
-        usedLvl  = ((data >>> USED_SHIFT)  & PERCENT_MASK) / 100D;
-        liveLvl  = ((data >>> LIVE_SHIFT)  & PERCENT_MASK) / 100D;
-        tlabLvl  = ((data >>> TLAB_SHIFT)  & PERCENT_MASK) / 100D;
-        gclabLvl = ((data >>> GCLAB_SHIFT) & PERCENT_MASK) / 100D;
+    public RegionStat(long data, String matrix) {
+        usedLvl  = ((data >>> USED_SHIFT)  & PERCENT_MASK) / 100F;
+        liveLvl  = ((data >>> LIVE_SHIFT)  & PERCENT_MASK) / 100F;
+        tlabLvl  = ((data >>> TLAB_SHIFT)  & PERCENT_MASK) / 100F;
+        gclabLvl = ((data >>> GCLAB_SHIFT) & PERCENT_MASK) / 100F;
 
         long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK;
 
@@ -47,16 +48,20 @@
         if ((stat & 4) > 0) flags.add(RegionFlag.HUMONGOUS);
         if ((stat & 8) > 0) flags.add(RegionFlag.PINNED);
 
-        this.incoming = new BitSet();
-        int idx = 0;
-        for (char c : matrix.toCharArray()) {
-            c = (char) (c - 32);
-            incoming.set(idx++, (c & (1 << 0)) > 0);
-            incoming.set(idx++, (c & (1 << 1)) > 0);
-            incoming.set(idx++, (c & (1 << 2)) > 0);
-            incoming.set(idx++, (c & (1 << 3)) > 0);
-            incoming.set(idx++, (c & (1 << 4)) > 0);
-            incoming.set(idx++, (c & (1 << 5)) > 0);
+        if (!matrix.isEmpty()) {
+            this.incoming = new BitSet();
+            int idx = 0;
+            for (char c : matrix.toCharArray()) {
+                c = (char) (c - 32);
+                incoming.set(idx++, (c & (1 << 0)) > 0);
+                incoming.set(idx++, (c & (1 << 1)) > 0);
+                incoming.set(idx++, (c & (1 << 2)) > 0);
+                incoming.set(idx++, (c & (1 << 3)) > 0);
+                incoming.set(idx++, (c & (1 << 4)) > 0);
+                incoming.set(idx++, (c & (1 << 5)) > 0);
+            }
+        } else {
+            this.incoming = null;
         }
     }
 
@@ -126,38 +131,38 @@
 
         RegionStat that = (RegionStat) o;
 
-        if (Double.compare(that.liveLvl, liveLvl) != 0) return false;
-        if (Double.compare(that.usedLvl, usedLvl) != 0) return false;
+        if (Float.compare(that.liveLvl, liveLvl) != 0) return false;
+        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;
-        return incoming.equals(that.incoming);
+        return incoming != null ? incoming.equals(that.incoming) : that.incoming == null;
     }
 
     @Override
     public int hashCode() {
-        int result;
-        long temp;
-        result = flags.hashCode();
-        result = 31 * result + incoming.hashCode();
-        temp = Double.doubleToLongBits(liveLvl);
-        result = 31 * result + (int) (temp ^ (temp >>> 32));
-        temp = Double.doubleToLongBits(usedLvl);
-        result = 31 * result + (int) (temp ^ (temp >>> 32));
+        int result = flags.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);
+        result = 31 * result + (tlabLvl != +0.0f ? Float.floatToIntBits(tlabLvl) : 0);
+        result = 31 * result + (gclabLvl != +0.0f ? Float.floatToIntBits(gclabLvl) : 0);
         return result;
     }
 
-    public double live() {
+    public float live() {
         return liveLvl;
     }
 
-    public double used() {
+    public float used() {
         return usedLvl;
     }
 
-    public double tlabAllocs() {
+    public float tlabAllocs() {
         return tlabLvl;
     }
 
-    public double gclabAllocs() {
+    public float gclabAllocs() {
         return gclabLvl;
     }
 
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Thu May 11 19:10:06 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Thu May 11 19:29:06 2017 +0200
@@ -204,16 +204,16 @@
 
                 switch (s.phase()) {
                     case IDLE:
-                        g.setColor(Color.BLACK);
+                        g.setColor(Colors.TIMELINE_IDLE);
                         break;
                     case MARKING:
-                        g.setColor(new Color(100, 100, 0));
+                        g.setColor(Colors.TIMELINE_MARK);
                         break;
                     case EVACUATING:
-                        g.setColor(new Color(100, 0, 0));
+                        g.setColor(Colors.TIMELINE_EVACUATING);
                         break;
                     case UPDATE_REFS:
-                        g.setColor(new Color(0, 100, 100));
+                        g.setColor(Colors.TIMELINE_UPDATEREFS);
                         break;
                     default:
                         g.setColor(Color.WHITE);
@@ -241,40 +241,40 @@
             Map<String, RegionStat> items = new LinkedHashMap<>();
 
             items.put("Unused",
-                    new RegionStat(0.0, 0.0, 0.0, 0.0, EnumSet.of(UNUSED)));
+                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED)));
 
             items.put("Empty",
-                    new RegionStat(0.0, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("1/2 Used",
-                    new RegionStat(0.5, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used",
-                    new RegionStat(1.0, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used, 100% TLAB Allocs",
-                    new RegionStat(1.0, 0.0, 1.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used, 100% GCLAB Allocs",
-                    new RegionStat(1.0, 0.0, 0.0, 1.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used, 50%/50% TLAB/GCLAB Allocs",
-                    new RegionStat(1.0, 0.0, 0.5, 0.5, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Live",
-                    new RegionStat(1.0, 1.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Live + Humongous",
-                    new RegionStat(1.0, 1.0, 0.0, 0.0, EnumSet.of(HUMONGOUS)));
+                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS)));
 
             items.put("1/3 Live",
-                    new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("1/3 Live + In Collection Set",
-                    new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.of(IN_COLLECTION_SET)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET)));
 
             items.put("1/3 Live + Pinned",
-                    new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.of(PINNED)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(PINNED)));
 
             int i = 1;
             for (String key : items.keySet()) {
@@ -303,15 +303,17 @@
             for (int f = 0; f < snapshot.regionCount(); f++) {
                 RegionStat s = snapshot.get(f);
                 BitSet bs = s.incoming();
-                for (int t = 0; t < snapshot.regionCount(); t++) {
-                    if (bs.get(t)) {
-                        int f_rectx = (int) ((f % cols + 0.5) * sqSize);
-                        int f_recty = (int) ((f / cols + 0.5) * sqSize);
-                        int t_rectx = (int) ((t % cols + 0.5) * sqSize);
-                        int t_recty = (int) ((t / cols + 0.5) * sqSize);
+                if (bs != null) {
+                    for (int t = 0; t < snapshot.regionCount(); t++) {
+                        if (bs.get(t)) {
+                            int f_rectx = (int) ((f % cols + 0.5) * sqSize);
+                            int f_recty = (int) ((f / cols + 0.5) * sqSize);
+                            int t_rectx = (int) ((t % cols + 0.5) * sqSize);
+                            int t_recty = (int) ((t / cols + 0.5) * sqSize);
 
-                        g.setColor(BASE);
-                        g.drawLine(f_rectx, f_recty, t_rectx, t_recty);
+                            g.setColor(BASE);
+                            g.drawLine(f_rectx, f_recty, t_rectx, t_recty);
+                        }
                     }
                 }
             }