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 #include "precompiled.hpp"
25 #include "runtime/jniHandles.inline.hpp"
26 #include "runtime/interfaceSupport.inline.hpp"
27 #include "code/codeCache.hpp"
28 #include "runtime/vmOperations.hpp"
29
30 JVM_ENTRY(static jboolean, UH_FreeUpcallStub0(JNIEnv *env, jobject _unused, jlong addr))
31 //acquire code cache lock
32 MutexLocker mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
33 //find code blob
34 CodeBlob* cb = CodeCache::find_blob((char*)addr);
35 if (cb == NULL) {
36 return false;
37 }
38 //free global JNI handle
39 jobject handle = NULL;
40 if (cb->is_optimized_entry_blob()) {
41 handle = ((OptimizedEntryBlob*)cb)->receiver();
42 } else {
43 jobject* handle_ptr = (jobject*)(void*)cb->content_begin();
44 handle = *handle_ptr;
45 }
46 JNIHandles::destroy_global(handle);
47 //free code blob
48 CodeCache::free(cb);
49 return true;
50 JVM_END
51
52 #define CC (char*) /*cast a literal from (const char*)*/
53 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
54 #define LANG "Ljava/lang/"
55
56 // These are the native methods on jdk.internal.foreign.NativeInvoker.
57 static JNINativeMethod UH_methods[] = {
58 {CC "freeUpcallStub0", CC "(J)Z", FN_PTR(UH_FreeUpcallStub0)}
59 };
60
61 /**
62 * This one function is exported, used by NativeLookup.
63 */
64 JVM_LEAF(void, JVM_RegisterUpcallHandlerMethods(JNIEnv *env, jclass UH_class))
65 int status = env->RegisterNatives(UH_class, UH_methods, sizeof(UH_methods)/sizeof(JNINativeMethod));
66 guarantee(status == JNI_OK && !env->ExceptionOccurred(),
67 "register jdk.internal.foreign.abi.UpcallStubs natives");
68 JVM_END
|
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 #include "precompiled.hpp"
25 #include "code/codeBlob.hpp"
26 #include "code/codeCache.hpp"
27 #include "runtime/interfaceSupport.inline.hpp"
28
29 JVM_ENTRY(static jboolean, UH_FreeUpcallStub0(JNIEnv *env, jobject _unused, jlong addr))
30 // safe to call 'find_blob' without code cache lock, because stub is always alive
31 CodeBlob* cb = CodeCache::find_blob((char*)addr);
32 if (cb == nullptr) {
33 return false;
34 }
35 OptimizedEntryBlob::free(cb->as_optimized_entry_blob());
36 return true;
37 JVM_END
38
39 #define CC (char*) /*cast a literal from (const char*)*/
40 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
41 #define LANG "Ljava/lang/"
42
43 // These are the native methods on jdk.internal.foreign.NativeInvoker.
44 static JNINativeMethod UH_methods[] = {
45 {CC "freeUpcallStub0", CC "(J)Z", FN_PTR(UH_FreeUpcallStub0)}
46 };
47
48 /**
49 * This one function is exported, used by NativeLookup.
50 */
51 JVM_LEAF(void, JVM_RegisterUpcallHandlerMethods(JNIEnv *env, jclass UH_class))
52 int status = env->RegisterNatives(UH_class, UH_methods, sizeof(UH_methods)/sizeof(JNINativeMethod));
53 guarantee(status == JNI_OK && !env->ExceptionOccurred(),
54 "register jdk.internal.foreign.abi.UpcallStubs natives");
55 JVM_END
|