summaryrefslogtreecommitdiff
path: root/libs/context/src/posix/stack_traits.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/context/src/posix/stack_traits.cpp')
-rw-r--r--libs/context/src/posix/stack_traits.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/libs/context/src/posix/stack_traits.cpp b/libs/context/src/posix/stack_traits.cpp
new file mode 100644
index 000000000..83b54a746
--- /dev/null
+++ b/libs/context/src/posix/stack_traits.cpp
@@ -0,0 +1,110 @@
+
+// Copyright Oliver Kowalke 2014.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include "boost/context/stack_traits.hpp"
+
+extern "C" {
+#include <signal.h>
+#include <sys/resource.h>
+#include <sys/time.h>
+#include <unistd.h>
+}
+
+//#if _POSIX_C_SOURCE >= 200112L
+
+#include <algorithm>
+#include <cmath>
+
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+# include <boost/thread.hpp>
+
+#if !defined (SIGSTKSZ)
+# define SIGSTKSZ (8 * 1024)
+# define UDEF_SIGSTKSZ
+#endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_PREFIX
+#endif
+
+namespace boost {
+namespace context {
+
+void pagesize_( std::size_t * size)
+{
+ // conform to POSIX.1-2001
+ * size = ::sysconf( _SC_PAGESIZE);
+}
+
+void stacksize_limit_( rlimit * limit)
+{
+ // conforming to POSIX.1-2001
+#if defined(BOOST_DISABLE_ASSERTS)
+ ::getrlimit( RLIMIT_STACK, limit);
+#else
+ const int result = ::getrlimit( RLIMIT_STACK, limit);
+ BOOST_ASSERT( 0 == result);
+ (void)result;
+#endif
+}
+
+std::size_t pagesize()
+{
+ static std::size_t size = 0;
+ static boost::once_flag flag;
+ boost::call_once( flag, pagesize_, & size);
+ return size;
+}
+
+rlimit stacksize_limit()
+{
+ static rlimit limit;
+ static boost::once_flag flag;
+ boost::call_once( flag, stacksize_limit_, & limit);
+ return limit;
+}
+
+bool
+stack_traits::is_unbounded() BOOST_NOEXCEPT
+{ return RLIM_INFINITY == stacksize_limit().rlim_max; }
+
+std::size_t
+stack_traits::page_size() BOOST_NOEXCEPT
+{ return pagesize(); }
+
+std::size_t
+stack_traits::default_size() BOOST_NOEXCEPT
+{
+ std::size_t size = 8 * minimum_size();
+ if ( is_unbounded() ) return size;
+
+ BOOST_ASSERT( maximum_size() >= minimum_size() );
+ return maximum_size() == size
+ ? size
+ : (std::min)( size, maximum_size() );
+}
+
+std::size_t
+stack_traits::minimum_size() BOOST_NOEXCEPT
+{ return SIGSTKSZ; }
+
+std::size_t
+stack_traits::maximum_size() BOOST_NOEXCEPT
+{
+ BOOST_ASSERT( ! is_unbounded() );
+ return static_cast< std::size_t >( stacksize_limit().rlim_max);
+}
+
+}}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+# include BOOST_ABI_SUFFIX
+#endif
+
+#ifdef UDEF_SIGSTKSZ
+# undef SIGSTKSZ
+#endif