|
|
b00be6 |
From 7c6b1e1f5ed08361d3926e672a5a5129ee51c6d3 Mon Sep 17 00:00:00 2001
|
|
|
b00be6 |
From: Hiram Chirino <hiram@hiramchirino.com>
|
|
|
b00be6 |
Date: Mon, 9 Sep 2013 11:31:08 -0400
|
|
|
b00be6 |
Subject: [PATCH 5/5] Should fix issue #7. We now do a write barrier before
|
|
|
b00be6 |
setting the 'cached' field to 1 so that reader don't see this get re-ordered
|
|
|
b00be6 |
before all the fields are readable.
|
|
|
b00be6 |
|
|
|
b00be6 |
---
|
|
|
b00be6 |
.../hawtjni/generator/StructsGenerator.java | 2 ++
|
|
|
b00be6 |
hawtjni-generator/src/main/resources/hawtjni.h | 19 +++++++++++++++++++
|
|
|
b00be6 |
2 files changed, 21 insertions(+)
|
|
|
b00be6 |
|
|
|
b00be6 |
diff --git a/hawtjni-generator/src/main/java/org/fusesource/hawtjni/generator/StructsGenerator.java b/hawtjni-generator/src/main/java/org/fusesource/hawtjni/generator/StructsGenerator.java
|
|
|
b00be6 |
index d8d591e..c12063c 100755
|
|
|
b00be6 |
--- a/hawtjni-generator/src/main/java/org/fusesource/hawtjni/generator/StructsGenerator.java
|
|
|
b00be6 |
+++ b/hawtjni-generator/src/main/java/org/fusesource/hawtjni/generator/StructsGenerator.java
|
|
|
b00be6 |
@@ -240,6 +240,8 @@ public class StructsGenerator extends JNIGenerator {
|
|
|
b00be6 |
output("\"");
|
|
|
b00be6 |
outputln(");");
|
|
|
b00be6 |
}
|
|
|
b00be6 |
+ // Makes sure compiler/cpu does not reorder the following write before the previous updates are done.
|
|
|
b00be6 |
+ outputln("\thawtjni_w_barrier();");
|
|
|
b00be6 |
output("\t");
|
|
|
b00be6 |
output(simpleName);
|
|
|
b00be6 |
outputln("Fc.cached = 1;");
|
|
|
b00be6 |
diff --git a/hawtjni-generator/src/main/resources/hawtjni.h b/hawtjni-generator/src/main/resources/hawtjni.h
|
|
|
b00be6 |
index 79ae703..c8ba601 100755
|
|
|
b00be6 |
--- a/hawtjni-generator/src/main/resources/hawtjni.h
|
|
|
b00be6 |
+++ b/hawtjni-generator/src/main/resources/hawtjni.h
|
|
|
b00be6 |
@@ -168,6 +168,25 @@ void throwOutOfMemory(JNIEnv *env);
|
|
|
b00be6 |
#endif
|
|
|
b00be6 |
#endif /* JNI64 */
|
|
|
b00be6 |
|
|
|
b00be6 |
+#ifdef __GNUC__
|
|
|
b00be6 |
+ #define hawtjni_w_barrier() __sync_synchronize()
|
|
|
b00be6 |
+#elif defined(SOLARIS2) && SOLARIS2 >= 10
|
|
|
b00be6 |
+ #include <mbarrier.h>
|
|
|
b00be6 |
+ #define hawtjni_w_barrier() __machine_w_barrier()
|
|
|
b00be6 |
+#elif defined(__APPLE__)
|
|
|
b00be6 |
+ #include <libkern/OSAtomic.h>
|
|
|
b00be6 |
+ #define hawtjni_w_barrier() OSMemoryBarrier()
|
|
|
b00be6 |
+#elif defined(_WIN32) || defined(_WIN64)
|
|
|
b00be6 |
+ #include <intrin.h>
|
|
|
b00be6 |
+ #define hawtjni_w_barrier() _mm_sfence(); _WriteBarrier()
|
|
|
b00be6 |
+#else
|
|
|
b00be6 |
+ #pragma message ( "Don't know how to do a memory barrier on this platform" )
|
|
|
b00be6 |
+ #define hawtjni_w_barrier()
|
|
|
b00be6 |
+#endif
|
|
|
b00be6 |
+
|
|
|
b00be6 |
+void hawtjni_atomic_set(jlong *target, jlong value);
|
|
|
b00be6 |
+jlong hawtjni_atomic_get(jlong *target);
|
|
|
b00be6 |
+
|
|
|
b00be6 |
#ifdef __cplusplus
|
|
|
b00be6 |
}
|
|
|
b00be6 |
#endif
|
|
|
b00be6 |
--
|
|
|
b00be6 |
1.8.1.4
|
|
|
b00be6 |
|