X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu.c;fp=urcu.c;h=5ffeb79553b6374f0fb1a607b3862ed78dda63e2;hp=e77306584d77f0fc012f6bfbae466452b3556b74;hb=64f469e628fe45059f091f2808188fb52fa109c9;hpb=2917c006f87be3f55bd7ba2119d7fbc79f7677d7 diff --git a/urcu.c b/urcu.c index e773065..5ffeb79 100644 --- a/urcu.c +++ b/urcu.c @@ -77,9 +77,10 @@ # define membarrier(...) -ENOSYS #endif -#define MEMBARRIER_EXPEDITED (1 << 0) -#define MEMBARRIER_DELAYED (1 << 1) -#define MEMBARRIER_QUERY (1 << 16) +enum membarrier_cmd { + MEMBARRIER_CMD_QUERY = 0, + MEMBARRIER_CMD_SHARED = (1 << 0), +}; #ifdef RCU_MEMBARRIER static int init_done; @@ -167,7 +168,7 @@ static void mutex_unlock(pthread_mutex_t *mutex) static void smp_mb_master(int group) { if (caa_likely(rcu_has_sys_membarrier)) - (void) membarrier(MEMBARRIER_EXPEDITED); + (void) membarrier(MEMBARRIER_CMD_SHARED, 0); else cmm_smp_mb(); } @@ -514,11 +515,15 @@ void rcu_unregister_thread(void) #ifdef RCU_MEMBARRIER void rcu_init(void) { + int ret; + if (init_done) return; init_done = 1; - if (!membarrier(MEMBARRIER_EXPEDITED | MEMBARRIER_QUERY)) + ret = membarrier(MEMBARRIER_CMD_QUERY, 0); + if (ret >= 0 && (ret & MEMBARRIER_CMD_SHARED)) { rcu_has_sys_membarrier = 1; + } } #endif