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