1 /* src/native/vm/sun_misc_Unsafe.cpp - sun/misc/Unsafe
3 Copyright (C) 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
31 #include "threads/atomic.hpp"
33 #include "mm/memory.h"
35 #include "native/jni.hpp"
36 #include "native/llni.h"
37 #include "native/native.hpp"
39 #if defined(ENABLE_JNI_HEADERS)
40 # include "native/include/sun_misc_Unsafe.h"
43 #include "vm/jit/builtin.hpp"
44 #include "vm/exceptions.hpp"
45 #include "vm/initialize.hpp"
46 #include "vm/javaobjects.hpp"
48 #include "vm/string.hpp"
52 // Native functions are exported as C functions.
56 * Class: sun/misc/Unsafe
57 * Method: registerNatives
60 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
62 /* The native methods of this function are already registered in
63 _Jv_sun_misc_Unsafe_init() which is called during VM
69 * Class: sun/misc/Unsafe
71 * Signature: (Ljava/lang/Object;J)I
73 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
75 return FieldAccess::get<int32_t>(o, offset);
80 * Class: sun/misc/Unsafe
82 * Signature: (Ljava/lang/Object;JI)V
84 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
86 FieldAccess::set(o, offset, x);
91 * Class: sun/misc/Unsafe
93 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
95 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, jobject _this, jobject o, jlong offset)
97 return FieldAccess::get<jobject>(o, offset);
102 * Class: sun/misc/Unsafe
104 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
106 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
108 FieldAccess::set(o, offset, x);
113 * Class: sun/misc/Unsafe
115 * Signature: (Ljava/lang/Object;J)Z
117 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, jobject _this, jobject o, jlong offset)
119 return FieldAccess::get<int32_t>(o, offset);
124 * Class: sun/misc/Unsafe
126 * Signature: (Ljava/lang/Object;JZ)V
128 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, jobject _this, jobject o, jlong offset, jboolean x)
130 FieldAccess::set(o, offset, (int32_t) x);
135 * Class: sun/misc/Unsafe
137 * Signature: (Ljava/lang/Object;J)B
139 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
141 return FieldAccess::get<int32_t>(o, offset);
146 * Class: sun/misc/Unsafe
148 * Signature: (Ljava/lang/Object;JB)V
150 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, jobject _this, jobject o, jlong offset, jbyte x)
152 FieldAccess::set(o, offset, (int32_t) x);
157 * Class: sun/misc/Unsafe
159 * Signature: (Ljava/lang/Object;J)S
161 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
163 return FieldAccess::get<int32_t>(o, offset);
168 * Class: sun/misc/Unsafe
170 * Signature: (Ljava/lang/Object;JS)V
172 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, jobject _this, jobject o, jlong offset, jshort x)
174 FieldAccess::set(o, offset, (int32_t) x);
179 * Class: sun/misc/Unsafe
181 * Signature: (Ljava/lang/Object;J)C
183 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
185 return FieldAccess::get<int32_t>(o, offset);
190 * Class: sun/misc/Unsafe
192 * Signature: (Ljava/lang/Object;JC)V
194 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, jobject _this, jobject o, jlong offset, jchar x)
196 FieldAccess::set(o, offset, (int32_t) x);
201 * Class: sun/misc/Unsafe
203 * Signature: (Ljava/lang/Object;J)J
205 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
207 return FieldAccess::get<int64_t>(o, offset);
212 * Class: sun/misc/Unsafe
214 * Signature: (Ljava/lang/Object;JJ)V
216 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
218 FieldAccess::set(o, offset, x);
223 * Class: sun/misc/Unsafe
225 * Signature: (Ljava/lang/Object;J)F
227 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
229 return FieldAccess::get<float>(o, offset);
234 * Class: sun/misc/Unsafe
236 * Signature: (Ljava/lang/Object;JF)V
238 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, jobject _this, jobject o, jlong offset, jfloat x)
240 FieldAccess::set(o, offset, x);
245 * Class: sun/misc/Unsafe
247 * Signature: (Ljava/lang/Object;J)D
249 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
251 return FieldAccess::get<double>(o, offset);
256 * Class: sun/misc/Unsafe
258 * Signature: (Ljava/lang/Object;JD)V
260 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, jobject _this, jobject o, jlong offset, jdouble x)
262 FieldAccess::set(o, offset, x);
267 * Class: sun/misc/Unsafe
271 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, jobject _this, jlong address)
276 p = (int8_t *) (intptr_t) address;
280 return (int32_t) value;
285 * Class: sun/misc/Unsafe
289 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, jobject _this, jlong address, jbyte value)
293 p = (int8_t *) (intptr_t) address;
300 * Class: sun/misc/Unsafe
304 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, jobject _this, jlong address)
309 p = (int16_t *) (intptr_t) address;
313 return (int32_t) value;
318 * Class: sun/misc/Unsafe
322 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, jobject _this, jlong address, jshort value)
326 p = (int16_t *) (intptr_t) address;
328 *p = (int16_t) value;
333 * Class: sun/misc/Unsafe
337 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, jobject _this, jlong address)
342 p = (uint16_t *) (intptr_t) address;
346 return (int32_t) value;
351 * Class: sun/misc/Unsafe
355 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, jobject _this, jlong address, jchar value)
359 p = (uint16_t *) (intptr_t) address;
361 *p = (uint16_t) value;
366 * Class: sun/misc/Unsafe
370 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, jobject _this, jlong address)
375 p = (int32_t *) (intptr_t) address;
384 * Class: sun/misc/Unsafe
388 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, jobject _this, jlong address, jint value)
392 p = (int32_t *) (intptr_t) address;
399 * Class: sun/misc/Unsafe
403 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, jobject _this, jlong address)
408 p = (int64_t *) (intptr_t) address;
417 * Class: sun/misc/Unsafe
421 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, jobject _this, jlong address, jlong value)
425 p = (int64_t *) (intptr_t) address;
432 * Class: sun/misc/Unsafe
436 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, jobject _this, jlong address)
441 p = (float *) (intptr_t) address;
450 * Class: sun/misc/Unsafe
454 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__JF(JNIEnv *env, jobject _this, jlong address, jfloat value)
458 p = (float*) (intptr_t) address;
465 * Class: sun/misc/Unsafe
469 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDouble__J(JNIEnv *env, jobject _this, jlong address)
474 p = (double*) (intptr_t) address;
483 * Class: sun/misc/Unsafe
484 * Method: objectFieldOffset
485 * Signature: (Ljava/lang/reflect/Field;)J
487 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, jobject _this, jobject field)
489 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
491 java_lang_reflect_Field rf(field);
492 java_lang_reflect_VMField rvmf(rf.get_f());
493 fieldinfo* f = rvmf.get_field();
495 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
497 java_lang_reflect_Field rf(field);
498 fieldinfo* f = rf.get_field();
501 # error unknown configuration
504 return (jlong) f->offset;
509 * Class: sun/misc/Unsafe
510 * Method: allocateMemory
513 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject _this, jlong bytes)
518 length = (size_t) bytes;
520 if ((length != (uint64_t) bytes) || (bytes < 0)) {
521 exceptions_throw_illegalargumentexception();
525 p = MNEW(uint8_t, length);
527 return (int64_t) (intptr_t) p;
535 * Class: sun/misc/Unsafe
537 * Signature: (Ljava/lang/Object;JJB)V
539 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong bytes, jbyte value)
544 length = (size_t) bytes;
546 if ((length != (uint64_t) bytes) || (bytes < 0)) {
547 exceptions_throw_illegalargumentexception();
551 /* XXX Missing LLNI: we need to unwrap _this object. */
553 p = (void *) (((uint8_t *) o) + offset);
555 /* XXX Not sure this is correct. */
557 os::memset(p, value, length);
562 * Class: sun/misc/Unsafe
564 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
566 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jobject srcBase, jlong srcOffset, jobject destBase, jlong destOffset, jlong bytes)
575 length = (size_t) bytes;
577 if ((length != (uint64_t) bytes) || (bytes < 0)) {
578 exceptions_throw_illegalargumentexception();
582 /* XXX Missing LLNI: We need to unwrap these objects. */
584 src = (void *) (((uint8_t *) srcBase) + srcOffset);
585 dest = (void *) (((uint8_t *) destBase) + destOffset);
587 os::memcpy(dest, src, length);
591 * Class: sun/misc/Unsafe
595 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jlong address, jlong bytes, jbyte value)
600 length = (size_t) bytes;
602 if ((length != (uint64_t) bytes) || (bytes < 0)) {
603 exceptions_throw_illegalargumentexception();
607 p = (void *) (intptr_t) address;
609 /* XXX Not sure this is correct. */
611 os::memset(p, value, length);
616 * Class: sun/misc/Unsafe
620 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jlong srcAddress, jlong destAddress, jlong bytes)
629 length = (size_t) bytes;
631 if ((length != (uint64_t) bytes) || (bytes < 0)) {
632 exceptions_throw_illegalargumentexception();
636 src = (void *) (intptr_t) srcAddress;
637 dest = (void *) (intptr_t) destAddress;
639 os::memcpy(dest, src, length);
645 * Class: sun/misc/Unsafe
649 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, jobject _this, jlong address)
653 p = (void *) (intptr_t) address;
658 /* we pass length 1 to trick the free function */
660 MFREE(p, uint8_t, 1);
665 * Class: sun/misc/Unsafe
666 * Method: staticFieldOffset
667 * Signature: (Ljava/lang/reflect/Field;)J
669 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, jobject _this, jobject f)
671 /* The offset of static fields is 0. */
678 * Class: sun/misc/Unsafe
679 * Method: staticFieldBase
680 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
682 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, jobject _this, jobject field)
684 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
686 java_lang_reflect_Field rf(field);
687 java_lang_reflect_VMField rvmf(rf.get_f());
688 fieldinfo* f = rvmf.get_field();
690 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
692 java_lang_reflect_Field rf(field);
693 fieldinfo* f = rf.get_field();
696 # error unknown configuration
699 return (jobject) (f->value);
704 * Class: sun/misc/Unsafe
705 * Method: ensureClassInitialized
706 * Signature: (Ljava/lang/Class;)V
708 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, jobject _this, jclass clazz)
712 c = LLNI_classinfo_unwrap(clazz);
714 if (!(c->state & CLASS_INITIALIZED))
720 * Class: sun/misc/Unsafe
721 * Method: arrayBaseOffset
722 * Signature: (Ljava/lang/Class;)I
724 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, jobject _this, jclass arrayClass)
729 c = LLNI_classinfo_unwrap(arrayClass);
730 ad = c->vftbl->arraydesc;
733 /* XXX does that exception exist? */
734 exceptions_throw_internalerror("java/lang/InvalidClassException");
738 return ad->dataoffset;
743 * Class: sun/misc/Unsafe
744 * Method: arrayIndexScale
745 * Signature: (Ljava/lang/Class;)I
747 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, jobject _this, jclass arrayClass)
752 c = LLNI_classinfo_unwrap(arrayClass);
753 ad = c->vftbl->arraydesc;
756 /* XXX does that exception exist? */
757 exceptions_throw_internalerror("java/lang/InvalidClassException");
761 return ad->componentsize;
766 * Class: sun/misc/Unsafe
767 * Method: addressSize
770 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, jobject _this)
772 return SIZEOF_VOID_P;
777 * Class: sun/misc/Unsafe
781 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, jobject _this)
792 * Class: sun/misc/Unsafe
793 * Method: defineClass
794 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
796 JNIEXPORT jclass JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(JNIEnv *env, jobject _this, jstring name, jbyteArray b, jint off, jint len, jobject loader, jobject protectionDomain)
802 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
804 /* check if data was passed */
807 exceptions_throw_nullpointerexception();
811 /* check the indexes passed */
813 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
814 exceptions_throw_arrayindexoutofboundsexception();
819 /* convert '.' to '/' in java string */
821 utfname = javastring_toutf((java_handle_t *) name, true);
827 /* define the class */
829 c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct((java_handle_bytearray_t*) b, off)),
830 (java_handle_t *) protectionDomain);
835 java_handle_t* h = LLNI_classinfo_wrap(c);
837 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
838 // Set ProtectionDomain.
839 java_lang_Class jlc(h);
840 jlc.set_pd(protectionDomain);
848 * Class: sun/misc/Unsafe
849 * Method: allocateInstance
850 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
852 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, jobject _this, jclass cls)
857 c = LLNI_classinfo_unwrap(cls);
866 * Class: sun/misc/Unsafe
867 * Method: throwException
868 * Signature: (Ljava/lang/Throwable;)V
870 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, jobject _this, jobject ee)
874 o = (java_handle_t *) ee;
876 exceptions_set_exception(o);
881 * Class: sun/misc/Unsafe
882 * Method: compareAndSwapObject
883 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
885 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject expected, jobject x)
892 p = (volatile void **) (((uint8_t *) o) + offset);
894 result = Atomic::compare_and_swap(p, expected, x);
896 if (result == expected)
904 * Class: sun/misc/Unsafe
905 * Method: compareAndSwapInt
906 * Signature: (Ljava/lang/Object;JII)Z
908 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, jobject _this, jobject o, jlong offset, jint expected, jint x)
915 p = (uint32_t *) (((uint8_t *) o) + offset);
917 result = Atomic::compare_and_swap(p, expected, x);
919 if (result == (uint32_t) expected)
927 * Class: sun/misc/Unsafe
928 * Method: compareAndSwapLong
929 * Signature: (Ljava/lang/Object;JJJ)Z
931 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong expected, jlong x)
938 p = (uint64_t *) (((uint8_t *) o) + offset);
940 result = Atomic::compare_and_swap(p, expected, x);
942 if (result == (uint64_t) expected)
950 * Class: sun/misc/Unsafe
951 * Method: getObjectVolatile
952 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
954 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
956 return FieldAccess::get_volatile<jobject>(o, offset);
961 * Class: sun/misc/Unsafe
962 * Method: putObjectVolatile
963 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
965 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
967 FieldAccess::set_volatile(o, offset, x);
972 * Class: sun/misc/Unsafe
973 * Method: getByteVolatile
974 * Signature: (Ljava/lang/Object;J)B
976 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByteVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
978 return FieldAccess::get_volatile<int32_t>(o, offset);
983 * Class: sun/misc/Unsafe
984 * Method: getIntVolatile
985 * Signature: (Ljava/lang/Object;J)I
987 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
989 return FieldAccess::get_volatile<int32_t>(o, offset);
994 * Class: sun/misc/Unsafe
995 * Method: putIntVolatile
996 * Signature: (Ljava/lang/Object;JI)V
998 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
1000 FieldAccess::set_volatile(o, offset, x);
1005 * Class: sun/misc/Unsafe
1006 * Method: getLongVolatile
1007 * Signature: (Ljava/lang/Object;J)J
1009 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1011 return FieldAccess::get_volatile<int64_t>(o, offset);
1016 * Class: sun/misc/Unsafe
1017 * Method: putLongVolatile
1018 * Signature: (Ljava/lang/Object;JJ)V
1020 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
1022 FieldAccess::set_volatile(o, offset, x);
1027 * Class: sun/misc/Unsafe
1028 * Method: getFloatVolatile
1029 * Signature: (Ljava/lang/Object;J)F
1031 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloatVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
1033 return FieldAccess::get_volatile<float>(o, offset);
1038 * Class: sun/misc/Unsafe
1039 * Method: getDoubleVolatile
1040 * Signature: (Ljava/lang/Object;J)D
1042 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1044 return FieldAccess::get_volatile<double>(o, offset);
1049 * Class: sun/misc/Unsafe
1050 * Method: putOrderedObject
1051 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1053 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
1055 FieldAccess::set_volatile(o, offset, x);
1060 * Class: sun/misc/Unsafe
1061 * Method: putOrderedInt
1062 * Signature: (Ljava/lang/Object;JI)V
1064 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
1066 FieldAccess::set_volatile(o, offset, x);
1071 * Class: sun/misc/Unsafe
1072 * Method: putOrderedLong
1073 * Signature: (Ljava/lang/Object;JJ)V
1075 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
1077 FieldAccess::set_volatile(o, offset, x);
1082 * Class: sun/misc/Unsafe
1084 * Signature: (Ljava/lang/Object;)V
1086 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, jobject _this, jobject thread)
1088 java_handle_t *h = (java_handle_t *) thread;
1091 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
1092 h = java_lang_Thread(h).get_vmThread();
1094 t = thread_get_thread(h);
1101 * Class: sun/misc/Unsafe
1105 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, jobject _this, jboolean isAbsolute, jlong time)
1107 threads_park(isAbsolute, time);
1113 /* native methods implemented by this file ************************************/
1115 static JNINativeMethod methods[] = {
1116 { (char*) "registerNatives", (char*) "()V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_registerNatives },
1117 { (char*) "getInt", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
1118 { (char*) "putInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
1119 { (char*) "getObject", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObject },
1120 { (char*) "putObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObject },
1121 { (char*) "getBoolean", (char*) "(Ljava/lang/Object;J)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getBoolean },
1122 { (char*) "putBoolean", (char*) "(Ljava/lang/Object;JZ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putBoolean },
1123 { (char*) "getByte", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
1124 { (char*) "putByte", (char*) "(Ljava/lang/Object;JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
1125 { (char*) "getShort", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
1126 { (char*) "putShort", (char*) "(Ljava/lang/Object;JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
1127 { (char*) "getChar", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
1128 { (char*) "putChar", (char*) "(Ljava/lang/Object;JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
1129 { (char*) "getLong", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
1130 { (char*) "putLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
1131 { (char*) "getFloat", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
1132 { (char*) "putFloat", (char*) "(Ljava/lang/Object;JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
1133 { (char*) "getDouble", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
1134 { (char*) "putDouble", (char*) "(Ljava/lang/Object;JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
1135 { (char*) "getByte", (char*) "(J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__J },
1136 { (char*) "putByte", (char*) "(JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__JB },
1137 { (char*) "getShort", (char*) "(J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__J },
1138 { (char*) "putShort", (char*) "(JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__JS },
1139 { (char*) "getChar", (char*) "(J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__J },
1140 { (char*) "putChar", (char*) "(JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__JC },
1141 { (char*) "getInt", (char*) "(J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__J },
1142 { (char*) "putInt", (char*) "(JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__JI },
1143 { (char*) "getLong", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__J },
1144 { (char*) "putLong", (char*) "(JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
1145 { (char*) "getFloat", (char*) "(J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__J },
1146 { (char*) "putFloat", (char*) "(JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__JF },
1147 { (char*) "getDouble", (char*) "(J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__J },
1148 { (char*) "objectFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
1149 { (char*) "allocateMemory", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateMemory },
1152 { (char*) "setMemory", (char*) "(Ljava/lang/Object;JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1153 { (char*) "copyMemory", (char*) "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1155 { (char*) "setMemory", (char*) "(JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1156 { (char*) "copyMemory", (char*) "(JJJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1158 { (char*) "freeMemory", (char*) "(J)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_freeMemory },
1159 { (char*) "staticFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
1160 { (char*) "staticFieldBase", (char*) "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
1161 { (char*) "ensureClassInitialized", (char*) "(Ljava/lang/Class;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
1162 { (char*) "arrayBaseOffset", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
1163 { (char*) "arrayIndexScale", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
1164 { (char*) "addressSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_addressSize },
1165 { (char*) "pageSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_pageSize },
1166 { (char*) "defineClass", (char*) "(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2 },
1167 { (char*) "allocateInstance", (char*) "(Ljava/lang/Class;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateInstance },
1168 { (char*) "throwException", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_throwException },
1169 { (char*) "compareAndSwapObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
1170 { (char*) "compareAndSwapInt", (char*) "(Ljava/lang/Object;JII)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
1171 { (char*) "compareAndSwapLong", (char*) "(Ljava/lang/Object;JJJ)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
1172 { (char*) "getObjectVolatile", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
1173 { (char*) "putObjectVolatile", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
1174 { (char*) "getByteVolatile", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByteVolatile },
1175 { (char*) "getIntVolatile", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
1176 { (char*) "putIntVolatile", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putIntVolatile },
1177 { (char*) "getLongVolatile", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
1178 { (char*) "putLongVolatile", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLongVolatile },
1179 { (char*) "getFloatVolatile", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloatVolatile },
1180 { (char*) "getDoubleVolatile", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDoubleVolatile },
1181 { (char*) "putOrderedObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedObject },
1182 { (char*) "putOrderedInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedInt },
1183 { (char*) "putOrderedLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedLong },
1184 { (char*) "unpark", (char*) "(Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_unpark },
1185 { (char*) "park", (char*) "(ZJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_park },
1189 /* _Jv_sun_misc_Unsafe_init ****************************************************
1191 Register native functions.
1193 *******************************************************************************/
1195 void _Jv_sun_misc_Unsafe_init(void)
1197 utf* u = utf_new_char("sun/misc/Unsafe");
1199 NativeMethods& nm = VM::get_current()->get_nativemethods();
1200 nm.register_methods(u, methods, NATIVE_METHODS_COUNT);
1205 * These are local overrides for various environment variables in Emacs.
1206 * Please do not remove this and leave it at the end of the file, where
1207 * Emacs will automagically detect them.
1208 * ---------------------------------------------------------------------
1211 * indent-tabs-mode: t
1215 * vim:noexpandtab:sw=4:ts=4: