+/** Run one particular simulated process on the current thread. */
+void ParallelUContext::resume()
+{
+ // What is my containing body?
+ uintptr_t worker_id = __sync_fetch_and_add(&threads_working_, 1);
+ // Store the number of my containing body in os-thread-specific area :
+ xbt_os_thread_set_specific(worker_id_key_, reinterpret_cast<void*>(worker_id));
+ // Get my current soul:
+ ParallelUContext* worker_context = static_cast<ParallelUContext*>(SIMIX_context_self());
+ // Write down that this soul is hosted in that body (for now)
+ workers_context_[worker_id] = worker_context;
+ // Write in simix that I switched my soul
+ SIMIX_context_set_current(this);
+ // Actually do that using the relevant library call:
+ UContext::swap(worker_context, this);
+ // No body runs that soul anymore at this point. Instead the current body took the soul of simulated process The
+ // simulated process wakes back after the call to "SIMIX_context_suspend(self->context);" within
+ // smx_process.c::SIMIX_process_yield()
+
+ // From now on, the simulated processes will change their soul with the next soul to execute (in suspend_parallel,
+ // below). When nobody is to be executed in this scheduling round, the last simulated process will take back the
+ // initial soul of the current working thread
+}