# HG changeset patch # User stefank # Date 1572258251 -3600 # Node ID 4adca7312d8f2e5fc279146c1eb7ee832bce6722 # Parent 38f4701d6587cfab5b2d84cb2c2eb44775d93a27 8232649: ZGC: Add callbacks to ZMemoryManager Reviewed-by: pliden, eosterlund diff -r 38f4701d6587 -r 4adca7312d8f src/hotspot/share/gc/z/zMemory.cpp --- 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 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); } } diff -r 38f4701d6587 -r 4adca7312d8f src/hotspot/share/gc/z/zMemory.hpp --- 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 _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); };