* barrier. In practice, on machines with strong memory ordering, read and
* write barriers may require nothing more than a compiler barrier.
*
+ * A dependency barrier need do nothing at all, except on machines that
+ * allow dependent loads to be reordered. On such machines, it must be defined
+ * as a read barrier.
+ *
* For an introduction to using memory barriers within the PostgreSQL backend,
* see src/backend/storage/lmgr/README.barrier
*/
/*
* Unlike all other known architectures, Alpha allows dependent reads to be
- * reordered, but we don't currently find it necessary to provide a conditional
- * read barrier to cover that case. We might need to add that later.
+ * reordered, so we define pg_read_barrier_depends() as pg_read_barrier().
*/
#define pg_memory_barrier() __asm__ __volatile__ ("mb" : : : "memory")
#define pg_read_barrier() __asm__ __volatile__ ("rmb" : : : "memory")
+#define pg_read_barrier_depends() pg_read_barrier()
#define pg_write_barrier() __asm__ __volatile__ ("wmb" : : : "memory")
+
#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
/*
#define pg_write_barrier() pg_memory_barrier()
#endif
+/*
+ * If dependency barriers are undefined, we define them as a no-op. The only
+ * known platform where anything more is required is DEC Alpha.
+ */
+#if !defined(pg_read_barrier_depends)
+#define pg_read_barrier_depends()
+#endif
+
#endif /* BARRIER_H */