X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4d02714ee138a3bd9b02e0064b7a2aa26407e9e8..094fd23340ee7224c18cfeea09af018f963eb618:/src/kernel/context/ContextBoost.cpp diff --git a/src/kernel/context/ContextBoost.cpp b/src/kernel/context/ContextBoost.cpp index 4298641e5c..27f801fdd1 100644 --- a/src/kernel/context/ContextBoost.cpp +++ b/src/kernel/context/ContextBoost.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2015-2020. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -15,14 +15,14 @@ namespace kernel { namespace context { // BoostContextFactory -smx_context_t BoostContextFactory::create_context(std::function code, smx_actor_t actor) +BoostContext* BoostContextFactory::create_context(std::function&& code, actor::ActorImpl* actor) { return this->new_context(std::move(code), actor, this); } // BoostContext -BoostContext::BoostContext(std::function code, smx_actor_t actor, SwappedContextFactory* factory) +BoostContext::BoostContext(std::function&& code, actor::ActorImpl* actor, SwappedContextFactory* factory) : SwappedContext(std::move(code), actor, factory) { @@ -31,31 +31,18 @@ BoostContext::BoostContext(std::function code, smx_actor_t actor, Swappe /* We need to pass the bottom of the stack to make_fcontext, depending on the stack direction it may be the lower or higher address: */ #if PTH_STACKGROWTH == -1 - void* stack = static_cast(get_stack()) + smx_context_usable_stack_size; + unsigned char* stack = get_stack() + smx_context_stack_size; #else - void* stack = get_stack(); + unsigned char* stack = get_stack(); #endif #if BOOST_VERSION < 106100 - this->fc_ = boost::context::make_fcontext(stack, smx_context_usable_stack_size, BoostContext::wrapper); + this->fc_ = boost::context::make_fcontext(stack, smx_context_stack_size, BoostContext::wrapper); #else - this->fc_ = boost::context::detail::make_fcontext(stack, smx_context_usable_stack_size, BoostContext::wrapper); -#endif - - } else { -#if BOOST_VERSION < 105600 - this->fc_ = new boost::context::fcontext_t(); + this->fc_ = boost::context::detail::make_fcontext(stack, smx_context_stack_size, BoostContext::wrapper); #endif } } -BoostContext::~BoostContext() -{ -#if BOOST_VERSION < 105600 - if (not get_stack()) - delete this->fc_; -#endif -} - void BoostContext::wrapper(BoostContext::arg_type arg) { #if BOOST_VERSION < 106100 @@ -72,19 +59,18 @@ void BoostContext::wrapper(BoostContext::arg_type arg) } catch (ForcefulKillException const&) { XBT_DEBUG("Caught a ForcefulKillException"); } catch (simgrid::Exception const& e) { - XBT_INFO("Actor killed by an uncatched exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); + XBT_INFO("Actor killed by an uncaught exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); throw; } ASAN_ONLY(context->asan_stop_ = true); context->suspend(); + THROW_IMPOSSIBLE; } void BoostContext::swap_into(SwappedContext* to_) { BoostContext* to = static_cast(to_); -#if BOOST_VERSION < 105600 - boost::context::jump_fcontext(this->fc_, to->fc_, reinterpret_cast(to)); -#elif BOOST_VERSION < 106100 +#if BOOST_VERSION < 106100 boost::context::jump_fcontext(&this->fc_, to->fc_, reinterpret_cast(to)); #else BoostContext* ctx[2] = {this, to}; @@ -103,4 +89,6 @@ XBT_PRIVATE ContextFactory* boost_factory() XBT_VERB("Using Boost contexts. Welcome to the 21th century."); return new BoostContextFactory(); } -}}} // namespace +} // namespace context +} // namespace kernel +} // namespace simgrid