Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/env/J9SegmentCache.cpp
6000 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2017 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* 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-exception
21
*******************************************************************************/
22
23
#include "env/J9SegmentCache.hpp"
24
#include "j9.h"
25
#include "infra/Assert.hpp"
26
27
J9::J9SegmentCache::J9SegmentCache(size_t cachedSegmentSize, J9SegmentProvider &backingProvider) :
28
_cachedSegmentSize(cachedSegmentSize),
29
_backingProvider(backingProvider),
30
_firstSegment(&_backingProvider.request(_cachedSegmentSize)),
31
_firstSegmentInUse(false)
32
{
33
}
34
35
J9::J9SegmentCache::J9SegmentCache(J9SegmentCache &donor) :
36
_cachedSegmentSize(donor._cachedSegmentSize),
37
_backingProvider(donor._backingProvider),
38
_firstSegment(donor._firstSegment),
39
_firstSegmentInUse(false)
40
{
41
TR_ASSERT(donor._firstSegmentInUse == false, "Unsafe hand off between SegmentCaches");
42
donor._firstSegment = 0;
43
}
44
45
J9::J9SegmentCache::~J9SegmentCache() throw()
46
{
47
if (_firstSegment)
48
_backingProvider.release(*_firstSegment);
49
}
50
51
J9MemorySegment &
52
J9::J9SegmentCache::request(size_t requiredSize)
53
{
54
TR_ASSERT(_firstSegment, "Segment was stolen");
55
if (
56
_firstSegmentInUse
57
|| requiredSize > _cachedSegmentSize
58
)
59
{
60
return _backingProvider.request(requiredSize);
61
}
62
_firstSegmentInUse = true;
63
return *_firstSegment;
64
}
65
66
void
67
J9::J9SegmentCache::release(J9MemorySegment &unusedSegment) throw()
68
{
69
if ( &unusedSegment == _firstSegment )
70
{
71
_firstSegmentInUse = false;
72
unusedSegment.heapAlloc = unusedSegment.heapBase;
73
}
74
else
75
{
76
_backingProvider.release(unusedSegment);
77
}
78
}
79
80