]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/context/src/windows/stack_traits.cpp
14016b1b3a4956a76764f398a7d58fd74ecc10da
[ceph.git] / ceph / src / boost / libs / context / src / windows / stack_traits.cpp
1
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)
6
7 #include "boost/context/stack_traits.hpp"
8
9 extern "C" {
10 #include <windows.h>
11 }
12
13 //#if defined (BOOST_WINDOWS) || _POSIX_C_SOURCE >= 200112L
14
15 #include <algorithm>
16 #include <cmath>
17 #include <cstddef>
18 #include <cstring>
19 #include <stdexcept>
20
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>
25 #else
26 # include <mutex>
27 #endif
28
29 #include <boost/context/stack_context.hpp>
30
31 // x86_64
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)
37
38 // Windows seams not to provide a constant or function
39 // telling the minimal stacksize
40 # define MIN_STACKSIZE 8 * 1024
41 #else
42 # define MIN_STACKSIZE 4 * 1024
43 #endif
44
45 #ifdef BOOST_HAS_ABI_HEADERS
46 # include BOOST_ABI_PREFIX
47 #endif
48
49 namespace {
50
51 void system_info_( SYSTEM_INFO * si) BOOST_NOEXCEPT_OR_NOTHROW {
52 ::GetSystemInfo( si);
53 }
54
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);
60 #else
61 static std::once_flag flag;
62 std::call_once( flag, static_cast< void(*)( SYSTEM_INFO *) >( system_info_), & si);
63 #endif
64 return si;
65 }
66
67 std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW {
68 return static_cast< std::size_t >( system_info().dwPageSize);
69 }
70
71 }
72
73 namespace boost {
74 namespace context {
75
76 // Windows seams not to provide a limit for the stacksize
77 // libcoco uses 32k+4k bytes as minimum
78 BOOST_CONTEXT_DECL
79 bool
80 stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW {
81 return true;
82 }
83
84 BOOST_CONTEXT_DECL
85 std::size_t
86 stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW {
87 return pagesize();
88 }
89
90 BOOST_CONTEXT_DECL
91 std::size_t
92 stack_traits::default_size() BOOST_NOEXCEPT_OR_NOTHROW {
93 return 128 * 1024;
94 }
95
96 // because Windows seams not to provide a limit for minimum stacksize
97 BOOST_CONTEXT_DECL
98 std::size_t
99 stack_traits::minimum_size() BOOST_NOEXCEPT_OR_NOTHROW {
100 return MIN_STACKSIZE;
101 }
102
103 // because Windows seams not to provide a limit for maximum stacksize
104 // maximum_size() can never be called (pre-condition ! is_unbounded() )
105 BOOST_CONTEXT_DECL
106 std::size_t
107 stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW {
108 BOOST_ASSERT( ! is_unbounded() );
109 return 1 * 1024 * 1024 * 1024; // 1GB
110 }
111
112 }}
113
114 #ifdef BOOST_HAS_ABI_HEADERS
115 # include BOOST_ABI_SUFFIX
116 #endif