src/hotspot/share/gc/z/zPage.cpp
changeset 54834 39ba09047e19
parent 54169 5748eae24183
child 58708 f74ec3cbfcc0
--- a/src/hotspot/share/gc/z/zPage.cpp	Tue May 14 09:12:06 2019 +0200
+++ b/src/hotspot/share/gc/z/zPage.cpp	Tue May 14 09:55:02 2019 +0200
@@ -28,30 +28,72 @@
 #include "utilities/align.hpp"
 #include "utilities/debug.hpp"
 
-ZPage::ZPage(uint8_t type, ZVirtualMemory vmem, ZPhysicalMemory pmem) :
+ZPage::ZPage(const ZVirtualMemory& vmem, const ZPhysicalMemory& pmem) :
+    _type(type_from_size(vmem.size())),
+    _numa_id((uint8_t)-1),
+    _seqnum(0),
+    _virtual(vmem),
+    _top(start()),
+    _livemap(object_max_count()),
+    _last_used(0),
+    _physical(pmem) {
+  assert_initialized();
+}
+
+ZPage::ZPage(uint8_t type, const ZVirtualMemory& vmem, const ZPhysicalMemory& pmem) :
     _type(type),
     _numa_id((uint8_t)-1),
     _seqnum(0),
     _virtual(vmem),
     _top(start()),
     _livemap(object_max_count()),
+    _last_used(0),
     _physical(pmem) {
-  assert(!_physical.is_null(), "Should not be null");
-  assert(!_virtual.is_null(), "Should not be null");
-  assert((type == ZPageTypeSmall && size() == ZPageSizeSmall) ||
-         (type == ZPageTypeMedium && size() == ZPageSizeMedium) ||
-         (type == ZPageTypeLarge && is_aligned(size(), ZGranuleSize)),
-         "Page type/size mismatch");
+  assert_initialized();
 }
 
-ZPage::~ZPage() {
-  assert(_physical.is_null(), "Should be null");
+void ZPage::assert_initialized() const {
+  assert(!_virtual.is_null(), "Should not be null");
+  assert(!_physical.is_null(), "Should not be null");
+  assert((_type == ZPageTypeSmall && size() == ZPageSizeSmall) ||
+         (_type == ZPageTypeMedium && size() == ZPageSizeMedium) ||
+         (_type == ZPageTypeLarge && is_aligned(size(), ZGranuleSize)),
+         "Page type/size mismatch");
 }
 
 void ZPage::reset() {
   _seqnum = ZGlobalSeqNum;
   _top = start();
   _livemap.reset();
+  _last_used = 0;
+}
+
+ZPage* ZPage::retype(uint8_t type) {
+  assert(_type != type, "Invalid retype");
+  _type = type;
+  _livemap.resize(object_max_count());
+  return this;
+}
+
+ZPage* ZPage::split(size_t size) {
+  return split(type_from_size(size), size);
+}
+
+ZPage* ZPage::split(uint8_t type, size_t size) {
+  assert(_virtual.size() > size, "Invalid split");
+
+  // Resize this page, keep _numa_id, _seqnum, and _last_used
+  const ZVirtualMemory vmem = _virtual.split(size);
+  const ZPhysicalMemory pmem = _physical.split(size);
+  _type = type_from_size(_virtual.size());
+  _top = start();
+  _livemap.resize(object_max_count());
+
+  // Create new page, inherit _seqnum and _last_used
+  ZPage* const page = new ZPage(type, vmem, pmem);
+  page->_seqnum = _seqnum;
+  page->_last_used = _last_used;
+  return page;
 }
 
 void ZPage::print_on(outputStream* out) const {