Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/prims/jniFastGetField.hpp
32285 views
1
/*
2
* Copyright (c) 2004, 2010, 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_VM_PRIMS_JNIFASTGETFIELD_HPP
26
#define SHARE_VM_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
public:
69
#if defined(_WINDOWS) && !defined(_WIN64)
70
static GetBooleanField_t jni_fast_GetBooleanField_fp;
71
static GetByteField_t jni_fast_GetByteField_fp;
72
static GetCharField_t jni_fast_GetCharField_fp;
73
static GetShortField_t jni_fast_GetShortField_fp;
74
static GetIntField_t jni_fast_GetIntField_fp;
75
static GetLongField_t jni_fast_GetLongField_fp;
76
static GetFloatField_t jni_fast_GetFloatField_fp;
77
static GetDoubleField_t jni_fast_GetDoubleField_fp;
78
#endif
79
80
static address generate_fast_get_boolean_field();
81
static address generate_fast_get_byte_field();
82
static address generate_fast_get_char_field();
83
static address generate_fast_get_short_field();
84
static address generate_fast_get_int_field();
85
static address generate_fast_get_long_field();
86
static address generate_fast_get_float_field();
87
static address generate_fast_get_double_field();
88
89
// If pc is in speculative_load_pclist, return the corresponding
90
// slow case entry pc. Otherwise, return -1.
91
// This is used by signal/exception handler to handle such case:
92
// After an even safepoint counter is loaded and a fast field access
93
// is about to begin, a GC kicks in and shrinks the heap. Then the
94
// field access may fault. The signal/exception handler needs to
95
// return to the slow case.
96
//
97
// The GC may decide to temporarily stuff some bad values into handles,
98
// for example, for debugging purpose, in which case we need the mapping also.
99
static address find_slowcase_pc(address pc);
100
};
101
102
#endif // SHARE_VM_PRIMS_JNIFASTGETFIELD_HPP
103
104