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"
11 #include <sys/resource.h>
16 //#if _POSIX_C_SOURCE >= 200112L
21 #include <boost/assert.hpp>
22 #include <boost/config.hpp>
23 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
24 # include <boost/thread.hpp>
29 #if !defined (SIGSTKSZ)
30 # define SIGSTKSZ (32768) // 32kb minimum allowable stack
31 # define UDEF_SIGSTKSZ
34 #if !defined (MINSIGSTKSZ)
35 # define MINSIGSTKSZ (131072) // 128kb recommended stack size
36 # define UDEF_MINSIGSTKSZ
39 #ifdef BOOST_HAS_ABI_HEADERS
40 # include BOOST_ABI_PREFIX
45 void pagesize_( std::size_t * size
) BOOST_NOEXCEPT_OR_NOTHROW
{
46 // conform to POSIX.1-2001
47 * size
= ::sysconf( _SC_PAGESIZE
);
50 void stacksize_limit_( rlimit
* limit
) BOOST_NOEXCEPT_OR_NOTHROW
{
51 // conforming to POSIX.1-2001
52 ::getrlimit( RLIMIT_STACK
, limit
);
55 std::size_t pagesize() BOOST_NOEXCEPT_OR_NOTHROW
{
56 static std::size_t size
= 0;
57 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
58 static boost::once_flag flag
= BOOST_ONCE_INIT
;
59 boost::call_once( flag
, pagesize_
, & size
);
61 static std::once_flag flag
;
62 std::call_once( flag
, pagesize_
, & size
);
67 rlimit
stacksize_limit() BOOST_NOEXCEPT_OR_NOTHROW
{
69 #if defined(BOOST_NO_CXX11_HDR_MUTEX)
70 static boost::once_flag flag
= BOOST_ONCE_INIT
;
71 boost::call_once( flag
, stacksize_limit_
, & limit
);
73 static std::once_flag flag
;
74 std::call_once( flag
, stacksize_limit_
, & limit
);
85 stack_traits::is_unbounded() BOOST_NOEXCEPT_OR_NOTHROW
{
86 return RLIM_INFINITY
== stacksize_limit().rlim_max
;
90 stack_traits::page_size() BOOST_NOEXCEPT_OR_NOTHROW
{
95 stack_traits::default_size() BOOST_NOEXCEPT_OR_NOTHROW
{
100 stack_traits::minimum_size() BOOST_NOEXCEPT_OR_NOTHROW
{
105 stack_traits::maximum_size() BOOST_NOEXCEPT_OR_NOTHROW
{
106 BOOST_ASSERT( ! is_unbounded() );
107 return static_cast< std::size_t >( stacksize_limit().rlim_max
);
112 #ifdef BOOST_HAS_ABI_HEADERS
113 # include BOOST_ABI_SUFFIX
120 #ifdef UDEF_MINSIGSTKSZ