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
|