| File: | jdk/src/hotspot/share/prims/scopedMemoryAccess.cpp | 
| Warning: | line 102, column 23 Value stored to 'cm' during its initialization is never read | 
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* | 
| 2 | * Copyright (c) 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 | #include "precompiled.hpp" | 
| 26 | #include "jni.h" | 
| 27 | #include "jvm.h" | 
| 28 | #include "classfile/vmSymbols.hpp" | 
| 29 | #include "oops/access.inline.hpp" | 
| 30 | #include "oops/oop.inline.hpp" | 
| 31 | #include "runtime/jniHandles.inline.hpp" | 
| 32 | #include "runtime/interfaceSupport.inline.hpp" | 
| 33 | #include "runtime/sharedRuntime.hpp" | 
| 34 | #include "runtime/vframe.inline.hpp" | 
| 35 | #include "runtime/deoptimization.hpp" | 
| 36 | #include "prims/stackwalk.hpp" | 
| 37 | |
| 38 | |
| 39 | class CloseScopedMemoryFindOopClosure : public OopClosure { | 
| 40 | oop _deopt; | 
| 41 | bool _found; | 
| 42 | |
| 43 | public: | 
| 44 | CloseScopedMemoryFindOopClosure(jobject deopt) : | 
| 45 | _deopt(JNIHandles::resolve(deopt)), | 
| 46 | _found(false) {} | 
| 47 | |
| 48 | template <typename T> | 
| 49 | void do_oop_work(T* p) { | 
| 50 | if (_found) { | 
| 51 | return; | 
| 52 | } | 
| 53 | if (RawAccess<>::oop_load(p) == _deopt) { | 
| 54 | _found = true; | 
| 55 | } | 
| 56 | } | 
| 57 | |
| 58 | virtual void do_oop(oop* p) { | 
| 59 | do_oop_work(p); | 
| 60 | } | 
| 61 | |
| 62 | virtual void do_oop(narrowOop* p) { | 
| 63 | do_oop_work(p); | 
| 64 | } | 
| 65 | |
| 66 | bool found() { | 
| 67 | return _found; | 
| 68 | } | 
| 69 | }; | 
| 70 | |
| 71 | class CloseScopedMemoryClosure : public HandshakeClosure { | 
| 72 | jobject _deopt; | 
| 73 | jobject _exception; | 
| 74 | |
| 75 | public: | 
| 76 | jboolean _found; | 
| 77 | |
| 78 | CloseScopedMemoryClosure(jobject deopt, jobject exception) | 
| 79 | : HandshakeClosure("CloseScopedMemory") | 
| 80 | , _deopt(deopt) | 
| 81 | , _exception(exception) | 
| 82 | , _found(false) {} | 
| 83 | |
| 84 | void do_thread(Thread* thread) { | 
| 85 | |
| 86 | JavaThread* jt = (JavaThread*)thread; | 
| 87 | |
| 88 | if (!jt->has_last_Java_frame()) { | 
| 89 | return; | 
| 90 | } | 
| 91 | |
| 92 | frame last_frame = jt->last_frame(); | 
| 93 | RegisterMap register_map(jt, true); | 
| 94 | |
| 95 | if (last_frame.is_safepoint_blob_frame()) { | 
| 96 | last_frame = last_frame.sender(®ister_map); | 
| 97 | } | 
| 98 | |
| 99 | ResourceMark rm; | 
| 100 | if (_deopt != NULL__null && last_frame.is_compiled_frame() && last_frame.can_be_deoptimized()) { | 
| 101 | CloseScopedMemoryFindOopClosure cl(_deopt); | 
| 102 | CompiledMethod* cm = last_frame.cb()->as_compiled_method(); | 
| Value stored to 'cm' during its initialization is never read | |
| 103 | |
| 104 | /* FIXME: this doesn't work if reachability fences are violated by C2 | 
| 105 | last_frame.oops_do(&cl, NULL, ®ister_map); | 
| 106 | if (cl.found()) { | 
| 107 | //Found the deopt oop in a compiled method; deoptimize. | 
| 108 | Deoptimization::deoptimize(jt, last_frame); | 
| 109 | } | 
| 110 | so... we unconditionally deoptimize, for now: */ | 
| 111 | Deoptimization::deoptimize(jt, last_frame); | 
| 112 | } | 
| 113 | |
| 114 | const int max_critical_stack_depth = 10; | 
| 115 | int depth = 0; | 
| 116 | for (vframeStream stream(jt); !stream.at_end(); stream.next()) { | 
| 117 | Method* m = stream.method(); | 
| 118 | if (m->is_scoped()) { | 
| 119 | StackValueCollection* locals = stream.asJavaVFrame()->locals(); | 
| 120 | for (int i = 0; i < locals->size(); i++) { | 
| 121 | StackValue* var = locals->at(i); | 
| 122 | if (var->type() == T_OBJECT) { | 
| 123 | if (var->get_obj() == JNIHandles::resolve(_deopt)) { | 
| 124 | assert(depth < max_critical_stack_depth, "can't have more than %d critical frames", max_critical_stack_depth)do { if (!(depth < max_critical_stack_depth)) { (*g_assert_poison ) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/share/prims/scopedMemoryAccess.cpp" , 124, "assert(" "depth < max_critical_stack_depth" ") failed" , "can't have more than %d critical frames", max_critical_stack_depth ); ::breakpoint(); } } while (0); | 
| 125 | _found = true; | 
| 126 | return; | 
| 127 | } | 
| 128 | } | 
| 129 | } | 
| 130 | break; | 
| 131 | } | 
| 132 | depth++; | 
| 133 | #ifndef ASSERT1 | 
| 134 | if (depth >= max_critical_stack_depth) { | 
| 135 | break; | 
| 136 | } | 
| 137 | #endif | 
| 138 | } | 
| 139 | } | 
| 140 | }; | 
| 141 | |
| 142 | /* | 
| 143 | * This function issues a global handshake operation with all | 
| 144 | * Java threads. This is useful for implementing asymmetric | 
| 145 | * dekker synchronization schemes, where expensive synchronization | 
| 146 | * in performance sensitive common paths, may be shifted to | 
| 147 | * a less common slow path instead. | 
| 148 | * Top frames containg obj will be deoptimized. | 
| 149 | */ | 
| 150 | JVM_ENTRY(jboolean, ScopedMemoryAccess_closeScope(JNIEnv *env, jobject receiver, jobject deopt, jobject exception))extern "C" { jboolean ScopedMemoryAccess_closeScope(JNIEnv *env , jobject receiver, jobject deopt, jobject exception) { JavaThread * thread=JavaThread::thread_from_jni_environment(env); ; ThreadInVMfromNative __tiv(thread); VMNativeEntryWrapper __vew; HandleMarkCleaner __hm(thread); JavaThread* __the_thread__ = thread; os::verify_stack_alignment (); | 
| 151 | CloseScopedMemoryClosure cl(deopt, exception); | 
| 152 | Handshake::execute(&cl); | 
| 153 | return !cl._found; | 
| 154 | JVM_END} } | 
| 155 | |
| 156 | /// JVM_RegisterUnsafeMethods | 
| 157 | |
| 158 | #define PKG "Ljdk/internal/misc/" | 
| 159 | |
| 160 | #define MEMACCESS "ScopedMemoryAccess" | 
| 161 | #define SCOPE PKG MEMACCESS "$Scope;" | 
| 162 | #define SCOPED_ERRPKG MEMACCESS "$Scope$ScopedAccessError;" PKG MEMACCESS "$Scope$ScopedAccessError;" | 
| 163 | |
| 164 | #define CC (char*) /*cast a literal from (const char*)*/ | 
| 165 | #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)((void*)((address_word)(&f))) | 
| 166 | |
| 167 | static JNINativeMethod jdk_internal_misc_ScopedMemoryAccess_methods[] = { | 
| 168 | {CC "closeScope0", CC "(" SCOPE SCOPED_ERRPKG MEMACCESS "$Scope$ScopedAccessError;" ")Z", FN_PTR(ScopedMemoryAccess_closeScope)}, | 
| 169 | }; | 
| 170 | |
| 171 | #undef CC | 
| 172 | #undef FN_PTR | 
| 173 | |
| 174 | #undef PKG | 
| 175 | #undef MEMACCESS | 
| 176 | #undef SCOPE | 
| 177 | #undef SCOPED_EXC | 
| 178 | |
| 179 | // This function is exported, used by NativeLookup. | 
| 180 | |
| 181 | JVM_ENTRY(void, JVM_RegisterJDKInternalMiscScopedMemoryAccessMethods(JNIEnv *env, jclass scopedMemoryAccessClass))extern "C" { void JVM_RegisterJDKInternalMiscScopedMemoryAccessMethods (JNIEnv *env, jclass scopedMemoryAccessClass) { JavaThread* thread =JavaThread::thread_from_jni_environment(env); ; ThreadInVMfromNative __tiv(thread); VMNativeEntryWrapper __vew; HandleMarkCleaner __hm(thread); JavaThread* __the_thread__ = thread; os::verify_stack_alignment (); | 
| 182 | ThreadToNativeFromVM ttnfv(thread); | 
| 183 | |
| 184 | int ok = env->RegisterNatives(scopedMemoryAccessClass, jdk_internal_misc_ScopedMemoryAccess_methods, sizeof(jdk_internal_misc_ScopedMemoryAccess_methods)/sizeof(JNINativeMethod)); | 
| 185 | guarantee(ok == 0, "register jdk.internal.misc.ScopedMemoryAccess natives")do { if (!(ok == 0)) { (*g_assert_poison) = 'X';; report_vm_error ("/home/daniel/Projects/java/jdk/src/hotspot/share/prims/scopedMemoryAccess.cpp" , 185, "guarantee(" "ok == 0" ") failed", "register jdk.internal.misc.ScopedMemoryAccess natives" ); ::breakpoint(); } } while (0); | 
| 186 | JVM_END} } |