-void BoostContext::stop()
-{
- Context::stop();
- throw StopRequest();
-}
-
-// SerialBoostContext
-
-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::getMaestro());
- }
- SIMIX_context_set_current(static_cast<smx_context_t>(next_context));
- BoostContext::swap(this, next_context);
-}
-
-void SerialBoostContext::resume()
-{
- SIMIX_context_set_current(this);
- BoostContext::swap(BoostContext::getMaestro(), this);
-}
-
-// ParallelBoostContext
-
-#if HAVE_THREAD_CONTEXTS
-
-void ParallelBoostContext::suspend()
-{
- boost::optional<smx_actor_t> next_work = parmap_->next();
- ParallelBoostContext* next_context;
- if (next_work) {
- XBT_DEBUG("Run next process");
- next_context = static_cast<ParallelBoostContext*>(next_work.get()->context);
- } else {
- XBT_DEBUG("No more processes to run");
- uintptr_t worker_id = reinterpret_cast<uintptr_t>(xbt_os_thread_get_specific(worker_id_key_));
- next_context = static_cast<ParallelBoostContext*>(workers_context_[worker_id]);
- }
-
- SIMIX_context_set_current(static_cast<smx_context_t>(next_context));
- BoostContext::swap(this, next_context);
-}
-
-void ParallelBoostContext::resume()
-{
- uintptr_t worker_id = __sync_fetch_and_add(&threads_working_, 1);
- xbt_os_thread_set_specific(worker_id_key_, reinterpret_cast<void*>(worker_id));
-
- ParallelBoostContext* worker_context = static_cast<ParallelBoostContext*>(SIMIX_context_self());
- workers_context_[worker_id] = worker_context;
-
- SIMIX_context_set_current(this);
- BoostContext::swap(worker_context, this);
-}
-
-#endif
-