X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cdf6a962eb4e88efbed3df9c41343adabcf09e6c..39c935d6d5ee86d153f6f7e6a10d723ae7c57f6f:/src/kernel/context/ContextRaw.cpp diff --git a/src/kernel/context/ContextRaw.cpp b/src/kernel/context/ContextRaw.cpp index d493caec6e..3b1cc8d053 100644 --- a/src/kernel/context/ContextRaw.cpp +++ b/src/kernel/context/ContextRaw.cpp @@ -1,10 +1,9 @@ -/* Copyright (c) 2009-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2021. 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. */ #include "ContextRaw.hpp" -#include "context_private.hpp" #include "mc/mc.h" #include "simgrid/Exception.hpp" #include "src/simix/smx_private.hpp" @@ -13,11 +12,11 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); // Raw context routines -typedef void (*rawctx_entry_point_t)(simgrid::kernel::context::RawContext*); +using rawctx_entry_point_t = void (*)(simgrid::kernel::context::SwappedContext*); -typedef void* raw_stack_t; +using raw_stack_t = void*; extern "C" raw_stack_t raw_makecontext(void* malloced_stack, int stack_size, rawctx_entry_point_t entry_point, - simgrid::kernel::context::RawContext* arg); + simgrid::kernel::context::SwappedContext* arg); extern "C" void raw_swapcontext(raw_stack_t* old, raw_stack_t new_context); // TODO, we should handle FP, MMX and the x87 control-word (for x86 and x86_64) @@ -168,7 +167,7 @@ __asm__ ( update the definition of HAVE_RAW_CONTEXTS in tools/cmake/CompleteInFiles.cmake */ raw_stack_t raw_makecontext(void* malloced_stack, int stack_size, rawctx_entry_point_t entry_point, - simgrid::kernel::context::RawContext* arg) + simgrid::kernel::context::SwappedContext* arg) { THROW_UNIMPLEMENTED; } @@ -198,38 +197,19 @@ RawContext* RawContextFactory::create_context(std::function&& code, acto RawContext::RawContext(std::function&& code, actor::ActorImpl* actor, SwappedContextFactory* factory) : SwappedContext(std::move(code), actor, factory) { - if (has_code()) { - this->stack_top_ = raw_makecontext(get_stack(), smx_context_stack_size, RawContext::wrapper, this); - } else { - if (MC_is_active()) - MC_ignore_heap(&stack_top_, sizeof(stack_top_)); - } -} - -void RawContext::wrapper(RawContext* context) -{ - ASAN_FINISH_SWITCH(nullptr, &context->asan_ctx_->asan_stack_, &context->asan_ctx_->asan_stack_size_); - try { - (*context)(); - context->Context::stop(); - } catch (ForcefulKillException const&) { - XBT_DEBUG("Caught a ForcefulKillException"); - } catch (simgrid::Exception const& e) { - XBT_INFO("Actor killed by an uncaught exception %s", simgrid::xbt::demangle(typeid(e).name()).get()); - throw; + XBT_VERB("Creating a context of stack %uMb", actor->get_stacksize() / 1024 / 1024); + if (has_code()) { + this->stack_top_ = raw_makecontext(get_stack(), actor->get_stacksize(), smx_ctx_wrapper, this); + } else { + if (MC_is_active()) + MC_ignore_heap(&stack_top_, sizeof(stack_top_)); } - ASAN_ONLY(context->asan_stop_ = true); - context->suspend(); } -void RawContext::swap_into(SwappedContext* to_) +void RawContext::swap_into_for_real(SwappedContext* to_) { - RawContext* to = static_cast(to_); - ASAN_ONLY(void* fake_stack = nullptr); - ASAN_ONLY(to->asan_ctx_ = this); - ASAN_START_SWITCH(this->asan_stop_ ? nullptr : &fake_stack, to->asan_stack_, to->asan_stack_size_); + const RawContext* to = static_cast(to_); raw_swapcontext(&this->stack_top_, to->stack_top_); - ASAN_FINISH_SWITCH(fake_stack, &this->asan_ctx_->asan_stack_, &this->asan_ctx_->asan_stack_size_); } ContextFactory* raw_factory()