102 lines
3.3 KiB
Diff
102 lines
3.3 KiB
Diff
--- boost/context/continuation.hpp
|
|
+++ boost/context/continuation.hpp
|
|
@@ -299,6 +299,24 @@
|
|
friend continuation
|
|
callcc( std::allocator_arg_t, preallocated, StackAlloc, Fn &&);
|
|
|
|
+#if defined(BOOST_GCC) && BOOST_GCC < 50000
|
|
+ template< typename StackAlloc, typename Fn, typename ... Arg >
|
|
+ friend continuation
|
|
+ callcc_with_args( std::allocator_arg_t, StackAlloc, Fn &&, Arg ...);
|
|
+
|
|
+ template< typename StackAlloc, typename Fn, typename ... Arg >
|
|
+ friend continuation
|
|
+ callcc_with_args_palloc( std::allocator_arg_t, preallocated, StackAlloc, Fn &&, Arg ...);
|
|
+
|
|
+ template< typename StackAlloc, typename Fn >
|
|
+ friend continuation
|
|
+ callcc_no_args( std::allocator_arg_t, StackAlloc, Fn &&);
|
|
+
|
|
+ template< typename StackAlloc, typename Fn >
|
|
+ friend continuation
|
|
+ callcc_no_args_palloc( std::allocator_arg_t, preallocated, StackAlloc, Fn &&);
|
|
+#endif
|
|
+
|
|
detail::transfer_t t_{ nullptr, nullptr };
|
|
|
|
continuation( detail::fcontext_t fctx) noexcept :
|
|
@@ -518,6 +536,56 @@
|
|
palloc, salloc, std::forward< Fn >( fn) ) }.resume();
|
|
}
|
|
|
|
+#if defined(BOOST_GCC) && BOOST_GCC < 50000
|
|
+
|
|
+template<
|
|
+ typename StackAlloc,
|
|
+ typename Fn,
|
|
+ typename ... Arg
|
|
+>
|
|
+continuation
|
|
+callcc_with_args( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Arg ... arg) {
|
|
+ using Record = detail::record< continuation, StackAlloc, Fn >;
|
|
+ return continuation{
|
|
+ detail::context_create< Record >(
|
|
+ salloc, std::forward< Fn >( fn) ) }.resume(
|
|
+ std::forward< Arg >( arg) ... );
|
|
+}
|
|
+
|
|
+template<
|
|
+ typename StackAlloc,
|
|
+ typename Fn,
|
|
+ typename ... Arg
|
|
+>
|
|
+continuation
|
|
+callcc_with_args_palloc( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Arg ... arg) {
|
|
+ using Record = detail::record< continuation, StackAlloc, Fn >;
|
|
+ return continuation{
|
|
+ detail::context_create< Record >(
|
|
+ palloc, salloc, std::forward< Fn >( fn) ) }.resume(
|
|
+ std::forward< Arg >( arg) ... );
|
|
+}
|
|
+
|
|
+template< typename StackAlloc, typename Fn >
|
|
+continuation
|
|
+callcc_no_args( std::allocator_arg_t, StackAlloc salloc, Fn && fn) {
|
|
+ using Record = detail::record< continuation, StackAlloc, Fn >;
|
|
+ return continuation{
|
|
+ detail::context_create< Record >(
|
|
+ salloc, std::forward< Fn >( fn) ) }.resume();
|
|
+}
|
|
+
|
|
+template< typename StackAlloc, typename Fn >
|
|
+continuation
|
|
+callcc_no_args_palloc( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn) {
|
|
+ using Record = detail::record< continuation, StackAlloc, Fn >;
|
|
+ return continuation{
|
|
+ detail::context_create< Record >(
|
|
+ palloc, salloc, std::forward< Fn >( fn) ) }.resume();
|
|
+}
|
|
+
|
|
+#endif
|
|
+
|
|
#if defined(BOOST_USE_SEGMENTED_STACKS)
|
|
template<
|
|
typename Fn,
|
|
|
|
--- libs/fiber/src/context.cpp
|
|
+++ libs/fiber/src/context.cpp
|
|
@@ -219,7 +219,11 @@
|
|
type_{ type::dispatcher_context },
|
|
policy_{ launch::post }
|
|
{
|
|
+#if defined(BOOST_GCC) && BOOST_GCC < 50000
|
|
+ c_ = boost::context::callcc_no_args_palloc(
|
|
+#else
|
|
c_ = boost::context::callcc(
|
|
+#endif
|
|
std::allocator_arg, palloc, salloc,
|
|
[this,sched](boost::context::continuation && c) noexcept {
|
|
c = c.resume();
|
|
|
|
|