Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_glue_java/ObjectIterator.hpp
5985 views
1
/*******************************************************************************
2
* Copyright (c) 2014, 2019 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
#if !defined(OBJECTITERATOR_HPP_)
24
#define OBJECTITERATOR_HPP_
25
26
#include "j9.h"
27
#include "j9cfg.h"
28
#include "ModronAssertions.h"
29
#include "modronbase.h"
30
#include "objectdescription.h"
31
32
#include "Base.hpp"
33
#include "GCExtensions.hpp"
34
#include "MixedObjectIterator.hpp"
35
#include "ObjectModel.hpp"
36
#include "PointerContiguousArrayIterator.hpp"
37
#include "SlotObject.hpp"
38
39
class GC_ObjectIterator {
40
/* Data Members */
41
private:
42
OMR_VM* _omrVM;
43
44
GC_ObjectModel::ScanType _type;
45
46
GC_SlotObject _slotObject;
47
48
GC_MixedObjectIterator _mixedObjectIterator;
49
GC_PointerContiguousArrayIterator _pointerContiguousArrayIterator;
50
51
protected:
52
public:
53
/* Member Functions */
54
private:
55
protected:
56
public:
57
/**
58
* Initialize the internal walk description for the given object.
59
* @param objectPtr[in] object to be scanned
60
*/
61
MMINLINE void initialize(omrobjectptr_t objectPtr)
62
{
63
/* check scan type and initialize the proper iterator */
64
_type = MM_GCExtensions::getExtensions(_omrVM)->objectModel.getScanType(objectPtr);
65
switch (_type) {
66
case GC_ObjectModel::SCAN_INVALID_OBJECT:
67
return;
68
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
69
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
70
case GC_ObjectModel::SCAN_MIXED_OBJECT:
71
case GC_ObjectModel::SCAN_CLASS_OBJECT:
72
case GC_ObjectModel::SCAN_CLASSLOADER_OBJECT:
73
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
74
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
75
return _mixedObjectIterator.initialize(_omrVM, objectPtr);
76
case GC_ObjectModel::SCAN_POINTER_ARRAY_OBJECT:
77
return _pointerContiguousArrayIterator.initialize(objectPtr);
78
case GC_ObjectModel::SCAN_PRIMITIVE_ARRAY_OBJECT:
79
return;
80
default:
81
Assert_MM_unreachable();
82
}
83
}
84
85
/**
86
* Return back SlotObject for next reference
87
* @return SlotObject
88
*/
89
MMINLINE GC_SlotObject* nextSlot()
90
{
91
/* check scan type and call nextSlot on the proper iterator */
92
switch (_type) {
93
case GC_ObjectModel::SCAN_INVALID_OBJECT:
94
return NULL;
95
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
96
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
97
case GC_ObjectModel::SCAN_MIXED_OBJECT:
98
case GC_ObjectModel::SCAN_CLASS_OBJECT:
99
case GC_ObjectModel::SCAN_CLASSLOADER_OBJECT:
100
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
101
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
102
return _mixedObjectIterator.nextSlot();
103
case GC_ObjectModel::SCAN_POINTER_ARRAY_OBJECT:
104
return _pointerContiguousArrayIterator.nextSlot();
105
case GC_ObjectModel::SCAN_PRIMITIVE_ARRAY_OBJECT:
106
return NULL;
107
default:
108
Assert_MM_unreachable();
109
}
110
return NULL;
111
}
112
113
/**
114
* Restores the iterator state into this class
115
* @param[in] objectIteratorState partially scanned object iterator state
116
*/
117
MMINLINE void restore(GC_ObjectIteratorState* objectIteratorState)
118
{
119
/* check scan type and call restore on the proper iterator */
120
switch (_type) {
121
case GC_ObjectModel::SCAN_INVALID_OBJECT:
122
return;
123
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
124
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
125
case GC_ObjectModel::SCAN_MIXED_OBJECT:
126
case GC_ObjectModel::SCAN_CLASS_OBJECT:
127
case GC_ObjectModel::SCAN_CLASSLOADER_OBJECT:
128
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
129
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
130
return _mixedObjectIterator.restore(objectIteratorState);
131
case GC_ObjectModel::SCAN_POINTER_ARRAY_OBJECT:
132
return _pointerContiguousArrayIterator.restore(objectIteratorState);
133
case GC_ObjectModel::SCAN_PRIMITIVE_ARRAY_OBJECT:
134
return;
135
default:
136
Assert_MM_unreachable();
137
}
138
}
139
140
/**
141
* Saves the partially scanned state of this class
142
* @param[in] objectIteratorState where to store the state
143
*/
144
MMINLINE void save(GC_ObjectIteratorState* objectIteratorState)
145
{
146
/* check scan type and call nextSlot on the proper iterator */
147
switch (_type) {
148
case GC_ObjectModel::SCAN_INVALID_OBJECT:
149
return;
150
case GC_ObjectModel::SCAN_MIXED_OBJECT_LINKED:
151
case GC_ObjectModel::SCAN_ATOMIC_MARKABLE_REFERENCE_OBJECT:
152
case GC_ObjectModel::SCAN_MIXED_OBJECT:
153
case GC_ObjectModel::SCAN_CLASS_OBJECT:
154
case GC_ObjectModel::SCAN_CLASSLOADER_OBJECT:
155
case GC_ObjectModel::SCAN_OWNABLESYNCHRONIZER_OBJECT:
156
case GC_ObjectModel::SCAN_REFERENCE_MIXED_OBJECT:
157
return _mixedObjectIterator.save(objectIteratorState);
158
case GC_ObjectModel::SCAN_POINTER_ARRAY_OBJECT:
159
return _pointerContiguousArrayIterator.save(objectIteratorState);
160
case GC_ObjectModel::SCAN_PRIMITIVE_ARRAY_OBJECT:
161
return;
162
default:
163
Assert_MM_unreachable();
164
}
165
}
166
167
/**
168
* @param omrVM[in] pointer to the OMR VM
169
*/
170
GC_ObjectIterator(OMR_VM* omrVM)
171
: _omrVM(omrVM)
172
, _type(GC_ObjectModel::SCAN_INVALID_OBJECT)
173
, _slotObject(GC_SlotObject(omrVM, NULL))
174
, _mixedObjectIterator(omrVM)
175
, _pointerContiguousArrayIterator(omrVM)
176
{
177
}
178
179
/**
180
* @param omrVM[in] pointer to the OMR VM
181
* @param objectPtr[in] the object to be processed
182
*/
183
GC_ObjectIterator(OMR_VM* omrVM, omrobjectptr_t objectPtr)
184
: _omrVM(omrVM)
185
, _type(GC_ObjectModel::SCAN_INVALID_OBJECT)
186
, _slotObject(GC_SlotObject(omrVM, NULL))
187
, _mixedObjectIterator(omrVM)
188
, _pointerContiguousArrayIterator(omrVM)
189
{
190
initialize(objectPtr);
191
}
192
};
193
194
#endif /* OBJECTITERATOR_HPP_ */
195
196