X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fvm%2Fsun_misc_Unsafe.cpp;h=e17e68fbc29ab5e5640266eb73928103c00b94f6;hb=48e1fa7fe2caaf6240d24e7bb85e1a3b1d23d2b5;hp=a6c86a6daa8550c3e799ef774a7556a7123c4a73;hpb=b433e644233ad2ba8f1bd0056cb150489b82aa82;p=cacao.git diff --git a/src/native/vm/sun_misc_Unsafe.cpp b/src/native/vm/sun_misc_Unsafe.cpp index a6c86a6da..e17e68fbc 100644 --- a/src/native/vm/sun_misc_Unsafe.cpp +++ b/src/native/vm/sun_misc_Unsafe.cpp @@ -1,6 +1,6 @@ /* src/native/vm/sun_misc_Unsafe.cpp - sun/misc/Unsafe - Copyright (C) 2006, 2007, 2008 + Copyright (C) 2006, 2007, 2008, 2009, 2010 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -40,6 +40,7 @@ # include "native/include/sun_misc_Unsafe.h" #endif +#include "vm/array.hpp" #include "vm/jit/builtin.hpp" #include "vm/exceptions.hpp" #include "vm/initialize.hpp" @@ -543,7 +544,6 @@ JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject } -#if 0 /* OpenJDK 7 */ /* @@ -551,7 +551,7 @@ JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject * Method: setMemory * Signature: (Ljava/lang/Object;JJB)V */ -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong bytes, jbyte value) +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory_jdk7(JNIEnv *env, jobject _this, jobject o, jlong offset, jlong bytes, jbyte value) { size_t length; void *p; @@ -578,7 +578,7 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this * Method: copyMemory * Signature: (Ljava/lang/Object;JLjava/lang/Object;JJ)V */ -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jobject srcBase, jlong srcOffset, jobject destBase, jlong destOffset, jlong bytes) +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory_jdk7(JNIEnv *env, jobject _this, jobject srcBase, jlong srcOffset, jobject destBase, jlong destOffset, jlong bytes) { size_t length; void *src; @@ -601,13 +601,13 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _thi os::memcpy(dest, src, length); } -#else + /* * Class: sun/misc/Unsafe * Method: setMemory * Signature: (JJB)V */ -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this, jlong address, jlong bytes, jbyte value) +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory_jdk6(JNIEnv *env, jobject _this, jlong address, jlong bytes, jbyte value) { size_t length; void *p; @@ -632,7 +632,7 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject _this * Method: copyMemory * Signature: (JJJ)V */ -JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _this, jlong srcAddress, jlong destAddress, jlong bytes) +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory_jdk6(JNIEnv *env, jobject _this, jlong srcAddress, jlong destAddress, jlong bytes) { size_t length; void *src; @@ -653,7 +653,6 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _thi os::memcpy(dest, src, length); } -#endif /* @@ -825,7 +824,9 @@ JNIEXPORT jclass JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3 /* check the indexes passed */ - if ((off < 0) || (len < 0) || ((off + len) > LLNI_array_size(b))) { + ByteArray ba(b); + + if ((off < 0) || (len < 0) || ((off + len) > ba.get_length())) { exceptions_throw_arrayindexoutofboundsexception(); return NULL; } @@ -841,7 +842,8 @@ JNIEXPORT jclass JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3 /* define the class */ - c = class_define(utfname, cl, len, (uint8_t *) &(LLNI_array_direct((java_handle_bytearray_t*) b, off)), + uint8_t* ptr = ((uint8_t*) ba.get_raw_data_ptr()) + off; + c = class_define(utfname, cl, len, ptr, (java_handle_t *) protectionDomain); if (c == NULL) @@ -899,14 +901,19 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_throwException(JNIEnv *env, jobject */ JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, jobject _this, jobject o, jlong offset, jobject expected, jobject x) { - volatile void **p; + void **p; void *result; /* XXX Use LLNI */ - p = (volatile void **) (((uint8_t *) o) + offset); + p = (void **) (((uint8_t *) o) + offset); - result = Atomic::compare_and_swap(p, expected, x); + result = Atomic::compare_and_swap(p, (void *) expected, (void *) x); +#if defined(CAS_PROVIDES_FULL_BARRIER) && CAS_PROVIDES_FULL_BARRIER + Atomic::instruction_barrier(); +#else + Atomic::memory_barrier(); +#endif if (result == expected) return true; @@ -929,7 +936,12 @@ JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, j p = (uint32_t *) (((uint8_t *) o) + offset); - result = Atomic::compare_and_swap(p, expected, x); + result = Atomic::compare_and_swap(p, (uint32_t) expected, (uint32_t) x); +#if defined(CAS_PROVIDES_FULL_BARRIER) && CAS_PROVIDES_FULL_BARRIER + Atomic::instruction_barrier(); +#else + Atomic::memory_barrier(); +#endif if (result == (uint32_t) expected) return true; @@ -952,7 +964,12 @@ JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, p = (uint64_t *) (((uint8_t *) o) + offset); - result = Atomic::compare_and_swap(p, expected, x); + result = Atomic::compare_and_swap(p, (uint64_t) expected, (uint64_t) x); +#if defined(CAS_PROVIDES_FULL_BARRIER) && CAS_PROVIDES_FULL_BARRIER + Atomic::instruction_barrier(); +#else + Atomic::memory_barrier(); +#endif if (result == (uint64_t) expected) return true; @@ -994,6 +1011,17 @@ JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_getBooleanVolatile(JNIEnv* env, } +/* + * Class: sun/misc/Unsafe + * Method: putBooleanVolatile + * Signature: (Ljava/lang/Object;JZ)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putBooleanVolatile (JNIEnv *env, jobject _this, jobject o, jlong offset, jboolean x) +{ + FieldAccess::set_volatile(o, offset, x); +} + + /* * Class: sun/misc/Unsafe * Method: getByteVolatile @@ -1005,6 +1033,17 @@ JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByteVolatile(JNIEnv* env, jobjec } +/* + * Class: sun/misc/Unsafe + * Method: putByteVolatile + * Signature: (Ljava/lang/Object;JB)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putByteVolatile (JNIEnv *env, jobject _this, jobject o, jlong offset, jbyte x) +{ + FieldAccess::set_volatile(o, offset, x); +} + + /* * Class: sun/misc/Unsafe * Method: getShortVolatile @@ -1016,6 +1055,17 @@ JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShortVolatile(JNIEnv* env, jobj } +/* + * Class: sun/misc/Unsafe + * Method: putShortVolatile + * Signature: (Ljava/lang/Object;JS)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putShortVolatile (JNIEnv *env, jobject _this, jobject o, jlong offset, jshort x) +{ + FieldAccess::set_volatile(o, offset, x); +} + + /* * Class: sun/misc/Unsafe * Method: getCharVolatile @@ -1027,6 +1077,17 @@ JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getCharVolatile(JNIEnv* env, jobjec } +/* + * Class: sun/misc/Unsafe + * Method: putCharVolatile + * Signature: (Ljava/lang/Object;JC)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putCharVolatile (JNIEnv *env, jobject _this, jobject o, jlong offset, jchar x) +{ + FieldAccess::set_volatile(o, offset, x); +} + + /* * Class: sun/misc/Unsafe * Method: getIntVolatile @@ -1082,6 +1143,17 @@ JNIEXPORT jfloat JNICALL Java_sun_misc_Unsafe_getFloatVolatile(JNIEnv* env, jobj } +/* + * Class: sun/misc/Unsafe + * Method: putFloatVolatile + * Signature: (Ljava/lang/Object;JF)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloatVolatile (JNIEnv *env, jobject _this, jobject o, jlong offset, jfloat x) +{ + FieldAccess::set_volatile(o, offset, x); +} + + /* * Class: sun/misc/Unsafe * Method: getDoubleVolatile @@ -1093,6 +1165,17 @@ JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, jo } +/* + * Class: sun/misc/Unsafe + * Method: putDoubleVolatile + * Signature: (Ljava/lang/Object;JD)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDoubleVolatile (JNIEnv *env, jobject _this, jobject o, jlong offset, jdouble x) +{ + FieldAccess::set_volatile(o, offset, x); +} + + /* * Class: sun/misc/Unsafe * Method: putOrderedObject @@ -1155,6 +1238,36 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, jobject _this, jbo threads_park(isAbsolute, time); } + +/* + * Class: sun/misc/Unsafe + * Method: getLoadAverage + * Signature: ([DI)I + */ +JNIEXPORT jint JNICALL Java_sun_misc_Unsafe_getLoadAverage(JNIEnv *env, jobject _this, jdoubleArray loadavg, jint nelem) +{ + DoubleArray da(loadavg); + +#define MAX_SAMPLES 3 + + // Check the passed number of samples. + if ((nelem < 0) || (nelem > da.get_length()) || nelem > MAX_SAMPLES) { + exceptions_throw_arrayindexoutofboundsexception(); + return -1; + } + + // Actually retrieve samples. + double values[MAX_SAMPLES]; + int result = os::getloadavg(values, nelem); + + // Save samples into the given array. + for (int i = 0; i < result; i++) { + da.set_element(i, values[i]); + } + + return result; +} + } // extern "C" @@ -1196,14 +1309,12 @@ static JNINativeMethod methods[] = { { (char*) "putDouble", (char*) "(JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDouble__JD }, { (char*) "objectFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_objectFieldOffset }, { (char*) "allocateMemory", (char*) "(J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_allocateMemory }, -#if 0 - // OpenJDK 7 - { (char*) "setMemory", (char*) "(Ljava/lang/Object;JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory }, - { (char*) "copyMemory", (char*) "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory }, -#else - { (char*) "setMemory", (char*) "(JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory }, - { (char*) "copyMemory", (char*) "(JJJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory }, -#endif + // next two methods: OpenJDK 7 + { (char*) "setMemory", (char*) "(Ljava/lang/Object;JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory_jdk7 }, + { (char*) "copyMemory", (char*) "(Ljava/lang/Object;JLjava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory_jdk7 }, + // next two methods: OpenJDK 6 + { (char*) "setMemory", (char*) "(JJB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_setMemory_jdk6 }, + { (char*) "copyMemory", (char*) "(JJJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_copyMemory_jdk6 }, { (char*) "freeMemory", (char*) "(J)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_freeMemory }, { (char*) "staticFieldOffset", (char*) "(Ljava/lang/reflect/Field;)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldOffset }, { (char*) "staticFieldBase", (char*) "(Ljava/lang/reflect/Field;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_staticFieldBase }, @@ -1221,20 +1332,27 @@ static JNINativeMethod methods[] = { { (char*) "getObjectVolatile", (char*) "(Ljava/lang/Object;J)Ljava/lang/Object;", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getObjectVolatile }, { (char*) "putObjectVolatile", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putObjectVolatile }, { (char*) "getBooleanVolatile", (char*) "(Ljava/lang/Object;J)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getBooleanVolatile }, + { (char*) "putBooleanVolatile", (char*) "(Ljava/lang/Object;JZ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putBooleanVolatile }, { (char*) "getByteVolatile", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByteVolatile }, + { (char*) "putByteVolatile", (char*) "(Ljava/lang/Object;JB)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putByteVolatile }, { (char*) "getShortVolatile", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShortVolatile }, + { (char*) "putShortVolatile", (char*) "(Ljava/lang/Object;JS)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putShortVolatile }, { (char*) "getCharVolatile", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getCharVolatile }, + { (char*) "putCharVolatile", (char*) "(Ljava/lang/Object;JC)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putCharVolatile }, { (char*) "getIntVolatile", (char*) "(Ljava/lang/Object;J)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getIntVolatile }, { (char*) "putIntVolatile", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putIntVolatile }, { (char*) "getLongVolatile", (char*) "(Ljava/lang/Object;J)J", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLongVolatile }, { (char*) "putLongVolatile", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLongVolatile }, { (char*) "getFloatVolatile", (char*) "(Ljava/lang/Object;J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloatVolatile }, + { (char*) "putFloatVolatile", (char*) "(Ljava/lang/Object;JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloatVolatile }, { (char*) "getDoubleVolatile", (char*) "(Ljava/lang/Object;J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDoubleVolatile }, + { (char*) "putDoubleVolatile", (char*) "(Ljava/lang/Object;JD)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putDoubleVolatile }, { (char*) "putOrderedObject", (char*) "(Ljava/lang/Object;JLjava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedObject }, { (char*) "putOrderedInt", (char*) "(Ljava/lang/Object;JI)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedInt }, { (char*) "putOrderedLong", (char*) "(Ljava/lang/Object;JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putOrderedLong }, { (char*) "unpark", (char*) "(Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_unpark }, { (char*) "park", (char*) "(ZJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_park }, + { (char*) "getLoadAverage", (char*) "([DI)I", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getLoadAverage }, };