unsafe.cpp revision 1999
1472N/A * or visit www.oracle.com if you need additional information or have any
1879N/A#include "precompiled.hpp"
1879N/A#include "classfile/vmSymbols.hpp"
1879N/A#include "memory/allocation.inline.hpp"
1879N/A#include "runtime/globals.hpp"
1879N/A#include "runtime/interfaceSupport.hpp"
1879N/A#include "runtime/reflection.hpp"
1879N/A#include "runtime/reflectionCompat.hpp"
1879N/A#include "runtime/synchronizer.hpp"
1879N/A#include "services/threadService.hpp"
1879N/A#include "utilities/dtrace.hpp"
0N/A#define MAX_OBJECT_SIZE \
0N/A return field_offset;
0N/A return byte_offset;
0N/A return field_offset;
0N/A return byte_offset;
1999N/A volatile type_name v = OrderAccess::load_acquire((volatile type_name*)index_oop_from_field_offset_long(p, offset));
1999N/A OrderAccess::release_store_fence((volatile type_name*)index_oop_from_field_offset_long(p, offset), x);
113N/A if (UseCompressedOops) { \
113N/A if (UseCompressedOops) { \
0N/AUNSAFE_ENTRY(jobject, Unsafe_GetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset))
0N/AUNSAFE_ENTRY(void, Unsafe_SetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jobject x_h))
113N/A if (UseCompressedOops) {
0N/AUNSAFE_ENTRY(void, Unsafe_SetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
113N/A if (UseCompressedOops) {
0N/AUNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
0N/AUNSAFE_ENTRY(void, Unsafe_SetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
113N/A if (UseCompressedOops) {
0N/AUNSAFE_ENTRY(jlong, Unsafe_GetLongVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
0N/AUNSAFE_ENTRY(void, Unsafe_SetLongVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
0N/AUNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean##140(JNIEnv *env, jobject unsafe, jobject obj, jint offset)) \
0N/AUNSAFE_ENTRY(void, Unsafe_Set##Boolean##140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jboolean x)) \
0N/AUNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) \
0N/AUNSAFE_ENTRY(void, Unsafe_Set##Boolean(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jboolean x)) \
0N/AUNSAFE_ENTRY(jboolean, Unsafe_Get##Boolean##Volatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) \
0N/AUNSAFE_ENTRY(void, Unsafe_Set##Boolean##Volatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jboolean x)) \
1999N/AUNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x))
0N/AUNSAFE_ENTRY(void, Unsafe_SetOrderedObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
113N/A if (UseCompressedOops) {
0N/AUNSAFE_ENTRY(void, Unsafe_SetOrderedLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong x))
0N/A t->set_doing_unsafe_access(true); \
0N/A t->set_doing_unsafe_access(false); \
0N/AUNSAFE_ENTRY(void, Unsafe_SetNative##Type(JNIEnv *env, jobject unsafe, jlong addr, java_type x)) \
0N/A t->set_doing_unsafe_access(true); \
0N/A *(volatile native_type*)p = x; \
0N/A t->set_doing_unsafe_access(false); \
0N/A t->set_doing_unsafe_access(true);
0N/A t->set_doing_unsafe_access(false);
0N/A t->set_doing_unsafe_access(true);
0N/A t->set_doing_unsafe_access(false);
0N/A return addr_to_java(*(void**)p);
0N/A *(void**)p = addr_from_java(x);
0N/A return addr_to_java(x);
0N/AUNSAFE_ENTRY(jlong, Unsafe_ReallocateMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size))
0N/A return addr_to_java(x);
0N/AUNSAFE_ENTRY(void, Unsafe_SetMemory(JNIEnv *env, jobject unsafe, jlong addr, jlong size, jbyte value))
0N/AUNSAFE_ENTRY(void, Unsafe_SetMemory2(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong size, jbyte value))
0N/AUNSAFE_ENTRY(void, Unsafe_CopyMemory(JNIEnv *env, jobject unsafe, jlong srcAddr, jlong dstAddr, jlong size))
0N/AUNSAFE_ENTRY(void, Unsafe_CopyMemory2(JNIEnv *env, jobject unsafe, jobject srcObj, jlong srcOffset, jobject dstObj, jlong dstOffset, jlong size))
0N/A if (must_be_static >= 0) {
0N/AUNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromField(JNIEnv *env, jobject unsafe, jobject field))
0N/AUNSAFE_ENTRY(jobject, Unsafe_StaticFieldBaseFromClass(JNIEnv *env, jobject unsafe, jobject clazz))
0N/A return JNIHandles::make_local(env, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
0N/A assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
0N/Astatic jclass Unsafe_DefineClass(JNIEnv *env, jstring name, jbyteArray data, int offset, int length, jobject loader, jobject pd) {
0N/A // Code lifted from JDK 1.3 ClassLoader.c
0N/A if (UsePerfData) {
0N/AUNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length))
0N/AUNSAFE_ENTRY(jclass, Unsafe_DefineClass1(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length, jobject loader, jobject pd))
431N/A// - host_class: supplies context for linkage, access control, protection domain, and class loader
431N/A// When you load an anonymous class U, it works as if you changed its name just before loading,
431N/A// to a name that you will never use again. Since the name is lost, no other class can directly
431N/A// Access checks for linkage sites within U continue to follow the same rules as for named classes.
431N/A// The package of an anonymous class is given by the package qualifier on the name under which it was loaded.
431N/A// By using the CP patching array, you can have a new anonymous class U2 refer to an older one U1.
431N/A// The bytecodes for U2 should refer to U1 by a symbolic name (doesn't matter what the name is).
431N/A if (UsePerfData) {
431N/A if (!p->is_objArray())
431N/A KlassHandle host_klass(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(host_class)));
431N/AUNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh))
0N/AUNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h))
845N/A if (UseCompressedOops) {
0N/AUNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
0N/AUNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x))
0N/AUNSAFE_ENTRY(jint, Unsafe_Loadavg(JNIEnv *env, jobject unsafe, jdoubleArray loadavg, jint nelem))
0N/AUNSAFE_ENTRY(void, Unsafe_PrefetchWrite(JNIEnv* env, jclass ignored, jobject obj, jlong offset))
0N/A// contain the necessarily updated Unsafe.java.
0N/A env->RegisterNatives(unsafecls, loadavg_method, sizeof(loadavg_method)/sizeof(JNINativeMethod));
0N/A env->RegisterNatives(unsafecls, prefetch_methods, sizeof(prefetch_methods)/sizeof(JNINativeMethod));
0N/A env->RegisterNatives(unsafecls, memcopy_methods, sizeof(memcopy_methods)/sizeof(JNINativeMethod));
0N/A env->RegisterNatives(unsafecls, memcopy_methods_15, sizeof(memcopy_methods_15)/sizeof(JNINativeMethod));
431N/A if (AnonymousClasses) {
431N/A env->RegisterNatives(unsafecls, anonk_methods, sizeof(anonk_methods)/sizeof(JNINativeMethod));
0N/A int status = env->RegisterNatives(unsafecls, methods, sizeof(methods)/sizeof(JNINativeMethod));
0N/A status = env->RegisterNatives(unsafecls, methods_15, sizeof(methods_15)/sizeof(JNINativeMethod));
0N/A status = env->RegisterNatives(unsafecls, methods_141, sizeof(methods_141)/sizeof(JNINativeMethod));
0N/A status = env->RegisterNatives(unsafecls, methods_140, sizeof(methods_140)/sizeof(JNINativeMethod));