changeset 16:a54d31fa9630

Introduce enums for region flags.
author shade
date Wed, 01 Feb 2017 10:16:06 +0100
parents fac0698361e5
children 5324a16e1e63
files src/main/java/org/openjdk/shenandoah/RegionFlag.java src/main/java/org/openjdk/shenandoah/RegionStat.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java
diffstat 3 files changed, 53 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/openjdk/shenandoah/RegionFlag.java	Wed Feb 01 10:16:06 2017 +0100
@@ -0,0 +1,15 @@
+package org.openjdk.shenandoah;
+
+public enum RegionFlag {
+
+    UNUSED,
+
+    HUMONGOUS,
+
+    IN_COLLECTION_SET,
+
+    RECENTLY_ALLOCATED,
+
+    PINNED,
+
+}
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java	Wed Feb 01 10:04:06 2017 +0100
+++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java	Wed Feb 01 10:16:06 2017 +0100
@@ -1,6 +1,7 @@
 package org.openjdk.shenandoah;
 
 import java.awt.*;
+import java.util.EnumSet;
 
 public class RegionStat {
 
@@ -11,23 +12,14 @@
     private static final int FLAGS_MASK = 0x3f;
     private static final int FLAGS_SHIFT = 58;
 
-    private final boolean unused;
-    private final boolean humongous;
-    private final boolean inCset;
-    private final boolean newlyAllocated;
-    private final boolean pinned;
+    private final EnumSet<RegionFlag> flags;
     private final double liveLvl;
     private final double usedLvl;
-    private long ma;
 
-    public RegionStat(double usedLvl, double liveLvl, boolean unused, boolean humongous, boolean inCset, boolean newlyAllocated) {
+    public RegionStat(double usedLvl, double liveLvl, EnumSet<RegionFlag> flags) {
         this.usedLvl = usedLvl;
         this.liveLvl = liveLvl;
-        this.unused = unused;
-        this.humongous = humongous;
-        this.inCset = inCset;
-        this.newlyAllocated = newlyAllocated;
-        this.pinned = false;
+        this.flags = flags;
     }
 
     public RegionStat(long maxSize, long data) {
@@ -38,11 +30,14 @@
         liveLvl = Math.min(1D, 1D * live / maxSize);
 
         long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK;
-        unused = (stat & 1) > 0;
-        inCset = (stat & 2) > 0;
-        humongous = (stat & 4) > 0;
-        newlyAllocated = (stat & 8) > 0;
-        pinned = (stat & 16) > 0;
+
+        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.RECENTLY_ALLOCATED);
+        if ((stat & 16) > 0) flags.add(RegionFlag.PINNED);
     }
 
     public void render(Graphics g, int x, int y, int width, int height) {
@@ -51,13 +46,13 @@
 
         int usedWidth = (int) (width * usedLvl);
         g.setColor(
-                newlyAllocated ?
+                flags.contains(RegionFlag.RECENTLY_ALLOCATED) ?
                 new Color(0, 250, 250) :
                 new Color(150, 150, 150)
         );
         g.fillRect(x, y, usedWidth, height);
 
-        if (!newlyAllocated) {
+        if (!flags.contains(RegionFlag.RECENTLY_ALLOCATED)) {
             int liveWidth = (int) (width * liveLvl);
             g.setColor(new Color(0, 200, 0));
             g.fillRect(x, y, liveWidth, height);
@@ -66,27 +61,27 @@
             g.drawLine(x + liveWidth, y, x + liveWidth, y + height);
         }
 
-        if (inCset) {
+        if (flags.contains(RegionFlag.IN_COLLECTION_SET)) {
             g.setColor(Color.YELLOW);
             g.fillRect(x, y, width, height / 3);
             g.setColor(Color.BLACK);
             g.drawRect(x, y, width, height / 3);
         }
 
-        if (humongous) {
+        if (flags.contains(RegionFlag.HUMONGOUS)) {
             g.setColor(Color.RED);
             g.fillRect(x, y, width, height / 3);
             g.setColor(Color.BLACK);
             g.drawRect(x, y, width, height / 3);
         }
 
-        if (unused) {
+        if (flags.contains(RegionFlag.UNUSED)) {
             g.setColor(Color.BLACK);
             g.drawLine(x, y, x + width, y + height);
             g.drawLine(x, y + height, x + width, y);
         }
 
-        if (pinned) {
+        if (flags.contains(RegionFlag.PINNED)) {
             g.setColor(Color.RED);
             g.fillOval(x + width/2, y + height/2, width/4, height/4);
         }
@@ -102,20 +97,16 @@
 
         RegionStat that = (RegionStat) o;
 
-        if (unused != that.unused) return false;
-        if (humongous != that.humongous) return false;
-        if (inCset != that.inCset) return false;
         if (Double.compare(that.liveLvl, liveLvl) != 0) return false;
-        return Double.compare(that.usedLvl, usedLvl) == 0;
+        if (Double.compare(that.usedLvl, usedLvl) != 0) return false;
+        return flags.equals(that.flags);
     }
 
     @Override
     public int hashCode() {
         int result;
         long temp;
-        result = (unused ? 1 : 0);
-        result = 31 * result + (humongous ? 1 : 0);
-        result = 31 * result + (inCset ? 1 : 0);
+        result = flags.hashCode();
         temp = Double.doubleToLongBits(liveLvl);
         result = 31 * result + (int) (temp ^ (temp >>> 32));
         temp = Double.doubleToLongBits(usedLvl);
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Wed Feb 01 10:04:06 2017 +0100
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Wed Feb 01 10:16:06 2017 +0100
@@ -29,6 +29,7 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.awt.image.BufferedImage;
+import java.util.EnumSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.concurrent.Executors;
@@ -36,6 +37,8 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
+import static org.openjdk.shenandoah.RegionFlag.*;
+
 class ShenandoahVisualizer {
 
     private static final int INITIAL_WIDTH = 1000;
@@ -157,28 +160,34 @@
         Map<String, RegionStat> items = new LinkedHashMap<>();
 
         items.put("Unused",
-                new RegionStat(0.0, 0.0, true, false, false, false));
+                new RegionStat(0.0, 0.0, EnumSet.of(UNUSED)));
 
         items.put("Empty",
-                new RegionStat(0.0, 0.0, false, false, false, false));
+                new RegionStat(0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
 
         items.put("1/2 Used",
-                new RegionStat(0.5, 0.0, false, false, false, false));
+                new RegionStat(0.5, 0.0,  EnumSet.noneOf(RegionFlag.class)));
 
         items.put("Fully Used",
-                new RegionStat(1.0, 0.0, false, false, false, false));
+                new RegionStat(1.0, 0.0,  EnumSet.noneOf(RegionFlag.class)));
+
+        items.put("Fully Used, Recently Allocated",
+                new RegionStat(1.0, 0.0,  EnumSet.of(RECENTLY_ALLOCATED)));
 
         items.put("Fully Live",
-                new RegionStat(1.0, 1.0, false, false, false, false));
+                new RegionStat(1.0, 1.0,  EnumSet.noneOf(RegionFlag.class)));
 
         items.put("Fully Live + Humongous",
-                new RegionStat(1.0, 1.0, false, true, false, false));
+                new RegionStat(1.0, 1.0, EnumSet.of(HUMONGOUS)));
 
         items.put("1/3 Live",
-                new RegionStat(1.0, 0.3, false, false, false, false));
+                new RegionStat(1.0, 0.3, EnumSet.noneOf(RegionFlag.class)));
 
         items.put("1/3 Live + In Collection Set",
-                new RegionStat(1.0, 0.3, false, false, true, false));
+                new RegionStat(1.0, 0.3, EnumSet.of(IN_COLLECTION_SET)));
+
+        items.put("1/3 Live + Pinned",
+                new RegionStat(1.0, 0.3, EnumSet.of(PINNED)));
 
         {
             int i = 1;