A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
further cleanups in contexts
[simgrid.git]
/
src
/
kernel
/
context
/
ContextBoost.cpp
diff --git
a/src/kernel/context/ContextBoost.cpp
b/src/kernel/context/ContextBoost.cpp
index
e9ea749
..
ac33134
100644
(file)
--- a/
src/kernel/context/ContextBoost.cpp
+++ b/
src/kernel/context/ContextBoost.cpp
@@
-35,7
+35,7
@@
smx_context_t BoostContextFactory::create_context(std::function<void()> code, vo
{
if (parallel_)
return this->new_context<ParallelBoostContext>(std::move(code), cleanup_func, process);
- return this->new_context<
Serial
BoostContext>(std::move(code), cleanup_func, process);
+ return this->new_context<BoostContext>(std::move(code), cleanup_func, process);
}
void BoostContextFactory::run_all()
@@
-43,20
+43,17
@@
void BoostContextFactory::run_all()
if (parallel_)
ParallelBoostContext::run_all();
else
- S
erialBoost
Context::run_all();
+ S
wapped
Context::run_all();
}
// BoostContext
-BoostContext* BoostContext::maestro_context_ = nullptr;
-
BoostContext::BoostContext(std::function<void()> code, void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
- : Context(std::move(code), cleanup_func, process)
+ :
Swapped
Context(std::move(code), cleanup_func, process)
{
/* if the user provided a function for the process then use it, otherwise it is the context for maestro */
if (has_code()) {
- this->stack_ = SIMIX_context_stack_new();
/* 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
@@
-74,8
+71,8
@@
BoostContext::BoostContext(std::function<void()> code, void_pfn_smxprocess_t cle
#if BOOST_VERSION < 105600
this->fc_ = new boost::context::fcontext_t();
#endif
- if (
BoostContext::maestro_context_
== nullptr)
-
BoostContext::maestro_context_ = this
;
+ if (
get_maestro()
== nullptr)
+
set_maestro(this)
;
}
}
@@
-85,9
+82,8
@@
BoostContext::~BoostContext()
if (not this->stack_)
delete this->fc_;
#endif
- if (this == maestro_context_)
- maestro_context_ = nullptr;
- SIMIX_context_stack_delete(this->stack_);
+ if (this == get_maestro())
+ set_maestro(nullptr);
}
void BoostContext::wrapper(BoostContext::arg_type arg)
@@
-113,14
+109,15
@@
void BoostContext::wrapper(BoostContext::arg_type arg)
context->suspend();
}
-
inline void BoostContext::swap(BoostContext* from, BoostContext* to
)
+
void BoostContext::swap_into(SwappedContext* to_
)
{
+ BoostContext* to = static_cast<BoostContext*>(to_);
#if BOOST_VERSION < 105600
- boost::context::jump_fcontext(
from
->fc_, to->fc_, reinterpret_cast<intptr_t>(to));
+ boost::context::jump_fcontext(
this
->fc_, to->fc_, reinterpret_cast<intptr_t>(to));
#elif BOOST_VERSION < 106100
- boost::context::jump_fcontext(&
from
->fc_, to->fc_, reinterpret_cast<intptr_t>(to));
+ boost::context::jump_fcontext(&
this
->fc_, to->fc_, reinterpret_cast<intptr_t>(to));
#else
- BoostContext* ctx[2] = {
from
, to};
+ BoostContext* ctx[2] = {
this
, to};
ASAN_ONLY(void* fake_stack = nullptr);
ASAN_ONLY(to->asan_ctx_ = from);
ASAN_START_SWITCH(from->asan_stop_ ? nullptr : &fake_stack, to->asan_stack_, to->asan_stack_size_);
@@
-137,47
+134,6
@@
void BoostContext::stop()
throw StopRequest();
}
-// SerialBoostContext
-
-unsigned long SerialBoostContext::process_index_;
-
-void SerialBoostContext::suspend()
-{
- /* determine the next context */
- SerialBoostContext* next_context;
- unsigned long int i = process_index_;
- process_index_++;
-
- if (i < simix_global->process_to_run.size()) {
- /* execute the next process */
- XBT_DEBUG("Run next process");
- next_context = static_cast<SerialBoostContext*>(simix_global->process_to_run[i]->context_);
- } else {
- /* all processes were run, return to maestro */
- XBT_DEBUG("No more process to run");
- next_context = static_cast<SerialBoostContext*>(BoostContext::get_maestro());
- }
- Context::set_current(next_context);
- BoostContext::swap(this, next_context);
-}
-
-void SerialBoostContext::resume()
-{
- BoostContext* old = static_cast<BoostContext*>(self());
- Context::set_current(this);
- BoostContext::swap(old, this);
-}
-
-void SerialBoostContext::run_all()
-{
- if (simix_global->process_to_run.empty())
- return;
- smx_actor_t first_process = simix_global->process_to_run.front();
- process_index_ = 1;
- /* execute the first process */
- static_cast<SerialBoostContext*>(first_process->context_)->resume();
-}
-
// ParallelBoostContext
simgrid::xbt::Parmap<smx_actor_t>* ParallelBoostContext::parmap_;
@@
-225,7
+181,7
@@
void ParallelBoostContext::suspend()
}
Context::set_current(next_context);
-
BoostContext::swap(this,
next_context);
+
this->swap_into(
next_context);
}
void ParallelBoostContext::resume()
@@
-236,7
+192,7
@@
void ParallelBoostContext::resume()
workers_context_[worker_id_] = worker_context;
Context::set_current(this);
-
BoostContext::swap(worker_context,
this);
+
worker_context->swap_into(
this);
}