diff -r 8b16701b4636 -r f5662bdbee4a src/hotspot/share/gc/z/zValue.hpp --- a/src/hotspot/share/gc/z/zValue.hpp Mon Oct 21 09:55:58 2019 +0200 +++ b/src/hotspot/share/gc/z/zValue.hpp Mon Oct 21 09:56:43 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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 @@ -25,13 +25,11 @@ #define SHARE_GC_Z_ZVALUE_HPP #include "memory/allocation.hpp" -#include "gc/z/zCPU.hpp" -#include "gc/z/zGlobals.hpp" -#include "gc/z/zNUMA.hpp" -#include "gc/z/zThread.hpp" -#include "gc/z/zUtils.hpp" -#include "runtime/globals.hpp" -#include "utilities/align.hpp" +#include "utilities/globalDefinitions.hpp" + +// +// Storage +// template class ZValueStorage : public AllStatic { @@ -42,202 +40,93 @@ public: static const size_t offset = 4 * K; - static uintptr_t alloc(size_t size) { - guarantee(size <= offset, "Allocation too large"); - - // Allocate entry in existing memory block - const uintptr_t addr = align_up(_top, S::alignment()); - _top = addr + size; - - if (_top < _end) { - // Success - return addr; - } - - // Allocate new block of memory - const size_t block_alignment = offset; - const size_t block_size = offset * S::count(); - _top = ZUtils::alloc_aligned(block_alignment, block_size); - _end = _top + offset; - - // Retry allocation - return alloc(size); - } + static uintptr_t alloc(size_t size); }; -template uintptr_t ZValueStorage::_end = 0; -template uintptr_t ZValueStorage::_top = 0; - class ZContendedStorage : public ZValueStorage { public: - static size_t alignment() { - return ZCacheLineSize; - } - - static uint32_t count() { - return 1; - } - - static uint32_t id() { - return 0; - } + static size_t alignment(); + static uint32_t count(); + static uint32_t id(); }; class ZPerCPUStorage : public ZValueStorage { public: - static size_t alignment() { - return sizeof(uintptr_t); - } - - static uint32_t count() { - return ZCPU::count(); - } - - static uint32_t id() { - return ZCPU::id(); - } + static size_t alignment(); + static uint32_t count(); + static uint32_t id(); }; class ZPerNUMAStorage : public ZValueStorage { public: - static size_t alignment() { - return sizeof(uintptr_t); - } - - static uint32_t count() { - return ZNUMA::count(); - } - - static uint32_t id() { - return ZNUMA::id(); - } + static size_t alignment(); + static uint32_t count(); + static uint32_t id(); }; class ZPerWorkerStorage : public ZValueStorage { public: - static size_t alignment() { - return sizeof(uintptr_t); - } - - static uint32_t count() { - return MAX2(ParallelGCThreads, ConcGCThreads); - } - - static uint32_t id() { - return ZThread::worker_id(); - } + static size_t alignment(); + static uint32_t count(); + static uint32_t id(); }; -template -class ZValueIterator; +// +// Value +// template class ZValue : public CHeapObj { private: const uintptr_t _addr; - uintptr_t value_addr(uint32_t value_id) const { - return _addr + (value_id * S::offset); - } + uintptr_t value_addr(uint32_t value_id) const; public: - ZValue() : - _addr(S::alloc(sizeof(T))) { - // Initialize all instances - ZValueIterator iter(this); - for (T* addr; iter.next(&addr);) { - ::new (addr) T; - } - } + ZValue(); + ZValue(const T& value); - ZValue(const T& value) : - _addr(S::alloc(sizeof(T))) { - // Initialize all instances - ZValueIterator iter(this); - for (T* addr; iter.next(&addr);) { - ::new (addr) T(value); - } - } - - // Not implemented - ZValue(const ZValue& value); - ZValue& operator=(const ZValue& value); + const T* addr(uint32_t value_id = S::id()) const; + T* addr(uint32_t value_id = S::id()); - const T* addr(uint32_t value_id = S::id()) const { - return reinterpret_cast(value_addr(value_id)); - } - - T* addr(uint32_t value_id = S::id()) { - return reinterpret_cast(value_addr(value_id)); - } - - const T& get(uint32_t value_id = S::id()) const { - return *addr(value_id); - } + const T& get(uint32_t value_id = S::id()) const; + T& get(uint32_t value_id = S::id()); - T& get(uint32_t value_id = S::id()) { - return *addr(value_id); - } - - void set(const T& value, uint32_t value_id = S::id()) { - get(value_id) = value; - } - - void set_all(const T& value) { - ZValueIterator iter(this); - for (T* addr; iter.next(&addr);) { - *addr = value; - } - } + void set(const T& value, uint32_t value_id = S::id()); + void set_all(const T& value); }; template class ZContended : public ZValue { public: - ZContended() : - ZValue() {} - - ZContended(const T& value) : - ZValue(value) {} - - using ZValue::operator=; + ZContended(); + ZContended(const T& value); }; template class ZPerCPU : public ZValue { public: - ZPerCPU() : - ZValue() {} - - ZPerCPU(const T& value) : - ZValue(value) {} - - using ZValue::operator=; + ZPerCPU(); + ZPerCPU(const T& value); }; template class ZPerNUMA : public ZValue { public: - ZPerNUMA() : - ZValue() {} - - ZPerNUMA(const T& value) : - ZValue(value) {} - - using ZValue::operator=; + ZPerNUMA(); + ZPerNUMA(const T& value); }; template class ZPerWorker : public ZValue { public: - ZPerWorker() : - ZValue() {} + ZPerWorker(); + ZPerWorker(const T& value); +}; - ZPerWorker(const T& value) : - ZValue(value) {} - - using ZValue::operator=; -}; +// +// Iterator +// template class ZValueIterator { @@ -246,38 +135,27 @@ uint32_t _value_id; public: - ZValueIterator(ZValue* value) : - _value(value), - _value_id(0) {} + ZValueIterator(ZValue* value); - bool next(T** value) { - if (_value_id < S::count()) { - *value = _value->addr(_value_id++); - return true; - } - return false; - } + bool next(T** value); }; template class ZPerCPUIterator : public ZValueIterator { public: - ZPerCPUIterator(ZPerCPU* value) : - ZValueIterator(value) {} + ZPerCPUIterator(ZPerCPU* value); }; template class ZPerNUMAIterator : public ZValueIterator { public: - ZPerNUMAIterator(ZPerNUMA* value) : - ZValueIterator(value) {} + ZPerNUMAIterator(ZPerNUMA* value); }; template class ZPerWorkerIterator : public ZValueIterator { public: - ZPerWorkerIterator(ZPerWorker* value) : - ZValueIterator(value) {} + ZPerWorkerIterator(ZPerWorker* value); }; template @@ -287,38 +165,27 @@ uint32_t _value_id; public: - ZValueConstIterator(const ZValue* value) : - _value(value), - _value_id(0) {} + ZValueConstIterator(const ZValue* value); - bool next(const T** value) { - if (_value_id < S::count()) { - *value = _value->addr(_value_id++); - return true; - } - return false; - } + bool next(const T** value); }; template class ZPerCPUConstIterator : public ZValueConstIterator { public: - ZPerCPUConstIterator(const ZPerCPU* value) : - ZValueConstIterator(value) {} + ZPerCPUConstIterator(const ZPerCPU* value); }; template class ZPerNUMAConstIterator : public ZValueConstIterator { public: - ZPerNUMAConstIterator(const ZPerNUMA* value) : - ZValueConstIterator(value) {} + ZPerNUMAConstIterator(const ZPerNUMA* value); }; template class ZPerWorkerConstIterator : public ZValueConstIterator { public: - ZPerWorkerConstIterator(const ZPerWorker* value) : - ZValueConstIterator(value) {} + ZPerWorkerConstIterator(const ZPerWorker* value); }; #endif // SHARE_GC_Z_ZVALUE_HPP