Path: blob/master/runtime/compiler/env/J9SegmentCache.cpp
6000 views
/*******************************************************************************1* Copyright (c) 2000, 2017 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#include "env/J9SegmentCache.hpp"23#include "j9.h"24#include "infra/Assert.hpp"2526J9::J9SegmentCache::J9SegmentCache(size_t cachedSegmentSize, J9SegmentProvider &backingProvider) :27_cachedSegmentSize(cachedSegmentSize),28_backingProvider(backingProvider),29_firstSegment(&_backingProvider.request(_cachedSegmentSize)),30_firstSegmentInUse(false)31{32}3334J9::J9SegmentCache::J9SegmentCache(J9SegmentCache &donor) :35_cachedSegmentSize(donor._cachedSegmentSize),36_backingProvider(donor._backingProvider),37_firstSegment(donor._firstSegment),38_firstSegmentInUse(false)39{40TR_ASSERT(donor._firstSegmentInUse == false, "Unsafe hand off between SegmentCaches");41donor._firstSegment = 0;42}4344J9::J9SegmentCache::~J9SegmentCache() throw()45{46if (_firstSegment)47_backingProvider.release(*_firstSegment);48}4950J9MemorySegment &51J9::J9SegmentCache::request(size_t requiredSize)52{53TR_ASSERT(_firstSegment, "Segment was stolen");54if (55_firstSegmentInUse56|| requiredSize > _cachedSegmentSize57)58{59return _backingProvider.request(requiredSize);60}61_firstSegmentInUse = true;62return *_firstSegment;63}6465void66J9::J9SegmentCache::release(J9MemorySegment &unusedSegment) throw()67{68if ( &unusedSegment == _firstSegment )69{70_firstSegmentInUse = false;71unusedSegment.heapAlloc = unusedSegment.heapBase;72}73else74{75_backingProvider.release(unusedSegment);76}77}787980