Provide a generic fallback for pg_compiler_barrier using an extern function.
authorAndres Freund <andres@anarazel.de>
Sun, 11 Jan 2015 00:15:29 +0000 (01:15 +0100)
committerAndres Freund <andres@anarazel.de>
Sun, 11 Jan 2015 00:15:29 +0000 (01:15 +0100)
If the compiler/arch combination does not provide compiler barriers,
provide a fallback. That fallback simply consists out of a function
call into a externally defined function.  That should guarantee
compiler barrierer semantics except for compilers that do inter
translation unit/global optimization - those better provide an actual
compiler barrier.

Hopefully this fixes Tom's report of linker failures due to
pg_compiler_barrier_impl not being provided.

I'm not backpatching this commit as it builds on the new atomics
infrastructure. If we decide an equivalent fix needs to be
backpatched, I'll do so in a separate commit.

Discussion: 27746.1420930690@sss.pgh.pa.us

Per report from Tom Lane.

src/backend/port/atomics.c
src/include/port/atomics/fallback.h

index 3f53ec13300ca687fa7fc6edb1ac30fbc0b21c2d..f57e6723017560147d1348efe2161191a5c51b53 100644 (file)
@@ -32,6 +32,14 @@ pg_spinlock_barrier(void)
 }
 #endif
 
+#ifdef PG_HAVE_COMPILER_BARRIER_EMULATION
+void
+pg_extern_compiler_barrier(void)
+{
+   /* do nothing */
+}
+#endif
+
 
 #ifdef PG_HAVE_ATOMIC_FLAG_SIMULATION
 
index be04ed3c123f2e46b8409b8964a42e0de6c5bba4..b1a9a6a7cc743bbe291c0faec402cbbfd9367099 100644 (file)
@@ -35,6 +35,22 @@ extern void pg_spinlock_barrier(void);
 #define pg_memory_barrier_impl pg_spinlock_barrier
 #endif
 
+#ifndef pg_compiler_barrier_impl
+/*
+ * If the compiler/arch combination does not provide compiler barriers,
+ * provide a fallback. That fallback simply consists out of a function call
+ * into a externally defined function.  That should guarantee compiler barrier
+ * semantics except for compilers that do inter translation unit/global
+ * optimization - those better provide an actual compiler barrier.
+ *
+ * Using a native compiler barrier for sure is a lot faster than this...
+ */
+#define PG_HAVE_COMPILER_BARRIER_EMULATION
+extern void pg_extern_compiler_barrier(void);
+#define pg_compiler_barrier_impl pg_extern_compiler_barrier
+#endif
+
+
 /*
  * If we have atomics implementation for this platform fall back to providing
  * the atomics API using a spinlock to protect the internal state. Possibly