summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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 3f53ec13300..f57e6723017 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 be04ed3c123..b1a9a6a7cc7 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