--- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTable.java Tue Feb 19 10:03:41 2019 +0100
+++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTable.java Tue Feb 19 10:04:28 2019 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,8 @@
package sun.jvm.hotspot.gc.z;
+import java.util.Iterator;
+
import sun.jvm.hotspot.debugger.Address;
import sun.jvm.hotspot.runtime.VM;
import sun.jvm.hotspot.runtime.VMObject;
@@ -63,4 +65,112 @@
boolean is_relocating(Address o) {
return getEntry(o).relocating();
}
+
+ private class ZPagesIterator implements Iterator<ZPage> {
+ private ZAddressRangeMapForPageTable.Iterator mapIter;
+ private ZPage next;
+
+ ZPagesIterator() {
+ mapIter = map().new Iterator();
+ positionToNext();
+ }
+
+ private ZPage positionToNext() {
+ ZPage current = next;
+
+ // Find next
+ ZPage found = null;
+ while (mapIter.hasNext()) {
+ ZPageTableEntry entry = new ZPageTableEntry(mapIter.next());
+ if (!entry.isEmpty()) {
+ ZPage page = entry.page();
+ // Medium pages have repeated entries for all covered slots,
+ // therefore we need to compare against the current page.
+ if (page != null && !page.equals(current)) {
+ found = page;
+ break;
+ }
+ }
+ }
+
+ next = found;
+
+ return current;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ @Override
+ public ZPage next() {
+ return positionToNext();
+ }
+
+ @Override
+ public void remove() {
+ /* not supported */
+ }
+ }
+
+ abstract class ZPageFilter {
+ public abstract boolean accept(ZPage page);
+ }
+
+ class ZPagesFilteredIterator implements Iterator<ZPage> {
+ private ZPage next;
+ private ZPagesIterator iter = new ZPagesIterator();
+ private ZPageFilter filter;
+
+ ZPagesFilteredIterator(ZPageFilter filter) {
+ this.filter = filter;
+ positionToNext();
+ }
+
+ public ZPage positionToNext() {
+ ZPage current = next;
+
+ // Find next
+ ZPage found = null;
+ while (iter.hasNext()) {
+ ZPage page = iter.next();
+ if (filter.accept(page)) {
+ found = page;
+ break;
+ }
+ }
+
+ next = found;
+
+ return current;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ @Override
+ public ZPage next() {
+ return positionToNext();
+ }
+
+ @Override
+ public void remove() {
+ /* not supported */
+ }
+ }
+
+ public Iterator<ZPage> iterator() {
+ return new ZPagesIterator();
+ }
+
+ public Iterator<ZPage> activePagesIterator() {
+ return new ZPagesFilteredIterator(new ZPageFilter() {
+ public boolean accept(ZPage page) {
+ return page.is_active();
+ }
+ });
+ }
}