8232649: ZGC: Add callbacks to ZMemoryManager
authorstefank
Mon, 28 Oct 2019 11:24:11 +0100
changeset 58812 4adca7312d8f
parent 58811 38f4701d6587
child 58813 67009d58dd70
8232649: ZGC: Add callbacks to ZMemoryManager Reviewed-by: pliden, eosterlund
src/hotspot/share/gc/z/zMemory.cpp
src/hotspot/share/gc/z/zMemory.hpp
--- a/src/hotspot/share/gc/z/zMemory.cpp	Mon Oct 28 11:23:48 2019 +0100
+++ b/src/hotspot/share/gc/z/zMemory.cpp	Mon Oct 28 11:24:11 2019 +0100
@@ -26,6 +26,65 @@
 #include "gc/z/zMemory.inline.hpp"
 #include "memory/allocation.inline.hpp"
 
+ZMemory* ZMemoryManager::create(uintptr_t start, size_t size) {
+  ZMemory* const area = new ZMemory(start, size);
+  if (_callbacks._create != NULL) {
+    _callbacks._create(area);
+  }
+  return area;
+}
+
+void ZMemoryManager::destroy(ZMemory* area) {
+  if (_callbacks._destroy != NULL) {
+    _callbacks._destroy(area);
+  }
+  delete area;
+}
+
+void ZMemoryManager::shrink_from_front(ZMemory* area, size_t size) {
+  if (_callbacks._shrink_from_front != NULL) {
+    _callbacks._shrink_from_front(area, size);
+  }
+  area->shrink_from_front(size);
+}
+
+void ZMemoryManager::shrink_from_back(ZMemory* area, size_t size) {
+  if (_callbacks._shrink_from_back != NULL) {
+    _callbacks._shrink_from_back(area, size);
+  }
+  area->shrink_from_back(size);
+}
+
+void ZMemoryManager::grow_from_front(ZMemory* area, size_t size) {
+  if (_callbacks._grow_from_front != NULL) {
+    _callbacks._grow_from_front(area, size);
+  }
+  area->grow_from_front(size);
+}
+
+void ZMemoryManager::grow_from_back(ZMemory* area, size_t size) {
+  if (_callbacks._grow_from_back != NULL) {
+    _callbacks._grow_from_back(area, size);
+  }
+  area->grow_from_back(size);
+}
+
+ZMemoryManager::Callbacks::Callbacks() :
+    _create(NULL),
+    _destroy(NULL),
+    _shrink_from_front(NULL),
+    _shrink_from_back(NULL),
+    _grow_from_front(NULL),
+    _grow_from_back(NULL) {}
+
+ZMemoryManager::ZMemoryManager() :
+    _freelist(),
+    _callbacks() {}
+
+void ZMemoryManager::register_callbacks(const Callbacks& callbacks) {
+  _callbacks = callbacks;
+}
+
 uintptr_t ZMemoryManager::alloc_from_front(size_t size) {
   ZListIterator<ZMemory> iter(&_freelist);
   for (ZMemory* area; iter.next(&area);) {
@@ -34,12 +93,12 @@
         // Exact match, remove area
         const uintptr_t start = area->start();
         _freelist.remove(area);
-        delete area;
+        destroy(area);
         return start;
       } else {
         // Larger than requested, shrink area
         const uintptr_t start = area->start();
-        area->shrink_from_front(size);
+        shrink_from_front(area, size);
         return start;
       }
     }
@@ -57,12 +116,12 @@
       const uintptr_t start = area->start();
       *allocated = area->size();
       _freelist.remove(area);
-      delete area;
+      destroy(area);
       return start;
     } else {
       // Larger than requested, shrink area
       const uintptr_t start = area->start();
-      area->shrink_from_front(size);
+      shrink_from_front(area, size);
       *allocated = size;
       return start;
     }
@@ -81,11 +140,11 @@
         // Exact match, remove area
         const uintptr_t start = area->start();
         _freelist.remove(area);
-        delete area;
+        destroy(area);
         return start;
       } else {
         // Larger than requested, shrink area
-        area->shrink_from_back(size);
+        shrink_from_back(area, size);
         return area->end();
       }
     }
@@ -103,11 +162,11 @@
       const uintptr_t start = area->start();
       *allocated = area->size();
       _freelist.remove(area);
-      delete area;
+      destroy(area);
       return start;
     } else {
       // Larger than requested, shrink area
-      area->shrink_from_back(size);
+      shrink_from_back(area, size);
       *allocated = size;
       return area->end();
     }
@@ -129,20 +188,20 @@
       if (prev != NULL && start == prev->end()) {
         if (end == area->start()) {
           // Merge with prev and current area
-          prev->grow_from_back(size + area->size());
+          grow_from_back(prev, size + area->size());
           _freelist.remove(area);
           delete area;
         } else {
           // Merge with prev area
-          prev->grow_from_back(size);
+          grow_from_back(prev, size);
         }
       } else if (end == area->start()) {
         // Merge with current area
-        area->grow_from_front(size);
+        grow_from_front(area, size);
       } else {
         // Insert new area before current area
         assert(end < area->start(), "Areas must not overlap");
-        ZMemory* new_area = new ZMemory(start, size);
+        ZMemory* const new_area = create(start, size);
         _freelist.insert_before(area, new_area);
       }
 
@@ -155,10 +214,10 @@
   ZMemory* const last = _freelist.last();
   if (last != NULL && start == last->end()) {
     // Merge with last area
-    last->grow_from_back(size);
+    grow_from_back(last, size);
   } else {
     // Insert new area last
-    ZMemory* new_area = new ZMemory(start, size);
+    ZMemory* const new_area = create(start, size);
     _freelist.insert_last(new_area);
   }
 }
--- a/src/hotspot/share/gc/z/zMemory.hpp	Mon Oct 28 11:23:48 2019 +0100
+++ b/src/hotspot/share/gc/z/zMemory.hpp	Mon Oct 28 11:24:11 2019 +0100
@@ -49,14 +49,42 @@
 };
 
 class ZMemoryManager {
+public:
+  typedef void (*CreateDestroyCallback)(const ZMemory* area);
+  typedef void (*ResizeCallback)(const ZMemory* area, size_t size);
+
+  struct Callbacks {
+    CreateDestroyCallback _create;
+    CreateDestroyCallback _destroy;
+    ResizeCallback        _shrink_from_front;
+    ResizeCallback        _shrink_from_back;
+    ResizeCallback        _grow_from_front;
+    ResizeCallback        _grow_from_back;
+
+    Callbacks();
+  };
+
 private:
   ZList<ZMemory> _freelist;
+  Callbacks      _callbacks;
+
+  ZMemory* create(uintptr_t start, size_t size);
+  void destroy(ZMemory* area);
+  void shrink_from_front(ZMemory* area, size_t size);
+  void shrink_from_back(ZMemory* area, size_t size);
+  void grow_from_front(ZMemory* area, size_t size);
+  void grow_from_back(ZMemory* area, size_t size);
 
 public:
+  ZMemoryManager();
+
+  void register_callbacks(const Callbacks& callbacks);
+
   uintptr_t alloc_from_front(size_t size);
   uintptr_t alloc_from_front_at_most(size_t size, size_t* allocated);
   uintptr_t alloc_from_back(size_t size);
   uintptr_t alloc_from_back_at_most(size_t size, size_t* allocated);
+
   void free(uintptr_t start, size_t size);
 };