r4912 - trunk/varnish-cache/include

phk at varnish-cache.org phk at varnish-cache.org
Sun Jun 6 11:40:49 CEST 2010


Author: phk
Date: 2010-06-06 11:40:49 +0200 (Sun, 06 Jun 2010)
New Revision: 4912

Modified:
   trunk/varnish-cache/include/vmb.h
Log:
Revisit the memory barriers, and try to catch some common platforms
with inline assembler.

I cannot possibly express the magnitude of this particular POSIX FAIL!


Modified: trunk/varnish-cache/include/vmb.h
===================================================================
--- trunk/varnish-cache/include/vmb.h	2010-06-05 22:41:54 UTC (rev 4911)
+++ trunk/varnish-cache/include/vmb.h	2010-06-06 09:40:49 UTC (rev 4912)
@@ -29,6 +29,10 @@
  *
  * Memory barriers
  *
+ * XXX: It is utterly braindamaged, that no standard facility for this
+ * XXX: is available.  The "just use pthreads locking" excuse does not
+ * XXX: make sense, and does not apply to two unthreaded programs sharing
+ * XXX: a memory segment.
  */
 
 #ifndef VMB_H_INCLUDED
@@ -37,15 +41,43 @@
 void vmb_pthread(void);
 
 #if defined(__FreeBSD__)
+
 #include <sys/types.h>
 #include <machine/atomic.h>
-#define VMB()		mb()
-#define VWMB()		wmb()
-#define VRMB()		rmb()
+#define VMB()	mb()
+#define VWMB()	wmb()
+#define VRMB()	rmb()
+
+#elif defined(__amd64__) && defined(__GNUC__)
+
+#define VMB()	__asm __volatile("mfence;" : : : "memory")
+#define VWMB()	__asm __volatile("sfence;" : : : "memory")
+#define VRMB()	__asm __volatile("lfence;" : : : "memory")
+
+#elif defined(__arm__)
+
+#define VMB()	
+#define VWMB()	
+#define VRMB()	
+
+#elif defined(__i386__) && defined(__GNUC__)
+
+#define VMB()	__asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
+#define VWMB()	__asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
+#define VRMB()	__asm __volatile("lock; addl $0,(%%esp)" : : : "memory")
+
+#elif defined(__sparc64__) && defined(__GNUC__)
+
+#define VMB()	__asm__ __volatile__ ("membar #MemIssue": : :"memory")
+#define VWMB()	VMB()
+#define VRMB()	VMB()
+
 #else
-#define VMB()		vmb_pthread()
-#define VWMB()		vmb_pthread()
-#define VRMB()		vmb_pthread()
+
+#define VMB()	vmb_pthread()
+#define VWMB()	vmb_pthread()
+#define VRMB()	vmb_pthread()
+
 #endif
 
 #endif /* VMB_H_INCLUDED */




More information about the varnish-commit mailing list