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
More cleanup in contexts' stop().
[simgrid.git]
/
src
/
kernel
/
context
/
ContextUnix.cpp
diff --git
a/src/kernel/context/ContextUnix.cpp
b/src/kernel/context/ContextUnix.cpp
index
036af58
..
0ee4c14
100644
(file)
--- a/
src/kernel/context/ContextUnix.cpp
+++ b/
src/kernel/context/ContextUnix.cpp
@@
-81,6
+81,7
@@
public:
UContext(std::function<void()> code,
void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
~UContext() override;
UContext(std::function<void()> code,
void_pfn_smxprocess_t cleanup_func, smx_actor_t process);
~UContext() override;
+ void stop() override;
};
class SerialUContext : public UContext {
};
class SerialUContext : public UContext {
@@
-89,7
+90,6
@@
public:
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
- void stop() override;
void suspend() override;
void resume();
};
void suspend() override;
void resume();
};
@@
-100,7
+100,6
@@
public:
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
void_pfn_smxprocess_t cleanup_func, smx_actor_t process)
: UContext(std::move(code), cleanup_func, process)
{}
- void stop() override;
void suspend() override;
void resume();
};
void suspend() override;
void resume();
};
@@
-230,6
+229,11
@@
UContext::~UContext()
SIMIX_context_stack_delete(this->stack_);
}
SIMIX_context_stack_delete(this->stack_);
}
+void UContext::stop()
+{
+ Context::stop();
+ throw StopRequest();
+}
}}} // namespace simgrid::kernel::context
static void smx_ctx_sysv_wrapper(int first, ...)
}}} // namespace simgrid::kernel::context
static void smx_ctx_sysv_wrapper(int first, ...)
@@
-247,20
+251,19
@@
static void smx_ctx_sysv_wrapper(int first, ...)
}
memcpy(&context, ctx_addr, sizeof(simgrid::kernel::context::UContext*));
}
memcpy(&context, ctx_addr, sizeof(simgrid::kernel::context::UContext*));
- (*context)();
- context->stop();
+ try {
+ (*context)();
+ context->Context::stop();
+ } catch (simgrid::kernel::context::Context::StopRequest const&) {
+ XBT_DEBUG("Caught a StopRequest");
+ }
+ context->suspend();
}
namespace simgrid {
namespace kernel {
namespace context {
}
namespace simgrid {
namespace kernel {
namespace context {
-void SerialUContext::stop()
-{
- Context::stop();
- this->suspend();
-}
-
void SerialUContext::suspend()
{
/* determine the next context */
void SerialUContext::suspend()
{
/* determine the next context */
@@
-270,11
+273,11
@@
void SerialUContext::suspend()
if (i < simix_global->process_to_run.size()) {
/* execute the next process */
XBT_DEBUG("Run next process");
if (i < simix_global->process_to_run.size()) {
/* execute the next process */
XBT_DEBUG("Run next process");
- next_context =
(SerialUContext*)simix_global->process_to_run[i]->context
;
+ next_context =
static_cast<SerialUContext*>(simix_global->process_to_run[i]->context)
;
} else {
/* all processes were run, return to maestro */
XBT_DEBUG("No more process to run");
} else {
/* all processes were run, return to maestro */
XBT_DEBUG("No more process to run");
- next_context =
(SerialUContext*) sysv_maestro_context
;
+ next_context =
static_cast<SerialUContext*>(sysv_maestro_context)
;
}
SIMIX_context_set_current(next_context);
swapcontext(&this->uc_, &next_context->uc_);
}
SIMIX_context_set_current(next_context);
swapcontext(&this->uc_, &next_context->uc_);
@@
-285,13
+288,7
@@
void SerialUContext::suspend()
void SerialUContext::resume()
{
SIMIX_context_set_current(this);
void SerialUContext::resume()
{
SIMIX_context_set_current(this);
- swapcontext(&((SerialUContext*)sysv_maestro_context)->uc_, &this->uc_);
-}
-
-void ParallelUContext::stop()
-{
- UContext::stop();
- this->suspend();
+ swapcontext(&static_cast<SerialUContext*>(sysv_maestro_context)->uc_, &this->uc_);
}
/** Run one particular simulated process on the current thread. */
}
/** Run one particular simulated process on the current thread. */
@@
-303,11
+300,11
@@
void ParallelUContext::resume()
// Store the number of my containing body in os-thread-specific area :
xbt_os_thread_set_specific(sysv_worker_id_key, (void*) worker_id);
// Get my current soul:
// Store the number of my containing body in os-thread-specific area :
xbt_os_thread_set_specific(sysv_worker_id_key, (void*) worker_id);
// Get my current soul:
- ParallelUContext* worker_context =
(ParallelUContext*) SIMIX_context_self(
);
+ ParallelUContext* worker_context =
static_cast<ParallelUContext*>(SIMIX_context_self()
);
// Write down that this soul is hosted in that body (for now)
sysv_workers_context[worker_id] = worker_context;
// Retrieve the system-level info that fuels this soul:
// Write down that this soul is hosted in that body (for now)
sysv_workers_context[worker_id] = worker_context;
// Retrieve the system-level info that fuels this soul:
- ucontext_t* worker_stack = &
((ParallelUContext*) worker_context)
->uc_;
+ ucontext_t* worker_stack = &
worker_context
->uc_;
// Write in simix that I switched my soul
SIMIX_context_set_current(this);
// Actually do that using the relevant library call:
// Write in simix that I switched my soul
SIMIX_context_set_current(this);
// Actually do that using the relevant library call:
@@
-355,7
+352,7
@@
void ParallelUContext::suspend()
uintptr_t worker_id =
(uintptr_t) xbt_os_thread_get_specific(sysv_worker_id_key);
// Deduce the initial soul of that body
uintptr_t worker_id =
(uintptr_t) xbt_os_thread_get_specific(sysv_worker_id_key);
// Deduce the initial soul of that body
- next_context =
(ParallelUContext*)
sysv_workers_context[worker_id];
+ next_context = sysv_workers_context[worker_id];
// When given that soul, the body will wait for the next scheduling round
}
// When given that soul, the body will wait for the next scheduling round
}