X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fvm%2Fsun_misc_Unsafe.cpp;h=92c68e4e14661046a6c9e50a2395f372dbca3d58;hb=718f067ca170284f4b195f5fef438bb2561b4068;hp=6c7dc69772954680e1aafd6c0db399803e88c37f;hpb=5d04b5e115ff03f66de55645d385adf74dfb4be2;p=cacao.git diff --git a/src/native/vm/sun_misc_Unsafe.cpp b/src/native/vm/sun_misc_Unsafe.cpp index 6c7dc6977..92c68e4e1 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. @@ -30,7 +30,7 @@ #include "threads/atomic.hpp" -#include "mm/memory.h" +#include "mm/memory.hpp" #include "native/jni.hpp" #include "native/llni.h" @@ -40,9 +40,10 @@ # include "native/include/sun_misc_Unsafe.h" #endif +#include "vm/array.hpp" #include "vm/jit/builtin.hpp" #include "vm/exceptions.hpp" -#include "vm/initialize.h" +#include "vm/initialize.hpp" #include "vm/javaobjects.hpp" #include "vm/os.hpp" #include "vm/string.hpp" @@ -461,6 +462,39 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putFloat__JF(JNIEnv *env, jobject _t } +/* + * Class: sun/misc/Unsafe + * Method: getDouble + * Signature: (J)D + */ +JNIEXPORT jdouble JNICALL Java_sun_misc_Unsafe_getDouble__J(JNIEnv *env, jobject _this, jlong address) +{ + double *p; + double value; + + p = (double*) (intptr_t) address; + + value = *p; + + return value; +} + + +/* + * Class: sun/misc/Unsafe + * Method: putDouble + * Signature: (JD)V + */ +JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putDouble__JD(JNIEnv *env, jobject _this, jlong address, jdouble value) +{ + double* p; + + p = (double*) (intptr_t) address; + + *p = value; +} + + /* * Class: sun/misc/Unsafe * Method: objectFieldOffset @@ -510,7 +544,6 @@ JNIEXPORT jlong JNICALL Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject } -#if 0 /* OpenJDK 7 */ /* @@ -518,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; @@ -545,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; @@ -568,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; @@ -599,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; @@ -620,7 +653,6 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject _thi os::memcpy(dest, src, length); } -#endif /* @@ -792,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; } @@ -808,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) @@ -866,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; @@ -896,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; @@ -919,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; @@ -950,6 +1000,50 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, jobje } +/* + * Class: sun/misc/Unsafe + * Method: getBooleanVolatile + * Signature: (Ljava/lang/Object;J)Z + */ +JNIEXPORT jboolean JNICALL Java_sun_misc_Unsafe_getBooleanVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset) +{ + return FieldAccess::get_volatile(o, offset); +} + + +/* + * Class: sun/misc/Unsafe + * Method: getByteVolatile + * Signature: (Ljava/lang/Object;J)B + */ +JNIEXPORT jbyte JNICALL Java_sun_misc_Unsafe_getByteVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset) +{ + return FieldAccess::get_volatile(o, offset); +} + + +/* + * Class: sun/misc/Unsafe + * Method: getShortVolatile + * Signature: (Ljava/lang/Object;J)S + */ +JNIEXPORT jshort JNICALL Java_sun_misc_Unsafe_getShortVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset) +{ + return FieldAccess::get_volatile(o, offset); +} + + +/* + * Class: sun/misc/Unsafe + * Method: getCharVolatile + * Signature: (Ljava/lang/Object;J)C + */ +JNIEXPORT jchar JNICALL Java_sun_misc_Unsafe_getCharVolatile(JNIEnv* env, jobject _this, jobject o, jlong offset) +{ + return FieldAccess::get_volatile(o, offset); +} + + /* * Class: sun/misc/Unsafe * Method: getIntVolatile @@ -1056,7 +1150,15 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, jobject */ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, jobject _this, jobject thread) { - /* XXX IMPLEMENT ME */ + java_handle_t *h = (java_handle_t *) thread; + threadobject *t; + +#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH) + h = java_lang_Thread(h).get_vmThread(); +#endif + t = thread_get_thread(h); + + threads_unpark(t); } @@ -1067,7 +1169,37 @@ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_unpark(JNIEnv *env, jobject _this, j */ JNIEXPORT void JNICALL Java_sun_misc_Unsafe_park(JNIEnv *env, jobject _this, jboolean isAbsolute, jlong time) { - /* XXX IMPLEMENT ME */ + 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" @@ -1107,16 +1239,16 @@ static JNINativeMethod methods[] = { { (char*) "putLong", (char*) "(JJ)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putLong__JJ }, { (char*) "getFloat", (char*) "(J)F", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getFloat__J }, { (char*) "putFloat", (char*) "(JF)V", (void*) (uintptr_t) &Java_sun_misc_Unsafe_putFloat__JF }, + { (char*) "getDouble", (char*) "(J)D", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getDouble__J }, + { (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 }, @@ -1133,6 +1265,10 @@ static JNINativeMethod methods[] = { { (char*) "compareAndSwapLong", (char*) "(Ljava/lang/Object;JJJ)Z", (void*) (uintptr_t) &Java_sun_misc_Unsafe_compareAndSwapLong }, { (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*) "getByteVolatile", (char*) "(Ljava/lang/Object;J)B", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getByteVolatile }, + { (char*) "getShortVolatile", (char*) "(Ljava/lang/Object;J)S", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getShortVolatile }, + { (char*) "getCharVolatile", (char*) "(Ljava/lang/Object;J)C", (void*) (uintptr_t) &Java_sun_misc_Unsafe_getCharVolatile }, { (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 }, @@ -1144,6 +1280,7 @@ static JNINativeMethod methods[] = { { (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 }, };