]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/coroutine/src/windows/stack_traits.cpp
2 // Copyright Oliver Kowalke 2009.
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/coroutine/stack_traits.hpp"
13 //#if defined (BOOST_WINDOWS) || _POSIX_C_SOURCE >= 200112L
21 #include <boost/assert.hpp>
22 #include <boost/coroutine/detail/config.hpp>
23 #include <boost/thread.hpp>
25 #include <boost/coroutine/stack_context.hpp>
28 // test x86_64 before i386 because icc might
29 // define __i686__ for x86_64 too
30 #if defined(__x86_64__) || defined(__x86_64) \
31 || defined(__amd64__) || defined(__amd64) \
32 || defined(_M_X64) || defined(_M_AMD64)
34 // Windows seams not to provide a constant or function
35 // telling the minimal stacksize
36 # define MIN_STACKSIZE 8 * 1024
38 # define MIN_STACKSIZE 4 * 1024
41 #ifdef BOOST_HAS_ABI_HEADERS
42 # include BOOST_ABI_PREFIX
47 void system_info_( SYSTEM_INFO
* si
)
48 { ::GetSystemInfo( si
); }
50 SYSTEM_INFO
system_info()
52 static SYSTEM_INFO si
;
53 static boost::once_flag flag
;
54 boost::call_once( flag
, static_cast< void(*)( SYSTEM_INFO
*) >( system_info_
), & si
);
58 std::size_t pagesize()
59 { return static_cast< std::size_t >( system_info().dwPageSize
); }
61 std::size_t page_count( std::size_t stacksize
)
63 return static_cast< std::size_t >(
65 static_cast< float >( stacksize
) / pagesize() ) );
71 namespace coroutines
{
73 // Windows seams not to provide a limit for the stacksize
74 // libcoco uses 32k+4k bytes as minimum
76 stack_traits::is_unbounded() BOOST_NOEXCEPT
80 stack_traits::page_size() BOOST_NOEXCEPT
81 { return pagesize(); }
84 stack_traits::default_size() BOOST_NOEXCEPT
86 std::size_t size
= 64 * 1024; // 64 kB
88 return (std::max
)( size
, minimum_size() );
90 BOOST_ASSERT( maximum_size() >= minimum_size() );
91 return maximum_size() == minimum_size()
93 : ( std::min
)( size
, maximum_size() );
96 // because Windows seams not to provide a limit for minimum stacksize
98 stack_traits::minimum_size() BOOST_NOEXCEPT
99 { return MIN_STACKSIZE
; }
101 // because Windows seams not to provide a limit for maximum stacksize
102 // maximum_size() can never be called (pre-condition ! is_unbounded() )
104 stack_traits::maximum_size() BOOST_NOEXCEPT
106 BOOST_ASSERT( ! is_unbounded() );
107 return 1 * 1024 * 1024 * 1024; // 1GB
112 #ifdef BOOST_HAS_ABI_HEADERS
113 # include BOOST_ABI_SUFFIX