X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4d648ebbbe5705878080b9cbf1ca61497323c592..cd4a6bff769c06de3840b08926eccf0734642f57:/src/kernel/context/ContextRaw.cpp diff --git a/src/kernel/context/ContextRaw.cpp b/src/kernel/context/ContextRaw.cpp index 5645aea6fa..9dedc92189 100644 --- a/src/kernel/context/ContextRaw.cpp +++ b/src/kernel/context/ContextRaw.cpp @@ -1,23 +1,21 @@ -/* 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" 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 +166,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 +196,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 uncatched 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()