]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/context/src/posix/stack_traits.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / context / src / posix / 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 <signal.h>
11 #include <sys/resource.h>
12 #include <sys/time.h>
13 #include <unistd.h>
14 }
15
16 //#if _POSIX_C_SOURCE >= 200112L
17
18 #include <algorithm>
19 #include <cmath>
20
21 #include <boost/assert.hpp>
22 #include <boost/config.hpp>
23 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
24 # include <boost/thread.hpp>
25 #else
26 # include <mutex>
27 #endif
28
29 #if !defined (SIGSTKSZ)
30 # define SIGSTKSZ (8 * 1024)
31 # define UDEF_SIGSTKSZ
32 #endif
33
34 #ifdef BOOST_HAS_ABI_HEADERS
35 # include BOOST_ABI_PREFIX
36 #endif
37
38 namespace {
39
40 void pagesize_( std::size_t * size) BOOST_NOEXCEPT_OR_NOTHROW {
41 // conform to POSIX.1-2001
42 * size = ::sysconf( _SC_PAGESIZE);
43 }
44
45 void stacksize_limit_( rlimit * limit) BOOST_NOEXCEPT_OR_NOTHROW {
46 // conforming to POSIX.1-2001
47 ::getrlimit( RLIMIT_STACK, limit);
48 }
49
50 std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW {
51 static std::size_t size = 0;
52 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
53 static boost::once_flag flag = BOOST_ONCE_INIT;
54 boost::call_once( flag, pagesize_, & size);
55 #else
56 static std::once_flag flag;
57 std::call_once( flag, pagesize_, & size);
58 #endif
59 return size;
60 }
61
62 rlimit stacksize_limit() BOOST_NOEXCEPT_OR_NOTHROW {
63 static rlimit limit;
64 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
65 static boost::once_flag flag = BOOST_ONCE_INIT;
66 boost::call_once( flag, stacksize_limit_, & limit);
67 #else
68 static std::once_flag flag;
69 std::call_once( flag, stacksize_limit_, & limit);
70 #endif
71 return limit;
72 }
73
74 }
75
76 namespace boost {
77 namespace context {
78
79 bool
80 stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW {
81 return RLIM_INFINITY == stacksize_limit().rlim_max;
82 }
83
84 std::size_t
85 stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW {
86 return pagesize();
87 }
88
89 std::size_t
90 stack_traits::default_size() BOOST_NOEXCEPT_OR_NOTHROW {
91 std::size_t size = 8 * minimum_size();
92 if ( is_unbounded() ) {
93 return size;
94 }
95
96 BOOST_ASSERT( maximum_size() >= minimum_size() );
97 return maximum_size() == size
98 ? size
99 : (std::min)( size, maximum_size() );
100 }
101
102 std::size_t
103 stack_traits::minimum_size() BOOST_NOEXCEPT_OR_NOTHROW {
104 return SIGSTKSZ;
105 }
106
107 std::size_t
108 stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW {
109 BOOST_ASSERT( ! is_unbounded() );
110 return static_cast< std::size_t >( stacksize_limit().rlim_max);
111 }
112
113 }}
114
115 #ifdef BOOST_HAS_ABI_HEADERS
116 # include BOOST_ABI_SUFFIX
117 #endif
118
119 #ifdef UDEF_SIGSTKSZ
120 # undef SIGSTKSZ
121 #endif