/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
-/** \file Rawcontext.cpp
+/** \file RawContext.cpp
* Fast context switching inspired from SystemV ucontexts.
*
* In contrast to System V context, it does not touch the signal mask
#include <math.h>
+#include <utility>
+#include <functional>
+
#include <xbt/log.h>
#include <xbt/parmap.h>
#include <xbt/dynar.h>
void* stack_top_ = nullptr;
public:
friend class RawContextFactory;
- RawContext(xbt_main_func_t code,
- int argc, char **argv,
+ RawContext(std::function<void()> code,
void_pfn_smxprocess_t cleanup_func,
smx_process_t process);
~RawContext();
public:
RawContextFactory();
~RawContextFactory();
- RawContext* create_context(
- xbt_main_func_t, int, char **, void_pfn_smxprocess_t,
- smx_process_t process
- ) override;
+ RawContext* create_context(std::function<void()> code,
+ void_pfn_smxprocess_t, smx_process_t process) override;
void run_all() override;
private:
void run_all_adaptative();
// ***** Loads of static stuff
-#ifdef CONTEXT_THREADS
+#ifdef HAVE_THREAD_CONTEXTS
static xbt_parmap_t raw_parmap;
static simgrid::simix::RawContext** raw_workers_context; /* space to save the worker context in each thread */
-static unsigned long raw_threads_working; /* number of threads that have started their work */
+static uintptr_t raw_threads_working; /* number of threads that have started their work */
static xbt_os_thread_key_t raw_worker_id_key; /* thread-specific storage for the thread id */
#endif
#ifdef ADAPTIVE_THRESHOLD
#if PROCESSOR_x86_64
__asm__ (
-#if defined(APPLE)
+#if defined(__APPLE__)
".text\n"
".globl _raw_makecontext\n"
"_raw_makecontext:\n"
);
__asm__ (
-#if defined(APPLE)
+#if defined(__APPLE__)
".text\n"
".globl _raw_swapcontext\n"
"_raw_swapcontext:\n"
);
#elif PROCESSOR_i686
__asm__ (
-#if defined(APPLE) || defined(_WIN32)
+#if defined(__APPLE__) || defined(_WIN32)
".text\n"
".globl _raw_makecontext\n"
"_raw_makecontext:\n"
);
__asm__ (
-#if defined(APPLE) || defined(_WIN32)
+#if defined(__APPLE__) || defined(_WIN32)
".text\n"
".globl _raw_swapcontext\n"
"_raw_swapcontext:\n"
/* If you implement raw contexts for other processors, don't forget to
- update the definition of HAVE_RAWCTX in tools/cmake/CompleteInFiles.cmake */
+ update the definition of HAVE_RAW_CONTEXTS in tools/cmake/CompleteInFiles.cmake */
raw_stack_t raw_makecontext(void* malloced_stack, int stack_size,
rawctx_entry_point_t entry_point, void* arg) {
#endif
raw_context_parallel = SIMIX_context_is_parallel();
if (raw_context_parallel) {
-#ifdef CONTEXT_THREADS
+#ifdef HAVE_THREAD_CONTEXTS
int nthreads = SIMIX_context_get_nthreads();
xbt_os_thread_key_create(&raw_worker_id_key);
// TODO, lazily init
RawContextFactory::~RawContextFactory()
{
-#ifdef CONTEXT_THREADS
+#ifdef HAVE_THREAD_CONTEXTS
if (raw_parmap)
xbt_parmap_destroy(raw_parmap);
xbt_free(raw_workers_context);
#endif
}
-RawContext* RawContextFactory::create_context(
- xbt_main_func_t code, int argc, char ** argv,
- void_pfn_smxprocess_t cleanup,
- smx_process_t process)
+RawContext* RawContextFactory::create_context(std::function<void()> code,
+ void_pfn_smxprocess_t cleanup, smx_process_t process)
{
- return this->new_context<RawContext>(code, argc, argv,
+ return this->new_context<RawContext>(std::move(code),
cleanup, process);
}
context->stop();
}
-RawContext::RawContext(
- xbt_main_func_t code, int argc, char ** argv,
- void_pfn_smxprocess_t cleanup,
- smx_process_t process)
- : Context(code, argc, argv, cleanup, process)
+RawContext::RawContext(std::function<void()> code,
+ void_pfn_smxprocess_t cleanup, smx_process_t process)
+ : Context(std::move(code), cleanup, process)
{
- if (code) {
+ if (has_code()) {
this->stack_ = SIMIX_context_stack_new();
this->stack_top_ = raw_makecontext(this->stack_,
smx_context_usable_stack_size,
void RawContextFactory::run_all_parallel()
{
-#ifdef CONTEXT_THREADS
+#ifdef HAVE_THREAD_CONTEXTS
raw_threads_working = 0;
if (raw_parmap == nullptr)
raw_parmap = xbt_parmap_new(
void RawContext::suspend_parallel()
{
-#ifdef CONTEXT_THREADS
+#ifdef HAVE_THREAD_CONTEXTS
/* determine the next context */
smx_process_t next_work = (smx_process_t) xbt_parmap_next(raw_parmap);
RawContext* next_context = nullptr;
else {
/* all processes were run, go to the barrier */
XBT_DEBUG("No more processes to run");
- unsigned long worker_id = (unsigned long)(uintptr_t)
+ uintptr_t worker_id = (uintptr_t)
xbt_os_thread_get_specific(raw_worker_id_key);
next_context = (RawContext*) raw_workers_context[worker_id];
- XBT_DEBUG("Restoring worker stack %lu (working threads = %lu)",
+ XBT_DEBUG("Restoring worker stack %zu (working threads = %zu)",
worker_id, raw_threads_working);
}
void RawContext::resume_parallel()
{
-#ifdef CONTEXT_THREADS
- unsigned long worker_id = __sync_fetch_and_add(&raw_threads_working, 1);
- xbt_os_thread_set_specific(raw_worker_id_key, (void*)(uintptr_t) worker_id);
+#ifdef HAVE_THREAD_CONTEXTS
+ uintptr_t worker_id = __sync_fetch_and_add(&raw_threads_working, 1);
+ xbt_os_thread_set_specific(raw_worker_id_key, (void*) worker_id);
RawContext* worker_context = (RawContext*) SIMIX_context_self();
raw_workers_context[worker_id] = worker_context;
- XBT_DEBUG("Saving worker stack %lu", worker_id);
+ XBT_DEBUG("Saving worker stack %zu", worker_id);
SIMIX_context_set_current(this);
raw_swapcontext(&worker_context->stack_top_, this->stack_top_);
#else