--- /dev/null 2020-09-04 12:37:41.765504620 +0200 +++ new/src/hotspot/share/memory/metaspace/msChunkHeaderPool.cpp 2020-09-04 13:57:43.185302947 +0200 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020 SAP SE. 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "memory/metaspace/msChunkHeaderPool.hpp" +#include "runtime/os.hpp" +#include "utilities/debug.hpp" +#include "utilities/globalDefinitions.hpp" + +namespace metaspace { + +// Returns reference to the one global chunk header pool. +ChunkHeaderPool* ChunkHeaderPool::_chunkHeaderPool = NULL; + +ChunkHeaderPool::ChunkHeaderPool() + : _num_slabs(), _first_slab(NULL), _current_slab(NULL) +{ +} + +// Note: the global chunk header pool gets never deleted; so this destructor only +// exists for the sake of tests. +ChunkHeaderPool::~ChunkHeaderPool() { + Slab* s = _first_slab; + while (s != NULL) { + Slab* next_slab = s->_next; + os::free(s); + s = next_slab; + } +} + +void ChunkHeaderPool::allocate_new_slab() { + Slab* slab = new Slab(); + if (_current_slab != NULL) { + _current_slab->_next = slab; + } + _current_slab = slab; + if (_first_slab == NULL) { + _first_slab = slab; + } + _num_slabs.increment(); +} + +// Returns size of memory used. +size_t ChunkHeaderPool::memory_footprint_words() const { + return (_num_slabs.get() * sizeof(Slab)) / BytesPerWord; +} + +void ChunkHeaderPool::initialize() { + assert(_chunkHeaderPool == NULL, "only once"); + _chunkHeaderPool = new ChunkHeaderPool(); +} + +#ifdef ASSERT +void ChunkHeaderPool::verify() const { + const Slab* s = _first_slab; + int num = 0; + while (s != NULL) { + assert(s->_top >= 0 && s->_top <= SlabCapacity, + "invalid slab at " PTR_FORMAT ", top: %d, slab cap: %d", + p2i(s), s->_top, SlabCapacity ); + s = s->_next; + num++; + } + _num_slabs.check(num); +} +#endif + +} // namespace metaspace +