diff options
Diffstat (limited to 'src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp')
-rw-r--r-- | src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp b/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp deleted file mode 100644 index 220699bae16..00000000000 --- a/src/third_party/boost-1.56.0/boost/interprocess/sync/spin/wait.hpp +++ /dev/null @@ -1,181 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// -// (C) Copyright Peter Dimov 2008. -// (C) Copyright Ion Gaztanaga 2013-2013. Distributed under the Boost -// Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// -// See http://www.boost.org/libs/interprocess for documentation. -// -////////////////////////////////////////////////////////////////////////////// - -//Parts of this file come from boost/smart_ptr/detail/yield_k.hpp -//Many thanks to Peter Dimov. - -#ifndef BOOST_INTERPROCESS_SYNC_WAIT_HPP_INCLUDED -#define BOOST_INTERPROCESS_SYNC_WAIT_HPP_INCLUDED - -#if defined(_MSC_VER) -# pragma once -#endif - -#include <boost/interprocess/detail/config_begin.hpp> -#include <boost/interprocess/detail/workaround.hpp> -#include <boost/interprocess/detail/os_thread_functions.hpp> - -//#define BOOST_INTERPROCESS_SPIN_WAIT_DEBUG -#ifdef BOOST_INTERPROCESS_SPIN_WAIT_DEBUG -#include <iostream> -#endif - -// BOOST_INTERPROCESS_SMT_PAUSE - -#if defined(_MSC_VER) && ( defined(_M_IX86) || defined(_M_X64) ) - -extern "C" void _mm_pause(); -#pragma intrinsic( _mm_pause ) - -#define BOOST_INTERPROCESS_SMT_PAUSE _mm_pause(); - -#elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) ) && !defined(_CRAYC) - -#define BOOST_INTERPROCESS_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" ); - -#endif - -namespace boost{ -namespace interprocess{ -namespace ipcdetail { - -template<int Dummy = 0> -class num_core_holder -{ - public: - static unsigned int get() - { - if(!num_cores){ - return ipcdetail::get_num_cores(); - } - else{ - return num_cores; - } - } - - private: - static unsigned int num_cores; -}; - -template<int Dummy> -unsigned int num_core_holder<Dummy>::num_cores = ipcdetail::get_num_cores(); - -} //namespace ipcdetail { - -class spin_wait -{ - public: - - static const unsigned int nop_pause_limit = 32u; - spin_wait() - : m_count_start(), m_ul_yield_only_counts(), m_k() - {} - - #ifdef BOOST_INTERPROCESS_SPIN_WAIT_DEBUG - ~spin_wait() - { - if(m_k){ - std::cout << "final m_k: " << m_k - << " system tick(us): " << ipcdetail::get_system_tick_us() << std::endl; - } - } - #endif - - unsigned int count() const - { return m_k; } - - void yield() - { - //Lazy initialization of limits - if( !m_k){ - this->init_limits(); - } - //Nop tries - if( m_k < (nop_pause_limit >> 2) ){ - - } - //Pause tries if the processor supports it - #if defined(BOOST_INTERPROCESS_SMT_PAUSE) - else if( m_k < nop_pause_limit ){ - BOOST_INTERPROCESS_SMT_PAUSE - } - #endif - //Yield/Sleep strategy - else{ - //Lazy initialization of tick information - if(m_k == nop_pause_limit){ - this->init_tick_info(); - } - else if( this->yield_or_sleep() ){ - ipcdetail::thread_yield(); - } - else{ - ipcdetail::thread_sleep_tick(); - } - } - ++m_k; - } - - void reset() - { - m_k = 0u; - } - - private: - - void init_limits() - { - unsigned int num_cores = ipcdetail::num_core_holder<0>::get(); - m_k = num_cores > 1u ? 0u : nop_pause_limit; - } - - void init_tick_info() - { - m_ul_yield_only_counts = ipcdetail::get_system_tick_in_highres_counts(); - m_count_start = ipcdetail::get_current_system_highres_count(); - } - - //Returns true if yield must be called, false is sleep must be called - bool yield_or_sleep() - { - if(!m_ul_yield_only_counts){ //If yield-only limit was reached then yield one in every two tries - return (m_k & 1u) != 0; - } - else{ //Try to see if we've reched yield-only time limit - const ipcdetail::OS_highres_count_t now = ipcdetail::get_current_system_highres_count(); - const ipcdetail::OS_highres_count_t elapsed = ipcdetail::system_highres_count_subtract(now, m_count_start); - if(!ipcdetail::system_highres_count_less_ul(elapsed, m_ul_yield_only_counts)){ - #ifdef BOOST_INTERPROCESS_SPIN_WAIT_DEBUG - std::cout << "elapsed!\n" - << " m_ul_yield_only_counts: " << m_ul_yield_only_counts - << " system tick(us): " << ipcdetail::get_system_tick_us() << '\n' - << " m_k: " << m_k << " elapsed counts: "; - ipcdetail::ostream_highres_count(std::cout, elapsed) << std::endl; - #endif - //Yield-only time reached, now it's time to sleep - m_ul_yield_only_counts = 0ul; - return false; - } - } - return true; //Otherwise yield - } - - ipcdetail::OS_highres_count_t m_count_start; - unsigned long m_ul_yield_only_counts; - unsigned int m_k; -}; - -} // namespace interprocess -} // namespace boost - -#include <boost/interprocess/detail/config_end.hpp> - -#endif // #ifndef BOOST_INTERPROCESS_SYNC_WAIT_HPP_INCLUDED |