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
);
76 // Windows seams not to provide a limit for the stacksize
77 // libcoco uses 32k+4k bytes as minimum
80 stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW
{
86 stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW
{
92 stack_traits::default_size() BOOST_NOEXCEPT_OR_NOTHROW
{
96 // because Windows seams not to provide a limit for minimum stacksize
99 stack_traits::minimum_size() BOOST_NOEXCEPT_OR_NOTHROW
{
100 return MIN_STACKSIZE
;
103 // because Windows seams not to provide a limit for maximum stacksize
104 // maximum_size() can never be called (pre-condition ! is_unbounded() )
107 stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW
{
108 BOOST_ASSERT( ! is_unbounded() );
109 return 1 * 1024 * 1024 * 1024; // 1GB
114 #ifdef BOOST_HAS_ABI_HEADERS
115 # include BOOST_ABI_SUFFIX