merged volatile memory barriers
[cacao.git] / src / native / jni.cpp
index 3fe39b495c38c1f267202653e61ddef56dfb2ddc..6e850fd2bac0db539175b06ad3fe7c06ea6b6b8a 100644 (file)
@@ -2069,6 +2069,8 @@ jobject _Jv_JNI_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID)
 #define SET_FIELD(o,type,f,value) \
     *((type *) (((intptr_t) (o)) + ((intptr_t) ((fieldinfo *) (f))->offset))) = (type) (value)
 
+#define GET_FIELDINFO(f) ((fieldinfo*) (f))
+
 #define JNI_SET_FIELD(name, type, intern)                                  \
 void _Jv_JNI_Set##name##Field(JNIEnv *env, jobject obj, jfieldID fieldID,  \
                                                          type value)                                  \
@@ -2080,6 +2082,9 @@ void _Jv_JNI_Set##name##Field(JNIEnv *env, jobject obj, jfieldID fieldID,  \
        SET_FIELD(LLNI_DIRECT((java_handle_t *) obj), intern, fieldID, value); \
                                                                               \
        LLNI_CRITICAL_END;                                                     \
+                                                                                                                                                  \
+       if (GET_FIELDINFO(fieldID)->flags & ACC_VOLATILE)                      \
+               Atomic::memory_barrier();                                          \
 }
 
 JNI_SET_FIELD(Boolean, jboolean, s4)
@@ -2102,6 +2107,9 @@ void _Jv_JNI_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID,
        SET_FIELD(obj, java_handle_t*, fieldID, LLNI_UNWRAP((java_handle_t*) value));
 
        LLNI_CRITICAL_END;
+
+       if (GET_FIELDINFO(fieldID)->flags & ACC_VOLATILE)
+               Atomic::memory_barrier();
 }
 
 
@@ -2439,6 +2447,9 @@ void _Jv_JNI_SetStatic##name##Field(JNIEnv *env, jclass clazz, \
                        return;                                            \
                                                                \
        f->value->field = value;                                   \
+                                                                                                                          \
+       if (f->flags & ACC_VOLATILE)                               \
+               Atomic::memory_barrier();                              \
 }
 
 JNI_SET_STATIC_FIELD(Boolean, jboolean, i)
@@ -2467,6 +2478,9 @@ void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID,
                        return;
 
        f->value->a = LLNI_UNWRAP((java_handle_t *) value);
+
+       if (f->flags & ACC_VOLATILE)
+               Atomic::memory_barrier();
 }
 
 
@@ -2876,7 +2890,7 @@ void _Jv_JNI_Release##name##ArrayElements(JNIEnv *env, type##Array array,  \
 }
 
 JNI_RELEASE_ARRAY_ELEMENTS(Boolean, jboolean, boolean, u1)
-JNI_RELEASE_ARRAY_ELEMENTS(Byte,    jbyte,    byte,    int8_t)
+JNI_RELEASE_ARRAY_ELEMENTS(Byte,    jbyte,    byte,    s1)
 JNI_RELEASE_ARRAY_ELEMENTS(Char,    jchar,    char,    u2)
 JNI_RELEASE_ARRAY_ELEMENTS(Short,   jshort,   short,   s2)
 JNI_RELEASE_ARRAY_ELEMENTS(Int,     jint,     int,     s4)
@@ -2907,7 +2921,7 @@ void _Jv_JNI_Get##name##ArrayRegion(JNIEnv *env, type##Array array,     \
 }
 
 JNI_GET_ARRAY_REGION(Boolean, jboolean, boolean, u1)
-JNI_GET_ARRAY_REGION(Byte,    jbyte,    byte,    int8_t)
+JNI_GET_ARRAY_REGION(Byte,    jbyte,    byte,    s1)
 JNI_GET_ARRAY_REGION(Char,    jchar,    char,    u2)
 JNI_GET_ARRAY_REGION(Short,   jshort,   short,   s2)
 JNI_GET_ARRAY_REGION(Int,     jint,     int,     s4)
@@ -2938,7 +2952,7 @@ void _Jv_JNI_Set##name##ArrayRegion(JNIEnv *env, type##Array array,          \
 }
 
 JNI_SET_ARRAY_REGION(Boolean, jboolean, boolean, u1)
-JNI_SET_ARRAY_REGION(Byte,    jbyte,    byte,    int8_t)
+JNI_SET_ARRAY_REGION(Byte,    jbyte,    byte,    s1)
 JNI_SET_ARRAY_REGION(Char,    jchar,    char,    u2)
 JNI_SET_ARRAY_REGION(Short,   jshort,   short,   s2)
 JNI_SET_ARRAY_REGION(Int,     jint,     int,     s4)
@@ -2965,14 +2979,10 @@ jint jni_RegisterNatives(JNIEnv* env, jclass clazz, const JNINativeMethod* metho
 
        classinfo* c = LLNI_classinfo_unwrap(clazz);
 
-       /* XXX: if implemented this needs a call to jvmti_NativeMethodBind
-       if (jvmti) jvmti_NativeMethodBind(method, address,  new_address_ptr);
-       */
-
        NativeMethods& nm = VM::get_current()->get_nativemethods();
        nm.register_methods(c->name, methods, nMethods);
 
-    return 0;
+       return 0;
 }