summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund2015-01-11 00:15:29 +0000
committerAndres Freund2015-01-11 00:15:29 +0000
commitde6429a8fdd3538e977b482d90389785d733e373 (patch)
treed123c851dadbdc024fc315483a551bc04322a962
parentdb4ec2ffce3549225619cae51d828224a11a165f (diff)
Provide a generic fallback for pg_compiler_barrier using an extern function.
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: [email protected] Per report from Tom Lane.
-rw-r--r--src/backend/port/atomics.c8
-rw-r--r--src/include/port/atomics/fallback.h16
2 files changed, 24 insertions, 0 deletions
diff --git a/src/backend/port/atomics.c b/src/backend/port/atomics.c
index 3f53ec1330..f57e672301 100644
--- a/src/backend/port/atomics.c
+++ b/src/backend/port/atomics.c
@@ -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
diff --git a/src/include/port/atomics/fallback.h b/src/include/port/atomics/fallback.h
index be04ed3c12..b1a9a6a7cc 100644
--- a/src/include/port/atomics/fallback.h
+++ b/src/include/port/atomics/fallback.h
@@ -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