2 // Copyright Oliver Kowalke 2014.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
7 #include "boost/context/stack_traits.hpp"
13 //#if defined (BOOST_WINDOWS) || _POSIX_C_SOURCE >= 200112L
21 #include <boost/assert.hpp>
22 #include <boost/context/detail/config.hpp>
23 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
24 # include <boost/thread.hpp>
29 #include <boost/context/stack_context.hpp>
32 // test x86_64 before i386 because icc might
33 // define __i686__ for x86_64 too
34 #if defined(__x86_64__) || defined(__x86_64) \
35 || defined(__amd64__) || defined(__amd64) \
36 || defined(_M_X64) || defined(_M_AMD64)
38 // Windows seams not to provide a constant or function
39 // telling the minimal stacksize
40 # define MIN_STACKSIZE 8 * 1024
42 # define MIN_STACKSIZE 4 * 1024
45 #ifdef BOOST_HAS_ABI_HEADERS
46 # include BOOST_ABI_PREFIX
51 void system_info_( SYSTEM_INFO
* si
) BOOST_NOEXCEPT_OR_NOTHROW
{
55 SYSTEM_INFO
system_info() BOOST_NOEXCEPT_OR_NOTHROW
{
56 static SYSTEM_INFO si
;
57 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
58 static boost::once_flag flag
= BOOST_ONCE_INIT
;
59 boost::call_once( flag
, static_cast< void(*)( SYSTEM_INFO
*) >( system_info_
), & si
);
61 static std::once_flag flag
;
62 std::call_once( flag
, static_cast< void(*)( SYSTEM_INFO
*) >( system_info_
), & si
);
67 std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW
{
68 return static_cast< std::size_t >( system_info().dwPageSize
);
71 std::size_t page_count( std::size_t stacksize
) BOOST_NOEXCEPT_OR_NOTHROW
{
72 return static_cast< std::size_t >(
74 static_cast< float >( stacksize
) / pagesize() ) );
82 // Windows seams not to provide a limit for the stacksize
83 // libcoco uses 32k+4k bytes as minimum
86 stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW
{
92 stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW
{
98 stack_traits::default_size() BOOST_NOEXCEPT_OR_NOTHROW
{
99 const std::size_t size
= 64 * 1024; // 64 kB
100 if ( is_unbounded() ) {
101 return (std::max
)( size
, minimum_size() );
103 BOOST_ASSERT( maximum_size() >= minimum_size() );
104 return maximum_size() == minimum_size()
106 : ( std::min
)( size
, maximum_size() );
109 // because Windows seams not to provide a limit for minimum stacksize
112 stack_traits::minimum_size() BOOST_NOEXCEPT_OR_NOTHROW
{
113 return MIN_STACKSIZE
;
116 // because Windows seams not to provide a limit for maximum stacksize
117 // maximum_size() can never be called (pre-condition ! is_unbounded() )
120 stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW
{
121 BOOST_ASSERT( ! is_unbounded() );
122 return 1 * 1024 * 1024 * 1024; // 1GB
127 #ifdef BOOST_HAS_ABI_HEADERS
128 # include BOOST_ABI_SUFFIX