< prev index next >

src/hotspot/share/prims/unsafe.cpp

Print this page




  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "jni.h"
  27 #include "jvm.h"
  28 #include "classfile/classFileStream.hpp"
  29 #include "classfile/classLoader.hpp"
  30 #include "classfile/vmSymbols.hpp"
  31 #include "jfr/jfrEvents.hpp"
  32 #include "memory/allocation.inline.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "logging/log.hpp"
  35 #include "logging/logStream.hpp"
  36 #include "oops/access.inline.hpp"
  37 #include "oops/fieldStreams.hpp"
  38 #include "oops/objArrayOop.inline.hpp"
  39 #include "oops/oop.inline.hpp"
  40 #include "oops/typeArrayOop.inline.hpp"
  41 #include "oops/valueArrayKlass.hpp"
  42 #include "oops/valueArrayOop.hpp"
  43 #include "oops/valueArrayOop.inline.hpp"

  44 #include "prims/unsafe.hpp"
  45 #include "runtime/atomic.hpp"
  46 #include "runtime/fieldDescriptor.inline.hpp"
  47 #include "runtime/globals.hpp"
  48 #include "runtime/handles.inline.hpp"
  49 #include "runtime/interfaceSupport.inline.hpp"
  50 #include "runtime/jniHandles.inline.hpp"
  51 #include "runtime/orderAccess.hpp"
  52 #include "runtime/reflection.hpp"
  53 #include "runtime/sharedRuntime.hpp"
  54 #include "runtime/thread.hpp"
  55 #include "runtime/threadSMR.hpp"
  56 #include "runtime/vm_version.hpp"
  57 #include "services/threadService.hpp"
  58 #include "utilities/align.hpp"
  59 #include "utilities/copy.hpp"
  60 #include "utilities/dtrace.hpp"
  61 #include "utilities/macros.hpp"
  62 
  63 /**


 351 UNSAFE_ENTRY(jboolean, Unsafe_IsFlattenedArray(JNIEnv *env, jobject unsafe, jclass c)) {
 352   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c));
 353   return k->is_valueArray_klass();
 354 } UNSAFE_END
 355 
 356 UNSAFE_ENTRY(jobject, Unsafe_UninitializedDefaultValue(JNIEnv *env, jobject unsafe, jclass vc)) {
 357   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(vc));
 358   ValueKlass* vk = ValueKlass::cast(k);
 359   oop v = vk->default_value();
 360   return JNIHandles::make_local(env, v);
 361 } UNSAFE_END
 362 
 363 UNSAFE_ENTRY(jobject, Unsafe_GetValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass vc)) {
 364   oop base = JNIHandles::resolve(obj);
 365   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(vc));
 366   ValueKlass* vk = ValueKlass::cast(k);
 367   assert_and_log_unsafe_value_access(base, offset, vk);
 368   Handle base_h(THREAD, base);
 369   oop v = vk->allocate_instance(CHECK_NULL); // allocate instance
 370   vk->initialize(CHECK_NULL); // If field is a default value, value class might not be initialized yet
 371   vk->value_store(((address)(oopDesc*)base_h()) + offset,
 372                   vk->data_for_oop(v),
 373                   true, true);
 374   return JNIHandles::make_local(env, v);
 375 } UNSAFE_END
 376 
 377 UNSAFE_ENTRY(void, Unsafe_PutValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass vc, jobject value)) {
 378   oop base = JNIHandles::resolve(obj);
 379   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(vc));
 380   ValueKlass* vk = ValueKlass::cast(k);
 381   assert(!base->is_value() || base->mark().is_larval_state(), "must be an object instance or a larval value");
 382   assert_and_log_unsafe_value_access(base, offset, vk);
 383   oop v = JNIHandles::resolve(value);
 384   vk->value_store(vk->data_for_oop(v),
 385                  ((address)(oopDesc*)base) + offset, true, true);
 386 } UNSAFE_END
 387 
 388 UNSAFE_ENTRY(jobject, Unsafe_MakePrivateBuffer(JNIEnv *env, jobject unsafe, jobject value)) {
 389   oop v = JNIHandles::resolve_non_null(value);
 390   assert(v->is_value(), "must be a value instance");
 391   Handle vh(THREAD, v);
 392   ValueKlass* vk = ValueKlass::cast(v->klass());
 393   instanceOop new_value = vk->allocate_instance(CHECK_NULL);
 394   vk->value_store(vk->data_for_oop(vh()), vk->data_for_oop(new_value), true, false);
 395   markWord mark = new_value->mark();
 396   new_value->set_mark(mark.enter_larval_state());
 397   return JNIHandles::make_local(env, new_value);
 398 } UNSAFE_END
 399 
 400 UNSAFE_ENTRY(jobject, Unsafe_FinishPrivateBuffer(JNIEnv *env, jobject unsafe, jobject value)) {
 401   oop v = JNIHandles::resolve(value);
 402   assert(v->mark().is_larval_state(), "must be a larval value");
 403   markWord mark = v->mark();
 404   v->set_mark(mark.exit_larval_state());
 405   return JNIHandles::make_local(env, v);
 406 } UNSAFE_END
 407 
 408 UNSAFE_ENTRY(jobject, Unsafe_GetReferenceVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) {
 409   oop p = JNIHandles::resolve(obj);
 410   assert_field_offset_sane(p, offset);
 411   oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset);
 412   return JNIHandles::make_local(env, v);
 413 } UNSAFE_END
 414 




  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "jni.h"
  27 #include "jvm.h"
  28 #include "classfile/classFileStream.hpp"
  29 #include "classfile/classLoader.hpp"
  30 #include "classfile/vmSymbols.hpp"
  31 #include "jfr/jfrEvents.hpp"
  32 #include "memory/allocation.inline.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "logging/log.hpp"
  35 #include "logging/logStream.hpp"
  36 #include "oops/access.inline.hpp"
  37 #include "oops/fieldStreams.hpp"
  38 #include "oops/objArrayOop.inline.hpp"
  39 #include "oops/oop.inline.hpp"
  40 #include "oops/typeArrayOop.inline.hpp"
  41 #include "oops/valueArrayKlass.hpp"

  42 #include "oops/valueArrayOop.inline.hpp"
  43 #include "oops/valueKlass.inline.hpp"
  44 #include "prims/unsafe.hpp"
  45 #include "runtime/atomic.hpp"
  46 #include "runtime/fieldDescriptor.inline.hpp"
  47 #include "runtime/globals.hpp"
  48 #include "runtime/handles.inline.hpp"
  49 #include "runtime/interfaceSupport.inline.hpp"
  50 #include "runtime/jniHandles.inline.hpp"
  51 #include "runtime/orderAccess.hpp"
  52 #include "runtime/reflection.hpp"
  53 #include "runtime/sharedRuntime.hpp"
  54 #include "runtime/thread.hpp"
  55 #include "runtime/threadSMR.hpp"
  56 #include "runtime/vm_version.hpp"
  57 #include "services/threadService.hpp"
  58 #include "utilities/align.hpp"
  59 #include "utilities/copy.hpp"
  60 #include "utilities/dtrace.hpp"
  61 #include "utilities/macros.hpp"
  62 
  63 /**


 351 UNSAFE_ENTRY(jboolean, Unsafe_IsFlattenedArray(JNIEnv *env, jobject unsafe, jclass c)) {
 352   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c));
 353   return k->is_valueArray_klass();
 354 } UNSAFE_END
 355 
 356 UNSAFE_ENTRY(jobject, Unsafe_UninitializedDefaultValue(JNIEnv *env, jobject unsafe, jclass vc)) {
 357   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(vc));
 358   ValueKlass* vk = ValueKlass::cast(k);
 359   oop v = vk->default_value();
 360   return JNIHandles::make_local(env, v);
 361 } UNSAFE_END
 362 
 363 UNSAFE_ENTRY(jobject, Unsafe_GetValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass vc)) {
 364   oop base = JNIHandles::resolve(obj);
 365   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(vc));
 366   ValueKlass* vk = ValueKlass::cast(k);
 367   assert_and_log_unsafe_value_access(base, offset, vk);
 368   Handle base_h(THREAD, base);
 369   oop v = vk->allocate_instance(CHECK_NULL); // allocate instance
 370   vk->initialize(CHECK_NULL); // If field is a default value, value class might not be initialized yet
 371   vk->value_copy_payload_to_new_oop(((address)(oopDesc*)base_h()) + offset, v);


 372   return JNIHandles::make_local(env, v);
 373 } UNSAFE_END
 374 
 375 UNSAFE_ENTRY(void, Unsafe_PutValue(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jclass vc, jobject value)) {
 376   oop base = JNIHandles::resolve(obj);
 377   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(vc));
 378   ValueKlass* vk = ValueKlass::cast(k);
 379   assert(!base->is_value() || base->mark().is_larval_state(), "must be an object instance or a larval value");
 380   assert_and_log_unsafe_value_access(base, offset, vk);
 381   oop v = JNIHandles::resolve(value);
 382   vk->value_copy_oop_to_payload(v, ((address)(oopDesc*)base) + offset);

 383 } UNSAFE_END
 384 
 385 UNSAFE_ENTRY(jobject, Unsafe_MakePrivateBuffer(JNIEnv *env, jobject unsafe, jobject value)) {
 386   oop v = JNIHandles::resolve_non_null(value);
 387   assert(v->is_value(), "must be a value instance");
 388   Handle vh(THREAD, v);
 389   ValueKlass* vk = ValueKlass::cast(v->klass());
 390   instanceOop new_value = vk->allocate_instance(CHECK_NULL);
 391   vk->value_copy_oop_to_new_oop(vh(),  new_value);
 392   markWord mark = new_value->mark();
 393   new_value->set_mark(mark.enter_larval_state());
 394   return JNIHandles::make_local(env, new_value);
 395 } UNSAFE_END
 396 
 397 UNSAFE_ENTRY(jobject, Unsafe_FinishPrivateBuffer(JNIEnv *env, jobject unsafe, jobject value)) {
 398   oop v = JNIHandles::resolve(value);
 399   assert(v->mark().is_larval_state(), "must be a larval value");
 400   markWord mark = v->mark();
 401   v->set_mark(mark.exit_larval_state());
 402   return JNIHandles::make_local(env, v);
 403 } UNSAFE_END
 404 
 405 UNSAFE_ENTRY(jobject, Unsafe_GetReferenceVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) {
 406   oop p = JNIHandles::resolve(obj);
 407   assert_field_offset_sane(p, offset);
 408   oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset);
 409   return JNIHandles::make_local(env, v);
 410 } UNSAFE_END
 411 


< prev index next >