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 #include "native/include/java_lang_Object.h" /* before c.l.C */
40 #include "native/include/java_lang_String.h" /* required by j.l.CL */
42 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
43 # include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
46 #include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
47 #include "native/include/java_lang_Class.h"
48 #include "native/include/java_lang_reflect_Field.h"
49 #include "native/include/java_lang_Thread.h" /* required by s.m.U */
50 #include "native/include/java_lang_Throwable.h"
52 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
53 # include "native/include/java_lang_reflect_VMField.h"
56 #include "native/include/java_security_ProtectionDomain.h" /* required by smU */
60 #include "native/include/sun_misc_Unsafe.h"
63 #include "vm/builtin.h"
64 #include "vm/exceptions.hpp"
65 #include "vm/initialize.h"
66 #include "vm/stringlocal.h"
68 #include "vmcore/system.h"
69 #include "vmcore/utf8.h"
72 // Native functions are exported as C functions.
76 * Class: sun/misc/Unsafe
77 * Method: registerNatives
80 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass clazz)
82 /* The native methods of this function are already registered in
83 _Jv_sun_misc_Unsafe_init() which is called during VM
89 * Class: sun/misc/Unsafe
91 * Signature: (Ljava/lang/Object;J)I
93 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
98 p = (int32_t *) (((uint8_t *) o) + offset);
107 * Class: sun/misc/Unsafe
109 * Signature: (Ljava/lang/Object;JI)V
111 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
115 p = (int32_t *) (((uint8_t *) o) + offset);
122 * Class: sun/misc/Unsafe
124 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
126 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
131 p = (void **) (((uint8_t *) o) + offset);
135 return (java_lang_Object*) value;
140 * Class: sun/misc/Unsafe
142 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
144 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObject(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
148 p = (void **) (((uint8_t *) o) + offset);
155 * Class: sun/misc/Unsafe
157 * Signature: (Ljava/lang/Object;J)Z
159 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
164 p = (int32_t *) (((uint8_t *) o) + offset);
173 * Class: sun/misc/Unsafe
175 * Signature: (Ljava/lang/Object;JZ)V
177 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
181 p = (int32_t *) (((uint8_t *) o) + offset);
188 * Class: sun/misc/Unsafe
190 * Signature: (Ljava/lang/Object;J)B
192 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
197 p = (int32_t *) (((uint8_t *) o) + offset);
206 * Class: sun/misc/Unsafe
208 * Signature: (Ljava/lang/Object;JB)V
210 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
214 p = (int32_t *) (((uint8_t *) o) + offset);
221 * Class: sun/misc/Unsafe
223 * Signature: (Ljava/lang/Object;J)S
225 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
230 p = (int32_t *) (((uint8_t *) o) + offset);
239 * Class: sun/misc/Unsafe
241 * Signature: (Ljava/lang/Object;JS)V
243 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
247 p = (int32_t *) (((uint8_t *) o) + offset);
254 * Class: sun/misc/Unsafe
256 * Signature: (Ljava/lang/Object;J)C
258 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
263 p = (int32_t *) (((uint8_t *) o) + offset);
272 * Class: sun/misc/Unsafe
274 * Signature: (Ljava/lang/Object;JC)V
276 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
280 p = (int32_t *) (((uint8_t *) o) + offset);
287 * Class: sun/misc/Unsafe
289 * Signature: (Ljava/lang/Object;J)J
291 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
296 p = (int64_t *) (((uint8_t *) o) + offset);
305 * Class: sun/misc/Unsafe
307 * Signature: (Ljava/lang/Object;JJ)V
309 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int64_t x)
313 p = (int64_t *) (((uint8_t *) o) + offset);
320 * Class: sun/misc/Unsafe
322 * Signature: (Ljava/lang/Object;J)F
324 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
329 p = (float *) (((uint8_t *) o) + offset);
338 * Class: sun/misc/Unsafe
340 * Signature: (Ljava/lang/Object;JF)V
342 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, float x)
346 p = (float *) (((uint8_t *) o) + offset);
353 * Class: sun/misc/Unsafe
355 * Signature: (Ljava/lang/Object;J)D
357 JNIEXPORT double JNICALL Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
362 p = (double *) (((uint8_t *) o) + offset);
371 * Class: sun/misc/Unsafe
373 * Signature: (Ljava/lang/Object;JD)V
375 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, double x)
379 p = (double *) (((uint8_t *) o) + offset);
386 * Class: sun/misc/Unsafe
390 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
395 p = (int8_t *) (intptr_t) address;
399 return (int32_t) value;
404 * Class: sun/misc/Unsafe
408 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address, int32_t value)
412 p = (int8_t *) (intptr_t) address;
419 * Class: sun/misc/Unsafe
423 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
428 p = (int16_t *) (intptr_t) address;
432 return (int32_t) value;
437 * Class: sun/misc/Unsafe
441 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address, int32_t value)
445 p = (int16_t *) (intptr_t) address;
447 *p = (int16_t) value;
452 * Class: sun/misc/Unsafe
456 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
461 p = (uint16_t *) (intptr_t) address;
465 return (int32_t) value;
470 * Class: sun/misc/Unsafe
474 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address, int32_t value)
478 p = (uint16_t *) (intptr_t) address;
480 *p = (uint16_t) value;
485 * Class: sun/misc/Unsafe
489 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
494 p = (int32_t *) (intptr_t) address;
503 * Class: sun/misc/Unsafe
507 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, struct sun_misc_Unsafe* _this, int64_t address, int32_t value)
511 p = (int32_t *) (intptr_t) address;
518 * Class: sun/misc/Unsafe
522 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
527 p = (int64_t *) (intptr_t) address;
536 * Class: sun/misc/Unsafe
540 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address, int64_t value)
544 p = (int64_t *) (intptr_t) address;
551 * Class: sun/misc/Unsafe
555 JNIEXPORT float JNICALL Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
560 p = (float *) (intptr_t) address;
569 * Class: sun/misc/Unsafe
573 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__JF(JNIEnv *env, struct sun_misc_Unsafe* __this, int64_t address, float value)
577 p = (float*) (intptr_t) address;
584 * Class: sun/misc/Unsafe
585 * Method: objectFieldOffset
586 * Signature: (Ljava/lang/reflect/Field;)J
588 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_reflect_Field *field)
594 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
595 java_lang_reflect_VMField *rvmf;
598 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
600 LLNI_field_get_ref(field, f, rvmf);
601 LLNI_field_get_cls(rvmf, clazz, c);
602 LLNI_field_get_val(rvmf, slot , slot);
604 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
606 LLNI_field_get_cls(field, clazz, c);
607 LLNI_field_get_val(field, slot , slot);
610 # error unknown configuration
613 f = &(c->fields[slot]);
615 return (int64_t) f->offset;
620 * Class: sun/misc/Unsafe
621 * Method: allocateMemory
624 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, sun_misc_Unsafe *_this, int64_t bytes)
629 length = (size_t) bytes;
631 if ((length != (uint64_t) bytes) || (bytes < 0)) {
632 exceptions_throw_illegalargumentexception();
636 p = MNEW(uint8_t, length);
638 return (int64_t) (intptr_t) p;
646 * Class: sun/misc/Unsafe
648 * Signature: (Ljava/lang/Object;JJB)V
650 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int64_t bytes, int32_t value)
655 length = (size_t) bytes;
657 if ((length != (uint64_t) bytes) || (bytes < 0)) {
658 exceptions_throw_illegalargumentexception();
662 /* XXX Missing LLNI: we need to unwrap _this object. */
664 p = (void *) (((uint8_t *) o) + offset);
666 /* XXX Not sure this is correct. */
668 system_memset(p, value, length);
673 * Class: sun/misc/Unsafe
675 * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V
677 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *srcBase, int64_t srcOffset, java_lang_Object *destBase, int64_t destOffset, int64_t bytes)
686 length = (size_t) bytes;
688 if ((length != (uint64_t) bytes) || (bytes < 0)) {
689 exceptions_throw_illegalargumentexception();
693 /* XXX Missing LLNI: We need to unwrap these objects. */
695 src = (void *) (((uint8_t *) srcBase) + srcOffset);
696 dest = (void *) (((uint8_t *) destBase) + destOffset);
698 system_memcpy(dest, src, length);
702 * Class: sun/misc/Unsafe
706 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address, int64_t bytes, int32_t value)
711 length = (size_t) bytes;
713 if ((length != (uint64_t) bytes) || (bytes < 0)) {
714 exceptions_throw_illegalargumentexception();
718 p = (void *) (intptr_t) address;
720 /* XXX Not sure this is correct. */
722 system_memset(p, value, length);
727 * Class: sun/misc/Unsafe
731 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, sun_misc_Unsafe *_this, int64_t srcAddress, int64_t destAddress, int64_t bytes)
740 length = (size_t) bytes;
742 if ((length != (uint64_t) bytes) || (bytes < 0)) {
743 exceptions_throw_illegalargumentexception();
747 src = (void *) (intptr_t) srcAddress;
748 dest = (void *) (intptr_t) destAddress;
750 system_memcpy(dest, src, length);
756 * Class: sun/misc/Unsafe
760 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, sun_misc_Unsafe *_this, int64_t address)
764 p = (void *) (intptr_t) address;
769 /* we pass length 1 to trick the free function */
771 MFREE(p, uint8_t, 1);
776 * Class: sun/misc/Unsafe
777 * Method: staticFieldOffset
778 * Signature: (Ljava/lang/reflect/Field;)J
780 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_reflect_Field *f)
782 /* The offset of static fields is 0. */
789 * Class: sun/misc/Unsafe
790 * Method: staticFieldBase
791 * Signature: (Ljava/lang/reflect/Field;)Ljava/lang/Object;
793 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_reflect_Field *rf)
799 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
800 java_lang_reflect_VMField *rvmf;
803 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
805 LLNI_field_get_ref(rf, f, rvmf);
806 LLNI_field_get_cls(rvmf, clazz, c);
807 LLNI_field_get_val(rvmf, slot , slot);
809 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
811 LLNI_field_get_cls(rf, clazz, c);
812 LLNI_field_get_val(rf, slot , slot);
815 # error unknown configuration
818 f = &(c->fields[slot]);
820 return (java_lang_Object *) (f->value);
825 * Class: sun/misc/Unsafe
826 * Method: ensureClassInitialized
827 * Signature: (Ljava/lang/Class;)V
829 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Class *clazz)
833 c = LLNI_classinfo_unwrap(clazz);
835 if (!(c->state & CLASS_INITIALIZED))
841 * Class: sun/misc/Unsafe
842 * Method: arrayBaseOffset
843 * Signature: (Ljava/lang/Class;)I
845 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Class *arrayClass)
850 c = LLNI_classinfo_unwrap(arrayClass);
851 ad = c->vftbl->arraydesc;
854 /* XXX does that exception exist? */
855 exceptions_throw_internalerror("java/lang/InvalidClassException");
859 return ad->dataoffset;
864 * Class: sun/misc/Unsafe
865 * Method: arrayIndexScale
866 * Signature: (Ljava/lang/Class;)I
868 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Class *arrayClass)
873 c = LLNI_classinfo_unwrap(arrayClass);
874 ad = c->vftbl->arraydesc;
877 /* XXX does that exception exist? */
878 exceptions_throw_internalerror("java/lang/InvalidClassException");
882 return ad->componentsize;
887 * Class: sun/misc/Unsafe
888 * Method: addressSize
891 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc_Unsafe *_this)
893 return SIZEOF_VOID_P;
898 * Class: sun/misc/Unsafe
902 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_pageSize(JNIEnv *env, sun_misc_Unsafe *_this)
913 * Class: sun/misc/Unsafe
914 * Method: defineClass
915 * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
917 JNIEXPORT java_lang_Class* JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_String *name, java_handle_bytearray_t *b, int32_t off, int32_t len, java_lang_ClassLoader *loader, java_security_ProtectionDomain *protectionDomain)
924 cl = loader_hashtable_classloader_add((java_handle_t *) loader);
926 /* check if data was passed */
929 exceptions_throw_nullpointerexception();
933 /* check the indexes passed */
935 if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) {
936 exceptions_throw_arrayindexoutofboundsexception();
941 /* convert '.' to '/' in java string */
943 utfname = javastring_toutf((java_handle_t *) name, true);
949 /* define the class */
951 c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct(b, off)),
952 (java_handle_t *) protectionDomain);
957 /* for convenience */
959 o = LLNI_classinfo_wrap(c);
961 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
962 /* set ProtectionDomain */
964 LLNI_field_set_ref(o, pd, protectionDomain);
972 * Class: sun/misc/Unsafe
973 * Method: allocateInstance
974 * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
976 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Class *cls)
981 c = LLNI_classinfo_unwrap(cls);
985 return (java_lang_Object *) o;
990 * Class: sun/misc/Unsafe
991 * Method: throwException
992 * Signature: (Ljava/lang/Throwable;)V
994 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Throwable *ee)
998 o = (java_handle_t *) ee;
1000 exceptions_set_exception(o);
1005 * Class: sun/misc/Unsafe
1006 * Method: compareAndSwapObject
1007 * Signature: (Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z
1009 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, java_lang_Object *expected, java_lang_Object *x)
1016 p = (volatile void **) (((uint8_t *) o) + offset);
1018 result = Atomic::compare_and_swap(p, expected, x);
1020 if (result == expected)
1028 * Class: sun/misc/Unsafe
1029 * Method: compareAndSwapInt
1030 * Signature: (Ljava/lang/Object;JII)Z
1032 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, sun_misc_Unsafe* _this, java_lang_Object* o, int64_t offset, int32_t expected, int32_t x)
1039 p = (uint32_t *) (((uint8_t *) o) + offset);
1041 result = Atomic::compare_and_swap(p, expected, x);
1043 if (result == (uint32_t) expected)
1051 * Class: sun/misc/Unsafe
1052 * Method: compareAndSwapLong
1053 * Signature: (Ljava/lang/Object;JJJ)Z
1055 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int64_t expected, int64_t x)
1062 p = (uint64_t *) (((uint8_t *) o) + offset);
1064 result = Atomic::compare_and_swap(p, expected, x);
1066 if (result == (uint64_t) expected)
1074 * Class: sun/misc/Unsafe
1075 * Method: getObjectVolatile
1076 * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
1078 JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
1081 volatile void *value;
1083 p = (volatile void **) (((uint8_t *) o) + offset);
1087 return (java_lang_Object *) value;
1092 * Class: sun/misc/Unsafe
1093 * Method: putObjectVolatile
1094 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1096 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
1100 p = (volatile void **) (((uint8_t *) o) + offset);
1106 #define UNSAFE_GET_VOLATILE(type) \
1107 java_handle_t *_h; \
1108 java_object_t *_o; \
1109 volatile type *_p; \
1112 _h = (java_handle_t *) o; \
1114 LLNI_CRITICAL_START; \
1116 _o = LLNI_UNWRAP(_h); \
1117 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1121 LLNI_CRITICAL_END; \
1126 #define UNSAFE_PUT_VOLATILE(type) \
1127 java_handle_t *_h; \
1128 java_object_t *_o; \
1129 volatile type *_p; \
1131 _h = (java_handle_t *) o; \
1133 LLNI_CRITICAL_START; \
1135 _o = LLNI_UNWRAP(_h); \
1136 _p = (volatile type *) (((uint8_t *) _o) + offset); \
1140 Atomic::memory_barrier(); \
1146 * Class: sun/misc/Unsafe
1147 * Method: getIntVolatile
1148 * Signature: (Ljava/lang/Object;J)I
1150 JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
1152 UNSAFE_GET_VOLATILE(int32_t);
1157 * Class: sun/misc/Unsafe
1158 * Method: putIntVolatile
1159 * Signature: (Ljava/lang/Object;JI)V
1161 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
1163 UNSAFE_PUT_VOLATILE(int32_t);
1168 * Class: sun/misc/Unsafe
1169 * Method: getLongVolatile
1170 * Signature: (Ljava/lang/Object;J)J
1172 JNIEXPORT int64_t JNICALL Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset)
1174 UNSAFE_GET_VOLATILE(int64_t);
1179 * Class: sun/misc/Unsafe
1180 * Method: putLongVolatile
1181 * Signature: (Ljava/lang/Object;JJ)V
1183 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int64_t x)
1185 UNSAFE_PUT_VOLATILE(int64_t);
1190 * Class: sun/misc/Unsafe
1191 * Method: getDoubleVolatile
1192 * Signature: (Ljava/lang/Object;J)D
1194 JNIEXPORT double JNICALL Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, sun_misc_Unsafe* __this, java_lang_Object* o, int64_t offset)
1196 UNSAFE_GET_VOLATILE(double);
1201 * Class: sun/misc/Unsafe
1202 * Method: putOrderedObject
1203 * Signature: (Ljava/lang/Object;JLjava/lang/Object;)V
1205 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedObject(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, java_lang_Object *x)
1213 _h = (java_handle_t *) o;
1214 _hx = (java_handle_t *) x;
1216 LLNI_CRITICAL_START;
1218 _o = LLNI_UNWRAP(_h);
1219 _x = LLNI_UNWRAP(_hx);
1220 _p = (volatile void **) (((uint8_t *) _o) + offset);
1224 Atomic::memory_barrier();
1231 * Class: sun/misc/Unsafe
1232 * Method: putOrderedInt
1233 * Signature: (Ljava/lang/Object;JI)V
1235 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int32_t x)
1237 UNSAFE_PUT_VOLATILE(int32_t);
1242 * Class: sun/misc/Unsafe
1243 * Method: putOrderedLong
1244 * Signature: (Ljava/lang/Object;JJ)V
1246 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *o, int64_t offset, int64_t x)
1248 UNSAFE_PUT_VOLATILE(int64_t);
1253 * Class: sun/misc/Unsafe
1255 * Signature: (Ljava/lang/Object;)V
1257 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, sun_misc_Unsafe *_this, java_lang_Object *thread)
1259 /* XXX IMPLEMENT ME */
1264 * Class: sun/misc/Unsafe
1268 JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, sun_misc_Unsafe *_this, int32_t isAbsolute, int64_t time)
1270 /* XXX IMPLEMENT ME */
1276 /* native methods implemented by this file ************************************/
1278 static JNINativeMethod methods[] = {
1279 { (char*) "registerNatives", (char*) "()V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_registerNatives },
1280 { (char*) "getInt", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J },
1281 { (char*) "putInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI },
1282 { (char*) "getObject", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObject },
1283 { (char*) "putObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObject },
1284 { (char*) "getBoolean", (char*) "(Ljava/lang/Object;J)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getBoolean },
1285 { (char*) "putBoolean", (char*) "(Ljava/lang/Object;JZ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putBoolean },
1286 { (char*) "getByte", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J },
1287 { (char*) "putByte", (char*) "(Ljava/lang/Object;JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB },
1288 { (char*) "getShort", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J },
1289 { (char*) "putShort", (char*) "(Ljava/lang/Object;JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS },
1290 { (char*) "getChar", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J },
1291 { (char*) "putChar", (char*) "(Ljava/lang/Object;JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC },
1292 { (char*) "getLong", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J },
1293 { (char*) "putLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ },
1294 { (char*) "getFloat", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J },
1295 { (char*) "putFloat", (char*) "(Ljava/lang/Object;JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF },
1296 { (char*) "getDouble", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J },
1297 { (char*) "putDouble", (char*) "(Ljava/lang/Object;JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD },
1298 { (char*) "getByte", (char*) "(J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByte__J },
1299 { (char*) "putByte", (char*) "(JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByte__JB },
1300 { (char*) "getShort", (char*) "(J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShort__J },
1301 { (char*) "putShort", (char*) "(JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShort__JS },
1302 { (char*) "getChar", (char*) "(J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getChar__J },
1303 { (char*) "putChar", (char*) "(JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putChar__JC },
1304 { (char*) "getInt", (char*) "(J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getInt__J },
1305 { (char*) "putInt", (char*) "(JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putInt__JI },
1306 { (char*) "getLong", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLong__J },
1307 { (char*) "putLong", (char*) "(JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__JJ },
1308 { (char*) "getFloat", (char*) "(J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__J },
1309 { (char*) "putFloat", (char*) "(JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__JF },
1310 { (char*) "objectFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_objectFieldOffset },
1311 { (char*) "allocateMemory", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateMemory },
1314 { (char*) "setMemory", (char*) "(Ljava/lang/Object;JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1315 { (char*) "copyMemory", (char*) "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1317 { (char*) "setMemory", (char*) "(JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory },
1318 { (char*) "copyMemory", (char*) "(JJJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory },
1320 { (char*) "freeMemory", (char*) "(J)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_freeMemory },
1321 { (char*) "staticFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldOffset },
1322 { (char*) "staticFieldBase", (char*) "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldBase },
1323 { (char*) "ensureClassInitialized", (char*) "(Ljava/lang/Class;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_ensureClassInitialized },
1324 { (char*) "arrayBaseOffset", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset },
1325 { (char*) "arrayIndexScale", (char*) "(Ljava/lang/Class;)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_arrayIndexScale },
1326 { (char*) "addressSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_addressSize },
1327 { (char*) "pageSize", (char*) "()I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_pageSize },
1328 { (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 },
1329 { (char*) "allocateInstance", (char*) "(Ljava/lang/Class;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateInstance },
1330 { (char*) "throwException", (char*) "(Ljava/lang/Throwable;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_throwException },
1331 { (char*) "compareAndSwapObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject },
1332 { (char*) "compareAndSwapInt", (char*) "(Ljava/lang/Object;JII)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt },
1333 { (char*) "compareAndSwapLong", (char*) "(Ljava/lang/Object;JJJ)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong },
1334 { (char*) "getObjectVolatile", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObjectVolatile },
1335 { (char*) "putObjectVolatile", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObjectVolatile },
1336 { (char*) "getIntVolatile", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getIntVolatile },
1337 { (char*) "putIntVolatile", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putIntVolatile },
1338 { (char*) "getLongVolatile", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLongVolatile },
1339 { (char*) "putLongVolatile", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLongVolatile },
1340 { (char*) "getDoubleVolatile", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDoubleVolatile },
1341 { (char*) "putOrderedObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedObject },
1342 { (char*) "putOrderedInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedInt },
1343 { (char*) "putOrderedLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedLong },
1344 { (char*) "unpark", (char*) "(Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_unpark },
1345 { (char*) "park", (char*) "(ZJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_park },
1349 /* _Jv_sun_misc_Unsafe_init ****************************************************
1351 Register native functions.
1353 *******************************************************************************/
1357 void _Jv_sun_misc_Unsafe_init(void)
1361 u = utf_new_char("sun/misc/Unsafe");
1363 native_method_register(u, methods, NATIVE_METHODS_COUNT);
1368 * These are local overrides for various environment variables in Emacs.
1369 * Please do not remove this and leave it at the end of the file, where
1370 * Emacs will automagically detect them.
1371 * ---------------------------------------------------------------------
1374 * indent-tabs-mode: t