#include "xbt/parmap.hpp"
-#include "src/simix/smx_private.h"
#include "mc/mc.h"
+#include "src/simix/smx_private.hpp"
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context);
* preserve the signal mask when switching. This saves a system call (at least on Linux) on each context switch.
*/
class RawContext : public Context {
-protected:
+private:
void* stack_ = nullptr;
/** pointer to top the stack stack */
void* stack_top_ = nullptr;
+
public:
friend class RawContextFactory;
RawContext(std::function<void()> code,
void_pfn_smxprocess_t cleanup, smx_actor_t process) override;
void run_all() override;
private:
- void run_all_adaptative();
void run_all_serial();
void run_all_parallel();
};
xbt_os_thread_key_create(&raw_worker_id_key);
// TODO, lazily init
raw_parmap = nullptr;
- raw_workers_context = xbt_new(RawContext*, nthreads);
+ raw_workers_context = new RawContext*[nthreads];
raw_maestro_context = nullptr;
#endif
- // TODO, if(SIMIX_context_get_parallel_threshold() > 1) => choose dynamically
+ // TODO: choose dynamically when SIMIX_context_get_parallel_threshold() > 1
}
}
{
#if HAVE_THREAD_CONTEXTS
delete raw_parmap;
- xbt_free(raw_workers_context);
+ delete[] raw_workers_context;
#endif
}
void RawContext::wrapper(void* arg)
{
RawContext* context = static_cast<RawContext*>(arg);
- (*context)();
- context->stop();
+ try {
+ (*context)();
+ context->Context::stop();
+ } catch (StopRequest const&) {
+ XBT_DEBUG("Caught a StopRequest");
+ }
+ context->suspend();
}
RawContext::RawContext(std::function<void()> code,
void RawContext::stop()
{
Context::stop();
- this->suspend();
+ throw StopRequest();
}
void RawContextFactory::run_all()
XBT_DEBUG("No more processes to run");
uintptr_t worker_id = (uintptr_t)
xbt_os_thread_get_specific(raw_worker_id_key);
- next_context = static_cast<RawContext*>(raw_workers_context[worker_id]);
+ next_context = raw_workers_context[worker_id];
XBT_DEBUG("Restoring worker stack %zu (working threads = %zu)",
worker_id, raw_threads_working);
}
#endif
}
-/** @brief Resumes all processes ready to run. */
-void RawContextFactory::run_all_adaptative()
-{
- unsigned long nb_processes = simix_global->process_to_run.size();
- if (SIMIX_context_is_parallel() &&
- static_cast<unsigned long>(SIMIX_context_get_parallel_threshold()) < nb_processes) {
- raw_context_parallel = true;
- XBT_DEBUG("Runall // %lu", nb_processes);
- this->run_all_parallel();
- } else {
- XBT_DEBUG("Runall serial %lu", nb_processes);
- raw_context_parallel = false;
- this->run_all_serial();
- }
-}
-
}}}