Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/jfr/leakprofiler/chains/objectSampleMarker.hpp
41153 views
1
/*
2
* Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_JFR_LEAKPROFILER_CHAINS_OBJECTSAMPLEMARKER_HPP
26
#define SHARE_JFR_LEAKPROFILER_CHAINS_OBJECTSAMPLEMARKER_HPP
27
28
#include "memory/allocation.hpp"
29
#include "oops/markWord.hpp"
30
#include "utilities/growableArray.hpp"
31
//
32
// This class will save the original mark oop of a object sample object.
33
// It will then install an "identifier" mark oop to be used for
34
// identification purposes in the search for reference chains.
35
// The destructor will restore each modified oop with its original mark oop.
36
//
37
class ObjectSampleMarker : public StackObj {
38
private:
39
class ObjectSampleMarkWord : public ResourceObj {
40
friend class ObjectSampleMarker;
41
private:
42
oop _obj;
43
markWord _mark_word;
44
ObjectSampleMarkWord(const oop obj,
45
const markWord mark_word) : _obj(obj),
46
_mark_word(mark_word) {}
47
public:
48
ObjectSampleMarkWord() : _obj(NULL), _mark_word(markWord::zero()) {}
49
};
50
51
GrowableArray<ObjectSampleMarkWord>* _store;
52
53
public:
54
ObjectSampleMarker() :
55
_store(new GrowableArray<ObjectSampleMarkWord>(16)) {}
56
~ObjectSampleMarker() {
57
assert(_store != NULL, "invariant");
58
// restore the saved, original, markWord for sample objects
59
while (_store->is_nonempty()) {
60
ObjectSampleMarkWord sample_oop = _store->pop();
61
sample_oop._obj->set_mark(sample_oop._mark_word);
62
assert(sample_oop._obj->mark() == sample_oop._mark_word, "invariant");
63
}
64
}
65
66
void mark(oop obj) {
67
assert(obj != NULL, "invariant");
68
// save the original markWord
69
_store->push(ObjectSampleMarkWord(obj, obj->mark()));
70
// now we will set the mark word to "marked" in order to quickly
71
// identify sample objects during the reachability search from gc roots.
72
assert(!obj->mark().is_marked(), "should only mark an object once");
73
obj->set_mark(markWord::prototype().set_marked());
74
assert(obj->mark().is_marked(), "invariant");
75
}
76
};
77
78
#endif // SHARE_JFR_LEAKPROFILER_CHAINS_OBJECTSAMPLEMARKER_HPP
79
80