diff options
Diffstat (limited to 'boost/asio/detail/gcc_x86_fenced_block.hpp')
-rw-r--r-- | boost/asio/detail/gcc_x86_fenced_block.hpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/boost/asio/detail/gcc_x86_fenced_block.hpp b/boost/asio/detail/gcc_x86_fenced_block.hpp index b416b50d52..973165ab1e 100644 --- a/boost/asio/detail/gcc_x86_fenced_block.hpp +++ b/boost/asio/detail/gcc_x86_fenced_block.hpp @@ -40,17 +40,17 @@ public: // Constructor for a full fenced block. explicit gcc_x86_fenced_block(full_t) { - barrier1(); + lbarrier(); } // Destructor. ~gcc_x86_fenced_block() { - barrier2(); + sbarrier(); } private: - static int barrier1() + static int barrier() { int r = 0, m = 1; __asm__ __volatile__ ( @@ -61,12 +61,21 @@ private: return r; } - static void barrier2() + static void lbarrier() { #if defined(__SSE2__) - __asm__ __volatile__ ("mfence" ::: "memory"); + __asm__ __volatile__ ("lfence" ::: "memory"); #else // defined(__SSE2__) - barrier1(); + barrier(); +#endif // defined(__SSE2__) + } + + static void sbarrier() + { +#if defined(__SSE2__) + __asm__ __volatile__ ("sfence" ::: "memory"); +#else // defined(__SSE2__) + barrier(); #endif // defined(__SSE2__) } }; |