提交 1153b3c3 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

get rid of mfence instructions around atomic loads: not necessary on x86.

get rid of __sync_synchronize in gc_begin_epoch, since a LOCK instruction acts as an mfence. useful ref: http://www.cl.cam.ac.uk/~pes20/weakmemory/cacm.pdf
上级 d7defe8f
#pragma once #pragma once
#if 0
#define __sync_synchronize() do { __asm__ __volatile__("" ::: "memory"); } while (0)
#endif
#define _GLIBCXX_VISIBILITY(x) #define _GLIBCXX_VISIBILITY(x)
#define _GLIBCXX_BEGIN_NAMESPACE_VERSION #define _GLIBCXX_BEGIN_NAMESPACE_VERSION
#define _GLIBCXX_END_NAMESPACE_VERSION #define _GLIBCXX_END_NAMESPACE_VERSION
......
...@@ -284,9 +284,9 @@ namespace __atomic2 ...@@ -284,9 +284,9 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release); __glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel); __glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize(); // __sync_synchronize();
__int_type __ret = _M_i; __int_type __ret = _M_i;
__sync_synchronize(); // __sync_synchronize();
return __ret; return __ret;
} }
...@@ -296,9 +296,9 @@ namespace __atomic2 ...@@ -296,9 +296,9 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release); __glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel); __glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize(); // __sync_synchronize();
__int_type __ret = _M_i; __int_type __ret = _M_i;
__sync_synchronize(); // __sync_synchronize();
return __ret; return __ret;
} }
...@@ -576,9 +576,9 @@ namespace __atomic2 ...@@ -576,9 +576,9 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release); __glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel); __glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize(); // __sync_synchronize();
__pointer_type __ret = _M_p; __pointer_type __ret = _M_p;
__sync_synchronize(); // __sync_synchronize();
return __ret; return __ret;
} }
...@@ -588,9 +588,9 @@ namespace __atomic2 ...@@ -588,9 +588,9 @@ namespace __atomic2
__glibcxx_assert(__m != memory_order_release); __glibcxx_assert(__m != memory_order_release);
__glibcxx_assert(__m != memory_order_acq_rel); __glibcxx_assert(__m != memory_order_acq_rel);
__sync_synchronize(); // __sync_synchronize();
__pointer_type __ret = _M_p; __pointer_type __ret = _M_p;
__sync_synchronize(); // __sync_synchronize();
return __ret; return __ret;
} }
......
...@@ -183,7 +183,8 @@ gc_begin_epoch(void) ...@@ -183,7 +183,8 @@ gc_begin_epoch(void)
return; return;
cmpxch(&myproc()->epoch, v+1, (global_epoch.load()<<8)+1); cmpxch(&myproc()->epoch, v+1, (global_epoch.load()<<8)+1);
// __sync_synchronize(); // We effectively need an mfence here, and cmpxch provides one
// by virtue of being a LOCK instuction.
} }
void void
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论