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.h"
36 #include "native/llni.h"
37 #include "native/native.h"
39 #if defined(ENABLE_JNI_HEADERS)
40 # include "native/include/sun_misc_Unsafe.h"
43 #include "vm/builtin.h"
44 #include "vm/exceptions.hpp"
45 #include "vm/initialize.h"
46 #include "vm/string.hpp"
48 #include "vmcore/javaobjects.hpp"
49 #include "vmcore/os.hpp"
50 #include "vmcore/utf8.h"
53 // Native functions are exported as C functions.
57 * Class: sun/misc/Unsafe
58 * Method: registerNatives
61 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
63 /* The native methods of this function are already registered in
64 _Jv_sun_misc_Unsafe_init() which is called during VM
70 * Class: sun/misc/Unsafe
72 * Signature: (Ljava/lang/Object;J)I
74 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
79 p = (int32_t *) (((uint8_t *) o) + offset);
88 * Class: sun/misc/Unsafe
90 * Signature: (Ljava/lang/Object;JI)V
92 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
96 p = (int32_t *) (((uint8_t *) o) + offset);
103 * Class: sun/misc/Unsafe
105 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
107 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, jobject _this, jobject o, jlong offset)
112 p = (void **) (((uint8_t *) o) + offset);
116 return (jobject) value;
121 * Class: sun/misc/Unsafe
123 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
125 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
129 p = (void **) (((uint8_t *) o) + offset);
136 * Class: sun/misc/Unsafe
138 * Signature: (Ljava/lang/Object;J)Z
140 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, jobject _this, jobject o, jlong offset)
145 p = (int32_t *) (((uint8_t *) o) + offset);
154 * Class: sun/misc/Unsafe
156 * Signature: (Ljava/lang/Object;JZ)V
158 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, jobject _this, jobject o, jlong offset, jboolean x)
162 p = (int32_t *) (((uint8_t *) o) + offset);
169 * Class: sun/misc/Unsafe
171 * Signature: (Ljava/lang/Object;J)B
173 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
178 p = (int32_t *) (((uint8_t *) o) + offset);
187 * Class: sun/misc/Unsafe
189 * Signature: (Ljava/lang/Object;JB)V
191 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, jobject _this, jobject o, jlong offset, jbyte x)
195 p = (int32_t *) (((uint8_t *) o) + offset);
202 * Class: sun/misc/Unsafe
204 * Signature: (Ljava/lang/Object;J)S
206 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
211 p = (int32_t *) (((uint8_t *) o) + offset);
220 * Class: sun/misc/Unsafe
222 * Signature: (Ljava/lang/Object;JS)V
224 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, jobject _this, jobject o, jlong offset, jshort x)
228 p = (int32_t *) (((uint8_t *) o) + offset);
235 * Class: sun/misc/Unsafe
237 * Signature: (Ljava/lang/Object;J)C
239 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
244 p = (int32_t *) (((uint8_t *) o) + offset);
253 * Class: sun/misc/Unsafe
255 * Signature: (Ljava/lang/Object;JC)V
257 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, jobject _this, jobject o, jlong offset, jchar x)
261 p = (int32_t *) (((uint8_t *) o) + offset);
268 * Class: sun/misc/Unsafe
270 * Signature: (Ljava/lang/Object;J)J
272 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
277 p = (int64_t *) (((uint8_t *) o) + offset);
286 * Class: sun/misc/Unsafe
288 * Signature: (Ljava/lang/Object;JJ)V
290 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
294 p = (int64_t *) (((uint8_t *) o) + offset);
301 * Class: sun/misc/Unsafe
303 * Signature: (Ljava/lang/Object;J)F
305 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
310 p = (float *) (((uint8_t *) o) + offset);
319 * Class: sun/misc/Unsafe
321 * Signature: (Ljava/lang/Object;JF)V
323 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, jobject _this, jobject o, jlong offset, jfloat x)
327 p = (float *) (((uint8_t *) o) + offset);
334 * Class: sun/misc/Unsafe
336 * Signature: (Ljava/lang/Object;J)D
338 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
343 p = (double *) (((uint8_t *) o) + offset);
352 * Class: sun/misc/Unsafe
354 * Signature: (Ljava/lang/Object;JD)V
356 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, jobject _this, jobject o, jlong offset, jdouble x)
360 p = (double *) (((uint8_t *) o) + offset);
367 * Class: sun/misc/Unsafe
371 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, jobject _this, jlong address)
376 p = (int8_t *) (intptr_t) address;
380 return (int32_t) value;
385 * Class: sun/misc/Unsafe
389 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, jobject _this, jlong address, jbyte value)
393 p = (int8_t *) (intptr_t) address;
400 * Class: sun/misc/Unsafe
404 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, jobject _this, jlong address)
409 p = (int16_t *) (intptr_t) address;
413 return (int32_t) value;
418 * Class: sun/misc/Unsafe
422 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, jobject _this, jlong address, jshort value)
426 p = (int16_t *) (intptr_t) address;
428 *p = (int16_t) value;
433 * Class: sun/misc/Unsafe
437 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, jobject _this, jlong address)
442 p = (uint16_t *) (intptr_t) address;
446 return (int32_t) value;
451 * Class: sun/misc/Unsafe
455 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, jobject _this, jlong address, jchar value)
459 p = (uint16_t *) (intptr_t) address;
461 *p = (uint16_t) value;
466 * Class: sun/misc/Unsafe
470 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, jobject _this, jlong address)
475 p = (int32_t *) (intptr_t) address;
484 * Class: sun/misc/Unsafe
488 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, jobject _this, jlong address, jint value)
492 p = (int32_t *) (intptr_t) address;
499 * Class: sun/misc/Unsafe
503 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, jobject _this, jlong address)
508 p = (int64_t *) (intptr_t) address;
517 * Class: sun/misc/Unsafe
521 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, jobject _this, jlong address, jlong value)
525 p = (int64_t *) (intptr_t) address;
532 * Class: sun/misc/Unsafe
536 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, jobject _this, jlong address)
541 p = (float *) (intptr_t) address;
550 * Class: sun/misc/Unsafe
554 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__JF(JNIEnv *env, jobject _this, jlong address, jfloat value)
558 p = (float*) (intptr_t) address;
565 * Class: sun/misc/Unsafe
566 * Method: objectFieldOffset
567 * Signature: (Ljava/lang/reflect/Field;)J
569 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, jobject _this, jobject field)
571 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
573 java_lang_reflect_Field rf(field);
574 java_lang_reflect_VMField rvmf(rf.get_f());
575 fieldinfo* f = rvmf.get_field();
577 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
579 java_lang_reflect_Field rf(field);
580 fieldinfo* f = rf.get_field();
583 # error unknown configuration
586 return (jlong) f->offset;
591 * Class: sun/misc/Unsafe
592 * Method: allocateMemory
595 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject _this, jlong bytes)
600 length = (size_t) bytes;
602 if ((length != (uint64_t) bytes) || (bytes < 0)) {
603 exceptions_throw_illegalargumentexception();
607 p = MNEW(uint8_t, length);
609 return (int64_t) (intptr_t) p;
617 * Class: sun/misc/Unsafe
619 * Signature: (Ljava/lang/Object;JJB)V
621 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong bytes, jbyte value)
626 length = (size_t) bytes;
628 if ((length != (uint64_t) bytes) || (bytes < 0)) {
629 exceptions_throw_illegalargumentexception();
633 /* XXX Missing LLNI: we need to unwrap _this object. */
635 p = (void *) (((uint8_t *) o) + offset);
637 /* XXX Not sure this is correct. */
639 os::memset(p, value, length);
644 * Class: sun/misc/Unsafe
646 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
648 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jobject srcBase, jlong srcOffset, jobject destBase, jlong destOffset, jlong bytes)
657 length = (size_t) bytes;
659 if ((length != (uint64_t) bytes) || (bytes < 0)) {
660 exceptions_throw_illegalargumentexception();
664 /* XXX Missing LLNI: We need to unwrap these objects. */
666 src = (void *) (((uint8_t *) srcBase) + srcOffset);
667 dest = (void *) (((uint8_t *) destBase) + destOffset);
669 os::memcpy(dest, src, length);
673 * Class: sun/misc/Unsafe
677 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jlong address, jlong bytes, jbyte value)
682 length = (size_t) bytes;
684 if ((length != (uint64_t) bytes) || (bytes < 0)) {
685 exceptions_throw_illegalargumentexception();
689 p = (void *) (intptr_t) address;
691 /* XXX Not sure this is correct. */
693 os::memset(p, value, length);
698 * Class: sun/misc/Unsafe
702 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jlong srcAddress, jlong destAddress, jlong bytes)
711 length = (size_t) bytes;
713 if ((length != (uint64_t) bytes) || (bytes < 0)) {
714 exceptions_throw_illegalargumentexception();
718 src = (void *) (intptr_t) srcAddress;
719 dest = (void *) (intptr_t) destAddress;
721 os::memcpy(dest, src, length);
727 * Class: sun/misc/Unsafe
731 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, jobject _this, jlong address)
735 p = (void *) (intptr_t) address;
740 /* we pass length 1 to trick the free function */
742 MFREE(p, uint8_t, 1);
747 * Class: sun/misc/Unsafe
748 * Method: staticFieldOffset
749 * Signature: (Ljava/lang/reflect/Field;)J
751 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, jobject _this, jobject f)
753 /* The offset of static fields is 0. */
760 * Class: sun/misc/Unsafe
761 * Method: staticFieldBase
762 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
764 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, jobject _this, jobject field)
766 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
768 java_lang_reflect_Field rf(field);
769 java_lang_reflect_VMField rvmf(rf.get_f());
770 fieldinfo* f = rvmf.get_field();
772 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
774 java_lang_reflect_Field rf(field);
775 fieldinfo* f = rf.get_field();
778 # error unknown configuration
781 return (jobject) (f->value);
786 * Class: sun/misc/Unsafe
787 * Method: ensureClassInitialized
788 * Signature: (Ljava/lang/Class;)V
790 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, jobject _this, jclass clazz)
794 c = LLNI_classinfo_unwrap(clazz);
796 if (!(c->state & CLASS_INITIALIZED))
802 * Class: sun/misc/Unsafe
803 * Method: arrayBaseOffset
804 * Signature: (Ljava/lang/Class;)I
806 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, jobject _this, jclass arrayClass)
811 c = LLNI_classinfo_unwrap(arrayClass);
812 ad = c->vftbl->arraydesc;
815 /* XXX does that exception exist? */
816 exceptions_throw_internalerror("java/lang/InvalidClassException");
820 return ad->dataoffset;
825 * Class: sun/misc/Unsafe
826 * Method: arrayIndexScale
827 * Signature: (Ljava/lang/Class;)I
829 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, jobject _this, jclass arrayClass)
834 c = LLNI_classinfo_unwrap(arrayClass);
835 ad = c->vftbl->arraydesc;
838 /* XXX does that exception exist? */
839 exceptions_throw_internalerror("java/lang/InvalidClassException");
843 return ad->componentsize;
848 * Class: sun/misc/Unsafe
849 * Method: addressSize
852 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, jobject _this)
854 return SIZEOF_VOID_P;
859 * Class: sun/misc/Unsafe
863 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, jobject _this)
874 * Class: sun/misc/Unsafe
875 * Method: defineClass
876 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
878 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)
884 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
886 /* check if data was passed */
889 exceptions_throw_nullpointerexception();
893 /* check the indexes passed */
895 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
896 exceptions_throw_arrayindexoutofboundsexception();
901 /* convert '.' to '/' in java string */
903 utfname = javastring_toutf((java_handle_t *) name, true);
909 /* define the class */
911 c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct((java_handle_bytearray_t*) b, off)),
912 (java_handle_t *) protectionDomain);
917 java_handle_t* h = LLNI_classinfo_wrap(c);
919 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
920 // Set ProtectionDomain.
921 java_lang_Class jlc(h);
922 jlc.set_pd(protectionDomain);
930 * Class: sun/misc/Unsafe
931 * Method: allocateInstance
932 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
934 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, jobject _this, jclass cls)
939 c = LLNI_classinfo_unwrap(cls);
948 * Class: sun/misc/Unsafe
949 * Method: throwException
950 * Signature: (Ljava/lang/Throwable;)V
952 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, jobject _this, jobject ee)
956 o = (java_handle_t *) ee;
958 exceptions_set_exception(o);
963 * Class: sun/misc/Unsafe
964 * Method: compareAndSwapObject
965 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
967 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject expected, jobject x)
974 p = (volatile void **) (((uint8_t *) o) + offset);
976 result = Atomic::compare_and_swap(p, expected, x);
978 if (result == expected)
986 * Class: sun/misc/Unsafe
987 * Method: compareAndSwapInt
988 * Signature: (Ljava/lang/Object;JII)Z
990 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, jobject _this, jobject o, jlong offset, jint expected, jint x)
997 p = (uint32_t *) (((uint8_t *) o) + offset);
999 result = Atomic::compare_and_swap(p, expected, x);
1001 if (result == (uint32_t) expected)
1009 * Class: sun/misc/Unsafe
1010 * Method: compareAndSwapLong
1011 * Signature: (Ljava/lang/Object;JJJ)Z
1013 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong expected, jlong x)
1020 p = (uint64_t *) (((uint8_t *) o) + offset);
1022 result = Atomic::compare_and_swap(p, expected, x);
1024 if (result == (uint64_t) expected)
1032 * Class: sun/misc/Unsafe
1033 * Method: getObjectVolatile
1034 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
1036 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1039 volatile void *value;
1041 p = (volatile void **) (((uint8_t *) o) + offset);
1045 return (jobject ) value;
1050 * Class: sun/misc/Unsafe
1051 * Method: putObjectVolatile
1052 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1054 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
1058 p = (volatile void **) (((uint8_t *) o) + offset);
1064 #define UNSAFE_GET_VOLATILE(type) \
1065 java_handle_t *_h; \
1066 java_object_t *_o; \
1067 volatile type *_p; \
1070 _h = (java_handle_t *) o; \
1072 LLNI_CRITICAL_START; \
1074 _o = LLNI_UNWRAP(_h); \
1075 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1079 LLNI_CRITICAL_END; \
1084 #define UNSAFE_PUT_VOLATILE(type) \
1085 java_handle_t *_h; \
1086 java_object_t *_o; \
1087 volatile type *_p; \
1089 _h = (java_handle_t *) o; \
1091 LLNI_CRITICAL_START; \
1093 _o = LLNI_UNWRAP(_h); \
1094 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1098 Atomic::memory_barrier(); \
1104 * Class: sun/misc/Unsafe
1105 * Method: getIntVolatile
1106 * Signature: (Ljava/lang/Object;J)I
1108 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1110 UNSAFE_GET_VOLATILE(int32_t);
1115 * Class: sun/misc/Unsafe
1116 * Method: putIntVolatile
1117 * Signature: (Ljava/lang/Object;JI)V
1119 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
1121 UNSAFE_PUT_VOLATILE(int32_t);
1126 * Class: sun/misc/Unsafe
1127 * Method: getLongVolatile
1128 * Signature: (Ljava/lang/Object;J)J
1130 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1132 UNSAFE_GET_VOLATILE(int64_t);
1137 * Class: sun/misc/Unsafe
1138 * Method: putLongVolatile
1139 * Signature: (Ljava/lang/Object;JJ)V
1141 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
1143 UNSAFE_PUT_VOLATILE(int64_t);
1148 * Class: sun/misc/Unsafe
1149 * Method: getDoubleVolatile
1150 * Signature: (Ljava/lang/Object;J)D
1152 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, jobject __this, jobject o, jlong offset)
1154 UNSAFE_GET_VOLATILE(double);
1159 * Class: sun/misc/Unsafe
1160 * Method: putOrderedObject
1161 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1163 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
1171 _h = (java_handle_t *) o;
1172 _hx = (java_handle_t *) x;
1174 LLNI_CRITICAL_START;
1176 _o = LLNI_UNWRAP(_h);
1177 _x = LLNI_UNWRAP(_hx);
1178 _p = (volatile void **) (((uint8_t *) _o) + offset);
1182 Atomic::memory_barrier();
1189 * Class: sun/misc/Unsafe
1190 * Method: putOrderedInt
1191 * Signature: (Ljava/lang/Object;JI)V
1193 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
1195 UNSAFE_PUT_VOLATILE(int32_t);
1200 * Class: sun/misc/Unsafe
1201 * Method: putOrderedLong
1202 * Signature: (Ljava/lang/Object;JJ)V
1204 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
1206 UNSAFE_PUT_VOLATILE(int64_t);
1211 * Class: sun/misc/Unsafe
1213 * Signature: (Ljava/lang/Object;)V
1215 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, jobject _this, jobject thread)
1217 /* XXX IMPLEMENT ME */
1222 * Class: sun/misc/Unsafe
1226 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, jobject _this, jboolean isAbsolute, jlong time)
1228 /* XXX IMPLEMENT ME */
1234 /* native methods implemented by this file ************************************/
1236 static JNINativeMethod methods[] = {
1237 { (char*) "registerNatives", (char*) "()V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_registerNatives },
1238 { (char*) "getInt", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
1239 { (char*) "putInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
1240 { (char*) "getObject", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObject },
1241 { (char*) "putObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObject },
1242 { (char*) "getBoolean", (char*) "(Ljava/lang/Object;J)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getBoolean },
1243 { (char*) "putBoolean", (char*) "(Ljava/lang/Object;JZ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putBoolean },
1244 { (char*) "getByte", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
1245 { (char*) "putByte", (char*) "(Ljava/lang/Object;JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
1246 { (char*) "getShort", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
1247 { (char*) "putShort", (char*) "(Ljava/lang/Object;JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
1248 { (char*) "getChar", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
1249 { (char*) "putChar", (char*) "(Ljava/lang/Object;JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
1250 { (char*) "getLong", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
1251 { (char*) "putLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
1252 { (char*) "getFloat", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
1253 { (char*) "putFloat", (char*) "(Ljava/lang/Object;JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
1254 { (char*) "getDouble", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
1255 { (char*) "putDouble", (char*) "(Ljava/lang/Object;JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
1256 { (char*) "getByte", (char*) "(J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__J },
1257 { (char*) "putByte", (char*) "(JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__JB },
1258 { (char*) "getShort", (char*) "(J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__J },
1259 { (char*) "putShort", (char*) "(JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__JS },
1260 { (char*) "getChar", (char*) "(J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__J },
1261 { (char*) "putChar", (char*) "(JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__JC },
1262 { (char*) "getInt", (char*) "(J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__J },
1263 { (char*) "putInt", (char*) "(JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__JI },
1264 { (char*) "getLong", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__J },
1265 { (char*) "putLong", (char*) "(JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
1266 { (char*) "getFloat", (char*) "(J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__J },
1267 { (char*) "putFloat", (char*) "(JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__JF },
1268 { (char*) "objectFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
1269 { (char*) "allocateMemory", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateMemory },
1272 { (char*) "setMemory", (char*) "(Ljava/lang/Object;JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1273 { (char*) "copyMemory", (char*) "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1275 { (char*) "setMemory", (char*) "(JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1276 { (char*) "copyMemory", (char*) "(JJJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1278 { (char*) "freeMemory", (char*) "(J)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_freeMemory },
1279 { (char*) "staticFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
1280 { (char*) "staticFieldBase", (char*) "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
1281 { (char*) "ensureClassInitialized", (char*) "(Ljava/lang/Class;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
1282 { (char*) "arrayBaseOffset", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
1283 { (char*) "arrayIndexScale", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
1284 { (char*) "addressSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_addressSize },
1285 { (char*) "pageSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_pageSize },
1286 { (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 },
1287 { (char*) "allocateInstance", (char*) "(Ljava/lang/Class;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateInstance },
1288 { (char*) "throwException", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_throwException },
1289 { (char*) "compareAndSwapObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
1290 { (char*) "compareAndSwapInt", (char*) "(Ljava/lang/Object;JII)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
1291 { (char*) "compareAndSwapLong", (char*) "(Ljava/lang/Object;JJJ)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
1292 { (char*) "getObjectVolatile", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
1293 { (char*) "putObjectVolatile", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
1294 { (char*) "getIntVolatile", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
1295 { (char*) "putIntVolatile", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putIntVolatile },
1296 { (char*) "getLongVolatile", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
1297 { (char*) "putLongVolatile", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLongVolatile },
1298 { (char*) "getDoubleVolatile", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDoubleVolatile },
1299 { (char*) "putOrderedObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedObject },
1300 { (char*) "putOrderedInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedInt },
1301 { (char*) "putOrderedLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedLong },
1302 { (char*) "unpark", (char*) "(Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_unpark },
1303 { (char*) "park", (char*) "(ZJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_park },
1307 /* _Jv_sun_misc_Unsafe_init ****************************************************
1309 Register native functions.
1311 *******************************************************************************/
1315 void _Jv_sun_misc_Unsafe_init(void)
1319 u = utf_new_char("sun/misc/Unsafe");
1321 native_method_register(u, methods, NATIVE_METHODS_COUNT);
1326 * These are local overrides for various environment variables in Emacs.
1327 * Please do not remove this and leave it at the end of the file, where
1328 * Emacs will automagically detect them.
1329 * ---------------------------------------------------------------------
1332 * indent-tabs-mode: t