]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/context/src/windows/stack_traits.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / context / src / windows / stack_traits.cpp
CommitLineData
7c673cae
FG
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
9extern "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
49namespace {
50
51void system_info_( SYSTEM_INFO * si) BOOST_NOEXCEPT_OR_NOTHROW {
52 ::GetSystemInfo( si);
53}
54
55SYSTEM_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
67std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW {
68 return static_cast< std::size_t >( system_info().dwPageSize);
69}
70
7c673cae
FG
71}
72
73namespace boost {
74namespace context {
75
76// Windows seams not to provide a limit for the stacksize
77// libcoco uses 32k+4k bytes as minimum
78BOOST_CONTEXT_DECL
79bool
80stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW {
81 return true;
82}
83
84BOOST_CONTEXT_DECL
85std::size_t
86stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW {
87 return pagesize();
88}
89
90BOOST_CONTEXT_DECL
91std::size_t
92stack_traits::default_size() BOOST_NOEXCEPT_OR_NOTHROW {
b32b8144 93 return 128 * 1024;
7c673cae
FG
94}
95
96// because Windows seams not to provide a limit for minimum stacksize
97BOOST_CONTEXT_DECL
98std::size_t
99stack_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() )
105BOOST_CONTEXT_DECL
106std::size_t
107stack_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