BoostContext::parallel_ = SIMIX_context_is_parallel();
if (BoostContext::parallel_) {
#if HAVE_THREAD_CONTEXTS
- int nthreads = SIMIX_context_get_nthreads();
- BoostContext::parmap_ = new simgrid::xbt::Parmap<smx_actor_t>(nthreads, SIMIX_context_get_parallel_mode());
+ BoostContext::parmap_ = nullptr;
BoostContext::workers_context_.clear();
- BoostContext::workers_context_.resize(nthreads, nullptr);
+ BoostContext::workers_context_.resize(SIMIX_context_get_nthreads(), nullptr);
BoostContext::maestro_context_ = nullptr;
xbt_os_thread_key_create(&BoostContext::worker_id_key_);
#else
BoostContextFactory::~BoostContextFactory()
{
#if HAVE_THREAD_CONTEXTS
- if (BoostContext::parmap_) {
- delete BoostContext::parmap_;
- BoostContext::parmap_ = nullptr;
- }
+ delete BoostContext::parmap_;
+ BoostContext::parmap_ = nullptr;
BoostContext::workers_context_.clear();
#endif
}
#if HAVE_THREAD_CONTEXTS
if (BoostContext::parallel_) {
BoostContext::threads_working_ = 0;
+ if (not BoostContext::parmap_)
+ BoostContext::parmap_ =
+ new simgrid::xbt::Parmap<smx_actor_t>(SIMIX_context_get_nthreads(), SIMIX_context_get_parallel_mode());
BoostContext::parmap_->apply(
[](smx_actor_t process) {
BoostContext* context = static_cast<BoostContext*>(process->context);
static_cast<BoostContext**>(arg.data)[0]->fc_ = arg.fctx;
BoostContext* context = static_cast<BoostContext**>(arg.data)[1];
#endif
- (*context)();
- context->stop();
+ try {
+ (*context)();
+ context->stop();
+ } catch (StopRequest) {
+ XBT_DEBUG("Caught a StopRequest");
+ }
+ context->suspend();
}
inline void BoostContext::smx_ctx_boost_jump_fcontext(BoostContext* from, BoostContext* to)
void BoostSerialContext::stop()
{
BoostContext::stop();
- this->suspend();
+ throw StopRequest();
}
// BoostParallelContext
void BoostParallelContext::stop()
{
BoostContext::stop();
- this->suspend();
+ throw StopRequest();
}
void BoostParallelContext::resume()