diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2017-09-13 11:08:07 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2017-09-13 11:09:00 +0900 |
commit | b5c87084afaef42b2d058f68091be31988a6a874 (patch) | |
tree | adef9a65870a41181687e11d57fdf98e7629de3c /boost/fiber/detail/cpu_relax.hpp | |
parent | 34bd32e225e2a8a94104489b31c42e5801cc1f4a (diff) | |
download | boost-b5c87084afaef42b2d058f68091be31988a6a874.tar.gz boost-b5c87084afaef42b2d058f68091be31988a6a874.tar.bz2 boost-b5c87084afaef42b2d058f68091be31988a6a874.zip |
Imported Upstream version 1.64.0upstream/1.64.0
Change-Id: Id9212edd016dd55f21172c427aa7894d1d24148b
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'boost/fiber/detail/cpu_relax.hpp')
-rw-r--r-- | boost/fiber/detail/cpu_relax.hpp | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/boost/fiber/detail/cpu_relax.hpp b/boost/fiber/detail/cpu_relax.hpp index d00020a23b..541b46dfd0 100644 --- a/boost/fiber/detail/cpu_relax.hpp +++ b/boost/fiber/detail/cpu_relax.hpp @@ -7,6 +7,7 @@ #ifndef BOOST_FIBERS_DETAIL_CPU_RELAX_H #define BOOST_FIBERS_DETAIL_CPU_RELAX_H +#include <chrono> #include <thread> #include <boost/config.hpp> @@ -14,7 +15,7 @@ #include <boost/fiber/detail/config.hpp> -#if BOOST_COMP_MSVC +#if BOOST_COMP_MSVC || BOOST_COMP_MSVC_EMULATED # include <Windows.h> #endif @@ -29,22 +30,47 @@ namespace detail { #if BOOST_ARCH_ARM # if BOOST_COMP_MSVC # define cpu_relax() YieldProcessor(); -# else +# elif (defined(__ARM_ARCH_6K__) || \ + defined(__ARM_ARCH_6Z__) || \ + defined(__ARM_ARCH_6ZK__) || \ + defined(__ARM_ARCH_6T2__) || \ + defined(__ARM_ARCH_7__) || \ + defined(__ARM_ARCH_7A__) || \ + defined(__ARM_ARCH_7R__) || \ + defined(__ARM_ARCH_7M__) || \ + defined(__ARM_ARCH_7S__) || \ + defined(__ARM_ARCH_8A__) || \ + defined(__aarch64__)) +// http://groups.google.com/a/chromium.org/forum/#!msg/chromium-dev/YGVrZbxYOlU/Vpgy__zeBQAJ +// mnemonic 'yield' is supported from ARMv6k onwards # define cpu_relax() asm volatile ("yield" ::: "memory"); +# else +# define cpu_relax() asm volatile ("nop" ::: "memory"); # endif #elif BOOST_ARCH_MIPS # define cpu_relax() asm volatile ("pause" ::: "memory"); #elif BOOST_ARCH_PPC +// http://code.metager.de/source/xref/gnu/glibc/sysdeps/powerpc/sys/platform/ppc.h +// http://stackoverflow.com/questions/5425506/equivalent-of-x86-pause-instruction-for-ppc +// mnemonic 'or' shared resource hints +// or 27, 27, 27 This form of 'or' provides a hint that performance +// will probably be imrpoved if shared resources dedicated +// to the executing processor are released for use by other +// processors +// extended mnemonics (available with POWER7) +// yield == or 27, 27, 27 # define cpu_relax() asm volatile ("or 27,27,27" ::: "memory"); #elif BOOST_ARCH_X86 -# if BOOST_COMP_MSVC +# if BOOST_COMP_MSVC || BOOST_COMP_MSVC_EMULATED # define cpu_relax() YieldProcessor(); # else # define cpu_relax() asm volatile ("pause" ::: "memory"); # endif #else -# warning "architecture does not support yield/pause mnemonic" -# define cpu_relax() std::this_thread::yield(); +# define cpu_relax() { \ + static constexpr std::chrono::microseconds us0{ 0 }; \ + std::this_thread::sleep_for( us0); \ + } #endif }}} |