Blame SOURCES/0005-Should-fix-issue-7.-We-now-do-a-write-barrier-before.patch

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