+ if (!available)
+ abort();
+}
+#else
+static
+void rcu_sys_membarrier_status(bool available)
+{
+ if (!available)
+ return;
+ rcu_has_sys_membarrier_memb = 1;
+}
+#endif
+
+static
+void rcu_sys_membarrier_init(void)
+{
+ bool available = false;
+ int mask;
+
+ mask = membarrier(MEMBARRIER_CMD_QUERY, 0);
+ if (mask >= 0) {
+ if (mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) {
+ if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0))
+ urcu_die(errno);
+ has_sys_membarrier_private_expedited = 1;
+ available = true;
+ } else if (mask & MEMBARRIER_CMD_SHARED) {
+ available = true;
+ }
+ }
+ rcu_sys_membarrier_status(available);
+}