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.hpp"
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/array.hpp"
44 #include "vm/jit/builtin.hpp"
45 #include "vm/exceptions.hpp"
46 #include "vm/initialize.hpp"
47 #include "vm/javaobjects.hpp"
49 #include "vm/string.hpp"
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)
76 return FieldAccess::get<int32_t>(o, offset);
81 * Class: sun/misc/Unsafe
83 * Signature: (Ljava/lang/Object;JI)V
85 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
87 FieldAccess::set(o, offset, x);
92 * Class: sun/misc/Unsafe
94 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
96 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, jobject _this, jobject o, jlong offset)
98 return FieldAccess::get<jobject>(o, offset);
103 * Class: sun/misc/Unsafe
105 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
107 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
109 FieldAccess::set(o, offset, x);
114 * Class: sun/misc/Unsafe
116 * Signature: (Ljava/lang/Object;J)Z
118 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, jobject _this, jobject o, jlong offset)
120 return FieldAccess::get<int32_t>(o, offset);
125 * Class: sun/misc/Unsafe
127 * Signature: (Ljava/lang/Object;JZ)V
129 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, jobject _this, jobject o, jlong offset, jboolean x)
131 FieldAccess::set(o, offset, (int32_t) x);
136 * Class: sun/misc/Unsafe
138 * Signature: (Ljava/lang/Object;J)B
140 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
142 return FieldAccess::get<int32_t>(o, offset);
147 * Class: sun/misc/Unsafe
149 * Signature: (Ljava/lang/Object;JB)V
151 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, jobject _this, jobject o, jlong offset, jbyte x)
153 FieldAccess::set(o, offset, (int32_t) x);
158 * Class: sun/misc/Unsafe
160 * Signature: (Ljava/lang/Object;J)S
162 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
164 return FieldAccess::get<int32_t>(o, offset);
169 * Class: sun/misc/Unsafe
171 * Signature: (Ljava/lang/Object;JS)V
173 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, jobject _this, jobject o, jlong offset, jshort x)
175 FieldAccess::set(o, offset, (int32_t) x);
180 * Class: sun/misc/Unsafe
182 * Signature: (Ljava/lang/Object;J)C
184 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
186 return FieldAccess::get<int32_t>(o, offset);
191 * Class: sun/misc/Unsafe
193 * Signature: (Ljava/lang/Object;JC)V
195 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, jobject _this, jobject o, jlong offset, jchar x)
197 FieldAccess::set(o, offset, (int32_t) x);
202 * Class: sun/misc/Unsafe
204 * Signature: (Ljava/lang/Object;J)J
206 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
208 return FieldAccess::get<int64_t>(o, offset);
213 * Class: sun/misc/Unsafe
215 * Signature: (Ljava/lang/Object;JJ)V
217 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
219 FieldAccess::set(o, offset, x);
224 * Class: sun/misc/Unsafe
226 * Signature: (Ljava/lang/Object;J)F
228 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
230 return FieldAccess::get<float>(o, offset);
235 * Class: sun/misc/Unsafe
237 * Signature: (Ljava/lang/Object;JF)V
239 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, jobject _this, jobject o, jlong offset, jfloat x)
241 FieldAccess::set(o, offset, x);
246 * Class: sun/misc/Unsafe
248 * Signature: (Ljava/lang/Object;J)D
250 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, jobject _this, jobject o, jlong offset)
252 return FieldAccess::get<double>(o, offset);
257 * Class: sun/misc/Unsafe
259 * Signature: (Ljava/lang/Object;JD)V
261 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, jobject _this, jobject o, jlong offset, jdouble x)
263 FieldAccess::set(o, offset, x);
268 * Class: sun/misc/Unsafe
272 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, jobject _this, jlong address)
277 p = (int8_t *) (intptr_t) address;
281 return (int32_t) value;
286 * Class: sun/misc/Unsafe
290 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, jobject _this, jlong address, jbyte value)
294 p = (int8_t *) (intptr_t) address;
301 * Class: sun/misc/Unsafe
305 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, jobject _this, jlong address)
310 p = (int16_t *) (intptr_t) address;
314 return (int32_t) value;
319 * Class: sun/misc/Unsafe
323 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, jobject _this, jlong address, jshort value)
327 p = (int16_t *) (intptr_t) address;
329 *p = (int16_t) value;
334 * Class: sun/misc/Unsafe
338 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, jobject _this, jlong address)
343 p = (uint16_t *) (intptr_t) address;
347 return (int32_t) value;
352 * Class: sun/misc/Unsafe
356 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, jobject _this, jlong address, jchar value)
360 p = (uint16_t *) (intptr_t) address;
362 *p = (uint16_t) value;
367 * Class: sun/misc/Unsafe
371 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, jobject _this, jlong address)
376 p = (int32_t *) (intptr_t) address;
385 * Class: sun/misc/Unsafe
389 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, jobject _this, jlong address, jint value)
393 p = (int32_t *) (intptr_t) address;
400 * Class: sun/misc/Unsafe
404 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, jobject _this, jlong address)
409 p = (int64_t *) (intptr_t) address;
418 * Class: sun/misc/Unsafe
422 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, jobject _this, jlong address, jlong value)
426 p = (int64_t *) (intptr_t) address;
433 * Class: sun/misc/Unsafe
437 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, jobject _this, jlong address)
442 p = (float *) (intptr_t) address;
451 * Class: sun/misc/Unsafe
455 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__JF(JNIEnv *env, jobject _this, jlong address, jfloat value)
459 p = (float*) (intptr_t) address;
466 * Class: sun/misc/Unsafe
470 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDouble__J(JNIEnv *env, jobject _this, jlong address)
475 p = (double*) (intptr_t) address;
484 * Class: sun/misc/Unsafe
488 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__JD(JNIEnv *env, jobject _this, jlong address, jdouble value)
492 p = (double*) (intptr_t) address;
499 * Class: sun/misc/Unsafe
500 * Method: objectFieldOffset
501 * Signature: (Ljava/lang/reflect/Field;)J
503 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, jobject _this, jobject field)
505 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
507 java_lang_reflect_Field rf(field);
508 java_lang_reflect_VMField rvmf(rf.get_f());
509 fieldinfo* f = rvmf.get_field();
511 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
513 java_lang_reflect_Field rf(field);
514 fieldinfo* f = rf.get_field();
517 # error unknown configuration
520 return (jlong) f->offset;
525 * Class: sun/misc/Unsafe
526 * Method: allocateMemory
529 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject _this, jlong bytes)
534 length = (size_t) bytes;
536 if ((length != (uint64_t) bytes) || (bytes < 0)) {
537 exceptions_throw_illegalargumentexception();
541 p = MNEW(uint8_t, length);
543 return (int64_t) (intptr_t) p;
551 * Class: sun/misc/Unsafe
553 * Signature: (Ljava/lang/Object;JJB)V
555 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong bytes, jbyte value)
560 length = (size_t) bytes;
562 if ((length != (uint64_t) bytes) || (bytes < 0)) {
563 exceptions_throw_illegalargumentexception();
567 /* XXX Missing LLNI: we need to unwrap _this object. */
569 p = (void *) (((uint8_t *) o) + offset);
571 /* XXX Not sure this is correct. */
573 os::memset(p, value, length);
578 * Class: sun/misc/Unsafe
580 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
582 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jobject srcBase, jlong srcOffset, jobject destBase, jlong destOffset, jlong bytes)
591 length = (size_t) bytes;
593 if ((length != (uint64_t) bytes) || (bytes < 0)) {
594 exceptions_throw_illegalargumentexception();
598 /* XXX Missing LLNI: We need to unwrap these objects. */
600 src = (void *) (((uint8_t *) srcBase) + srcOffset);
601 dest = (void *) (((uint8_t *) destBase) + destOffset);
603 os::memcpy(dest, src, length);
607 * Class: sun/misc/Unsafe
611 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jlong address, jlong bytes, jbyte value)
616 length = (size_t) bytes;
618 if ((length != (uint64_t) bytes) || (bytes < 0)) {
619 exceptions_throw_illegalargumentexception();
623 p = (void *) (intptr_t) address;
625 /* XXX Not sure this is correct. */
627 os::memset(p, value, length);
632 * Class: sun/misc/Unsafe
636 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jlong srcAddress, jlong destAddress, jlong bytes)
645 length = (size_t) bytes;
647 if ((length != (uint64_t) bytes) || (bytes < 0)) {
648 exceptions_throw_illegalargumentexception();
652 src = (void *) (intptr_t) srcAddress;
653 dest = (void *) (intptr_t) destAddress;
655 os::memcpy(dest, src, length);
661 * Class: sun/misc/Unsafe
665 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, jobject _this, jlong address)
669 p = (void *) (intptr_t) address;
674 /* we pass length 1 to trick the free function */
676 MFREE(p, uint8_t, 1);
681 * Class: sun/misc/Unsafe
682 * Method: staticFieldOffset
683 * Signature: (Ljava/lang/reflect/Field;)J
685 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, jobject _this, jobject f)
687 /* The offset of static fields is 0. */
694 * Class: sun/misc/Unsafe
695 * Method: staticFieldBase
696 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
698 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, jobject _this, jobject field)
700 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
702 java_lang_reflect_Field rf(field);
703 java_lang_reflect_VMField rvmf(rf.get_f());
704 fieldinfo* f = rvmf.get_field();
706 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
708 java_lang_reflect_Field rf(field);
709 fieldinfo* f = rf.get_field();
712 # error unknown configuration
715 return (jobject) (f->value);
720 * Class: sun/misc/Unsafe
721 * Method: ensureClassInitialized
722 * Signature: (Ljava/lang/Class;)V
724 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, jobject _this, jclass clazz)
728 c = LLNI_classinfo_unwrap(clazz);
730 if (!(c->state & CLASS_INITIALIZED))
736 * Class: sun/misc/Unsafe
737 * Method: arrayBaseOffset
738 * Signature: (Ljava/lang/Class;)I
740 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, jobject _this, jclass arrayClass)
745 c = LLNI_classinfo_unwrap(arrayClass);
746 ad = c->vftbl->arraydesc;
749 /* XXX does that exception exist? */
750 exceptions_throw_internalerror("java/lang/InvalidClassException");
754 return ad->dataoffset;
759 * Class: sun/misc/Unsafe
760 * Method: arrayIndexScale
761 * Signature: (Ljava/lang/Class;)I
763 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, jobject _this, jclass arrayClass)
768 c = LLNI_classinfo_unwrap(arrayClass);
769 ad = c->vftbl->arraydesc;
772 /* XXX does that exception exist? */
773 exceptions_throw_internalerror("java/lang/InvalidClassException");
777 return ad->componentsize;
782 * Class: sun/misc/Unsafe
783 * Method: addressSize
786 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, jobject _this)
788 return SIZEOF_VOID_P;
793 * Class: sun/misc/Unsafe
797 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, jobject _this)
808 * Class: sun/misc/Unsafe
809 * Method: defineClass
810 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
812 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)
818 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
820 /* check if data was passed */
823 exceptions_throw_nullpointerexception();
827 /* check the indexes passed */
831 if ((off < 0) || (len < 0) || ((off + len) > ba.get_length())) {
832 exceptions_throw_arrayindexoutofboundsexception();
837 /* convert '.' to '/' in java string */
839 utfname = javastring_toutf((java_handle_t *) name, true);
845 /* define the class */
847 uint8_t* ptr = ((uint8_t*) ba.get_raw_data_ptr()) + off;
848 c = class_define(utfname, cl, len, ptr,
849 (java_handle_t *) protectionDomain);
854 java_handle_t* h = LLNI_classinfo_wrap(c);
856 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
857 // Set ProtectionDomain.
858 java_lang_Class jlc(h);
859 jlc.set_pd(protectionDomain);
867 * Class: sun/misc/Unsafe
868 * Method: allocateInstance
869 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
871 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, jobject _this, jclass cls)
876 c = LLNI_classinfo_unwrap(cls);
885 * Class: sun/misc/Unsafe
886 * Method: throwException
887 * Signature: (Ljava/lang/Throwable;)V
889 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, jobject _this, jobject ee)
893 o = (java_handle_t *) ee;
895 exceptions_set_exception(o);
900 * Class: sun/misc/Unsafe
901 * Method: compareAndSwapObject
902 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
904 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject expected, jobject x)
911 p = (void **) (((uint8_t *) o) + offset);
913 result = Atomic::compare_and_swap(p, (void *) expected, (void *) x);
915 if (result == expected)
923 * Class: sun/misc/Unsafe
924 * Method: compareAndSwapInt
925 * Signature: (Ljava/lang/Object;JII)Z
927 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, jobject _this, jobject o, jlong offset, jint expected, jint x)
934 p = (uint32_t *) (((uint8_t *) o) + offset);
936 result = Atomic::compare_and_swap(p, (uint32_t) expected, (uint32_t) x);
938 if (result == (uint32_t) expected)
946 * Class: sun/misc/Unsafe
947 * Method: compareAndSwapLong
948 * Signature: (Ljava/lang/Object;JJJ)Z
950 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong expected, jlong x)
957 p = (uint64_t *) (((uint8_t *) o) + offset);
959 result = Atomic::compare_and_swap(p, (uint64_t) expected, (uint64_t) x);
961 if (result == (uint64_t) expected)
969 * Class: sun/misc/Unsafe
970 * Method: getObjectVolatile
971 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
973 JNIEXPORT jobject JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
975 return FieldAccess::get_volatile<jobject>(o, offset);
980 * Class: sun/misc/Unsafe
981 * Method: putObjectVolatile
982 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
984 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
986 FieldAccess::set_volatile(o, offset, x);
991 * Class: sun/misc/Unsafe
992 * Method: getBooleanVolatile
993 * Signature: (Ljava/lang/Object;J)Z
995 JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_getBooleanVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
997 return FieldAccess::get_volatile<int32_t>(o, offset);
1002 * Class: sun/misc/Unsafe
1003 * Method: getByteVolatile
1004 * Signature: (Ljava/lang/Object;J)B
1006 JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByteVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
1008 return FieldAccess::get_volatile<int32_t>(o, offset);
1013 * Class: sun/misc/Unsafe
1014 * Method: getShortVolatile
1015 * Signature: (Ljava/lang/Object;J)S
1017 JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShortVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
1019 return FieldAccess::get_volatile<int32_t>(o, offset);
1024 * Class: sun/misc/Unsafe
1025 * Method: getCharVolatile
1026 * Signature: (Ljava/lang/Object;J)C
1028 JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getCharVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
1030 return FieldAccess::get_volatile<int32_t>(o, offset);
1035 * Class: sun/misc/Unsafe
1036 * Method: getIntVolatile
1037 * Signature: (Ljava/lang/Object;J)I
1039 JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1041 return FieldAccess::get_volatile<int32_t>(o, offset);
1046 * Class: sun/misc/Unsafe
1047 * Method: putIntVolatile
1048 * Signature: (Ljava/lang/Object;JI)V
1050 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
1052 FieldAccess::set_volatile(o, offset, x);
1057 * Class: sun/misc/Unsafe
1058 * Method: getLongVolatile
1059 * Signature: (Ljava/lang/Object;J)J
1061 JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1063 return FieldAccess::get_volatile<int64_t>(o, offset);
1068 * Class: sun/misc/Unsafe
1069 * Method: putLongVolatile
1070 * Signature: (Ljava/lang/Object;JJ)V
1072 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
1074 FieldAccess::set_volatile(o, offset, x);
1079 * Class: sun/misc/Unsafe
1080 * Method: getFloatVolatile
1081 * Signature: (Ljava/lang/Object;J)F
1083 JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloatVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset)
1085 return FieldAccess::get_volatile<float>(o, offset);
1090 * Class: sun/misc/Unsafe
1091 * Method: getDoubleVolatile
1092 * Signature: (Ljava/lang/Object;J)D
1094 JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, jobject _this, jobject o, jlong offset)
1096 return FieldAccess::get_volatile<double>(o, offset);
1101 * Class: sun/misc/Unsafe
1102 * Method: putOrderedObject
1103 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1105 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject x)
1107 FieldAccess::set_volatile(o, offset, x);
1112 * Class: sun/misc/Unsafe
1113 * Method: putOrderedInt
1114 * Signature: (Ljava/lang/Object;JI)V
1116 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, jobject _this, jobject o, jlong offset, jint x)
1118 FieldAccess::set_volatile(o, offset, x);
1123 * Class: sun/misc/Unsafe
1124 * Method: putOrderedLong
1125 * Signature: (Ljava/lang/Object;JJ)V
1127 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong x)
1129 FieldAccess::set_volatile(o, offset, x);
1134 * Class: sun/misc/Unsafe
1136 * Signature: (Ljava/lang/Object;)V
1138 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, jobject _this, jobject thread)
1140 java_handle_t *h = (java_handle_t *) thread;
1143 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
1144 h = java_lang_Thread(h).get_vmThread();
1146 t = thread_get_thread(h);
1153 * Class: sun/misc/Unsafe
1157 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, jobject _this, jboolean isAbsolute, jlong time)
1159 threads_park(isAbsolute, time);
1165 /* native methods implemented by this file ************************************/
1167 static JNINativeMethod methods[] = {
1168 { (char*) "registerNatives", (char*) "()V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_registerNatives },
1169 { (char*) "getInt", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
1170 { (char*) "putInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
1171 { (char*) "getObject", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObject },
1172 { (char*) "putObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObject },
1173 { (char*) "getBoolean", (char*) "(Ljava/lang/Object;J)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getBoolean },
1174 { (char*) "putBoolean", (char*) "(Ljava/lang/Object;JZ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putBoolean },
1175 { (char*) "getByte", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
1176 { (char*) "putByte", (char*) "(Ljava/lang/Object;JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
1177 { (char*) "getShort", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
1178 { (char*) "putShort", (char*) "(Ljava/lang/Object;JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
1179 { (char*) "getChar", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
1180 { (char*) "putChar", (char*) "(Ljava/lang/Object;JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
1181 { (char*) "getLong", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
1182 { (char*) "putLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
1183 { (char*) "getFloat", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
1184 { (char*) "putFloat", (char*) "(Ljava/lang/Object;JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
1185 { (char*) "getDouble", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
1186 { (char*) "putDouble", (char*) "(Ljava/lang/Object;JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
1187 { (char*) "getByte", (char*) "(J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__J },
1188 { (char*) "putByte", (char*) "(JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__JB },
1189 { (char*) "getShort", (char*) "(J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__J },
1190 { (char*) "putShort", (char*) "(JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__JS },
1191 { (char*) "getChar", (char*) "(J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__J },
1192 { (char*) "putChar", (char*) "(JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__JC },
1193 { (char*) "getInt", (char*) "(J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__J },
1194 { (char*) "putInt", (char*) "(JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__JI },
1195 { (char*) "getLong", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__J },
1196 { (char*) "putLong", (char*) "(JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
1197 { (char*) "getFloat", (char*) "(J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__J },
1198 { (char*) "putFloat", (char*) "(JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__JF },
1199 { (char*) "getDouble", (char*) "(J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__J },
1200 { (char*) "putDouble", (char*) "(JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDouble__JD },
1201 { (char*) "objectFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
1202 { (char*) "allocateMemory", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateMemory },
1205 { (char*) "setMemory", (char*) "(Ljava/lang/Object;JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1206 { (char*) "copyMemory", (char*) "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1208 { (char*) "setMemory", (char*) "(JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1209 { (char*) "copyMemory", (char*) "(JJJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1211 { (char*) "freeMemory", (char*) "(J)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_freeMemory },
1212 { (char*) "staticFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
1213 { (char*) "staticFieldBase", (char*) "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
1214 { (char*) "ensureClassInitialized", (char*) "(Ljava/lang/Class;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
1215 { (char*) "arrayBaseOffset", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
1216 { (char*) "arrayIndexScale", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
1217 { (char*) "addressSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_addressSize },
1218 { (char*) "pageSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_pageSize },
1219 { (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 },
1220 { (char*) "allocateInstance", (char*) "(Ljava/lang/Class;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateInstance },
1221 { (char*) "throwException", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_throwException },
1222 { (char*) "compareAndSwapObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
1223 { (char*) "compareAndSwapInt", (char*) "(Ljava/lang/Object;JII)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
1224 { (char*) "compareAndSwapLong", (char*) "(Ljava/lang/Object;JJJ)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
1225 { (char*) "getObjectVolatile", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
1226 { (char*) "putObjectVolatile", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
1227 { (char*) "getBooleanVolatile", (char*) "(Ljava/lang/Object;J)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getBooleanVolatile },
1228 { (char*) "getByteVolatile", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByteVolatile },
1229 { (char*) "getShortVolatile", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShortVolatile },
1230 { (char*) "getCharVolatile", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getCharVolatile },
1231 { (char*) "getIntVolatile", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
1232 { (char*) "putIntVolatile", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putIntVolatile },
1233 { (char*) "getLongVolatile", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
1234 { (char*) "putLongVolatile", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLongVolatile },
1235 { (char*) "getFloatVolatile", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloatVolatile },
1236 { (char*) "getDoubleVolatile", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDoubleVolatile },
1237 { (char*) "putOrderedObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedObject },
1238 { (char*) "putOrderedInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedInt },
1239 { (char*) "putOrderedLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedLong },
1240 { (char*) "unpark", (char*) "(Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_unpark },
1241 { (char*) "park", (char*) "(ZJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_park },
1245 /* _Jv_sun_misc_Unsafe_init ****************************************************
1247 Register native functions.
1249 *******************************************************************************/
1251 void _Jv_sun_misc_Unsafe_init(void)
1253 utf* u = utf_new_char("sun/misc/Unsafe");
1255 NativeMethods& nm = VM::get_current()->get_nativemethods();
1256 nm.register_methods(u, methods, NATIVE_METHODS_COUNT);
1261 * These are local overrides for various environment variables in Emacs.
1262 * Please do not remove this and leave it at the end of the file, where
1263 * Emacs will automagically detect them.
1264 * ---------------------------------------------------------------------
1267 * indent-tabs-mode: t
1271 * vim:noexpandtab:sw=4:ts=4: