diff --git a/CMakeLists.txt b/CMakeLists.txt index b4ad27b..6622ac0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,6 @@ target_link_libraries(boost_coroutine Boost::throw_exception Boost::type_traits Boost::utility - PRIVATE - Boost::thread ) target_compile_definitions(boost_coroutine diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index 584edf5..f1a0a4d 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -11,7 +11,6 @@ import toolset ; project boost/coroutine : requirements /boost/context//boost_context - /boost/thread//boost_thread linux,gcc,on:-fsplit-stack linux,gcc,on:-DBOOST_USE_SEGMENTED_STACKS clang,on:-fsplit-stack @@ -39,7 +38,6 @@ lib boost_coroutine exceptions.cpp stack_traits_sources : shared:../../context/build//boost_context - shared:../../thread/build//boost_thread ; boost-install boost_coroutine ; diff --git a/src/posix/stack_traits.cpp b/src/posix/stack_traits.cpp index b629943..7a467b7 100644 --- a/src/posix/stack_traits.cpp +++ b/src/posix/stack_traits.cpp @@ -19,7 +19,7 @@ extern "C" { #include #include -#include +#include #if !defined (SIGSTKSZ) # define SIGSTKSZ (8 * 1024) @@ -32,36 +32,27 @@ extern "C" { namespace { -void pagesize_( std::size_t * size) -{ - // conform to POSIX.1-2001 - * size = ::sysconf( _SC_PAGESIZE); -} - -void stacksize_limit_( rlimit * limit) -{ - // conforming to POSIX.1-2001 -#if defined(BOOST_DISABLE_ASSERTS) || defined(NDEBUG) - ::getrlimit( RLIMIT_STACK, limit); -#else - const int result = ::getrlimit( RLIMIT_STACK, limit); - BOOST_ASSERT( 0 == result); -#endif -} - std::size_t pagesize() { - static std::size_t size = 0; - static boost::once_flag flag; - boost::call_once( flag, pagesize_, & size); - return size; + // conform to POSIX.1-2001 + return ::sysconf( _SC_PAGESIZE); } -rlimit stacksize_limit() +rlim_t stacksize_limit_() { - static rlimit limit; - static boost::once_flag flag; - boost::call_once( flag, stacksize_limit_, & limit); + rlimit limit; + // conforming to POSIX.1-2001 +#if defined(BOOST_DISABLE_ASSERTS) || defined(NDEBUG) + ::getrlimit( RLIMIT_STACK, & limit); +#else + const int result = ::getrlimit( RLIMIT_STACK, & limit); + BOOST_ASSERT( 0 == result); +#endif + return limit.rlim_max; +} + +rlim_t stacksize_limit() BOOST_NOEXCEPT_OR_NOTHROW { + static rlim_t limit = stacksize_limit_(); return limit; } @@ -72,11 +63,14 @@ namespace coroutines { bool stack_traits::is_unbounded() BOOST_NOEXCEPT -{ return RLIM_INFINITY == stacksize_limit().rlim_max; } +{ return RLIM_INFINITY == stacksize_limit(); } std::size_t stack_traits::page_size() BOOST_NOEXCEPT -{ return pagesize(); } +{ + static std::size_t size = pagesize(); + return size; +} std::size_t stack_traits::default_size() BOOST_NOEXCEPT @@ -98,7 +92,7 @@ std::size_t stack_traits::maximum_size() BOOST_NOEXCEPT { BOOST_ASSERT( ! is_unbounded() ); - return static_cast< std::size_t >( stacksize_limit().rlim_max); + return static_cast< std::size_t >( stacksize_limit() ); } }} diff --git a/src/windows/stack_traits.cpp b/src/windows/stack_traits.cpp index bdf417a..a31ebb5 100644 --- a/src/windows/stack_traits.cpp +++ b/src/windows/stack_traits.cpp @@ -20,7 +20,6 @@ extern "C" { #include #include -#include #include @@ -44,25 +43,11 @@ extern "C" { namespace { -void system_info_( SYSTEM_INFO * si) -{ ::GetSystemInfo( si); } - -SYSTEM_INFO system_info() -{ - static SYSTEM_INFO si; - static boost::once_flag flag; - boost::call_once( flag, static_cast< void(*)( SYSTEM_INFO *) >( system_info_), & si); - return si; -} - std::size_t pagesize() -{ return static_cast< std::size_t >( system_info().dwPageSize); } - -std::size_t page_count( std::size_t stacksize) { - return static_cast< std::size_t >( - std::floor( - static_cast< float >( stacksize) / pagesize() ) ); + SYSTEM_INFO si; + ::GetSystemInfo(&si); + return static_cast< std::size_t >( si.dwPageSize ); } } @@ -78,7 +63,10 @@ stack_traits::is_unbounded() BOOST_NOEXCEPT std::size_t stack_traits::page_size() BOOST_NOEXCEPT -{ return pagesize(); } +{ + static std::size_t size = pagesize(); + return size; +} std::size_t stack_traits::default_size() BOOST_NOEXCEPT