Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/prims/jniFastGetField.hpp
41144 views
1
/*
2
* Copyright (c) 2004, 2019, 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_PRIMS_JNIFASTGETFIELD_HPP
26
#define SHARE_PRIMS_JNIFASTGETFIELD_HPP
27
28
#include "memory/allocation.hpp"
29
#include "prims/jvm_misc.hpp"
30
31
// Basic logic of a fast version of jni_Get<Primitive>Field:
32
//
33
// (See safepoint.hpp for a description of _safepoint_counter)
34
//
35
// load _safepoint_counter into old_counter
36
// IF old_counter is odd THEN
37
// a safepoint is going on, return jni_GetXXXField
38
// ELSE
39
// load the primitive field value into result (speculatively)
40
// load _safepoint_counter into new_counter
41
// IF (old_counter == new_counter) THEN
42
// no safepoint happened during the field access, return result
43
// ELSE
44
// a safepoint might have happened in-between, return jni_GetXXXField()
45
// ENDIF
46
// ENDIF
47
//
48
// LoadLoad membars to maintain the load order may be necessary
49
// for some platforms.
50
//
51
// The fast versions don't check for pending suspension request.
52
// This is fine since it's totally read-only and doesn't create new race.
53
//
54
// There is a hypothetical safepoint counter wraparound. But it's not
55
// a practical concern.
56
57
class JNI_FastGetField : AllStatic {
58
private:
59
enum { LIST_CAPACITY = 40 }; // a conservative number for the number of
60
// speculative loads on all the platforms
61
static address speculative_load_pclist [];
62
static address slowcase_entry_pclist [];
63
static int count;
64
65
static address generate_fast_get_int_field0(BasicType type);
66
static address generate_fast_get_float_field0(BasicType type);
67
68
#ifdef AARCH64
69
template<int BType>
70
static address generate_fast_get_int_field1();
71
#endif // AARCH64
72
73
public:
74
#if defined(_WINDOWS) && !defined(_WIN64)
75
static GetBooleanField_t jni_fast_GetBooleanField_fp;
76
static GetByteField_t jni_fast_GetByteField_fp;
77
static GetCharField_t jni_fast_GetCharField_fp;
78
static GetShortField_t jni_fast_GetShortField_fp;
79
static GetIntField_t jni_fast_GetIntField_fp;
80
static GetLongField_t jni_fast_GetLongField_fp;
81
static GetFloatField_t jni_fast_GetFloatField_fp;
82
static GetDoubleField_t jni_fast_GetDoubleField_fp;
83
#endif
84
85
static address generate_fast_get_boolean_field();
86
static address generate_fast_get_byte_field();
87
static address generate_fast_get_char_field();
88
static address generate_fast_get_short_field();
89
static address generate_fast_get_int_field();
90
static address generate_fast_get_long_field();
91
static address generate_fast_get_float_field();
92
static address generate_fast_get_double_field();
93
94
// If pc is in speculative_load_pclist, return the corresponding
95
// slow case entry pc. Otherwise, return -1.
96
// This is used by signal/exception handler to handle such case:
97
// After an even safepoint counter is loaded and a fast field access
98
// is about to begin, a GC kicks in and shrinks the heap. Then the
99
// field access may fault. The signal/exception handler needs to
100
// return to the slow case.
101
//
102
// The GC may decide to temporarily stuff some bad values into handles,
103
// for example, for debugging purpose, in which case we need the mapping also.
104
static address find_slowcase_pc(address pc);
105
};
106
107
#endif // SHARE_PRIMS_JNIFASTGETFIELD_HPP
108
109