Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
This was not compiling when sizeof(unsigned long) != sizeof(void*)
[simgrid.git] / src / simix / RawContext.cpp
index 6247479..83c3c75 100644 (file)
@@ -4,7 +4,7 @@
 /* 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
@@ -13,6 +13,9 @@
 
 #include <math.h>
 
+#include <utility>
+#include <functional>
+
 #include <xbt/log.h>
 #include <xbt/parmap.h>
 #include <xbt/dynar.h>
@@ -38,8 +41,7 @@ protected:
   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();
@@ -59,10 +61,8 @@ class RawContextFactory : public ContextFactory {
 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();
@@ -82,10 +82,10 @@ ContextFactory* raw_factory()
 
 // ***** 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
@@ -128,7 +128,7 @@ __asm__ (
    ".text\n"
    ".globl _raw_makecontext\n"
    "_raw_makecontext:\n"
-#elif defined(_WIN32)
+#elif defined(_XBT_WIN32)
    ".text\n"
    ".globl raw_makecontext\n"
    "raw_makecontext:\n"
@@ -164,7 +164,7 @@ __asm__ (
    ".text\n"
    ".globl _raw_swapcontext\n"
    "_raw_swapcontext:\n"
-#elif defined(_WIN32)
+#elif defined(_XBT_WIN32)
    ".text\n"
    ".globl raw_swapcontext\n"
    "raw_swapcontext:\n"
@@ -204,7 +204,7 @@ __asm__ (
 );
 #elif PROCESSOR_i686
 __asm__ (
-#if defined(APPLE) || defined(_WIN32)
+#if defined(APPLE) || defined(_XBT_WIN32)
    ".text\n"
    ".globl _raw_makecontext\n"
    "_raw_makecontext:\n"
@@ -231,7 +231,7 @@ __asm__ (
 );
 
 __asm__ (
-#if defined(APPLE) || defined(_WIN32)
+#if defined(APPLE) || defined(_XBT_WIN32)
    ".text\n"
    ".globl _raw_swapcontext\n"
    "_raw_swapcontext:\n"
@@ -259,7 +259,7 @@ __asm__ (
 
 
 /* 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) {
@@ -285,7 +285,7 @@ RawContextFactory::RawContextFactory()
 #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
@@ -304,19 +304,17 @@ RawContextFactory::RawContextFactory()
 
 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);
 }
 
@@ -327,13 +325,11 @@ void RawContext::wrapper(void* arg)
   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,
@@ -383,7 +379,7 @@ void RawContextFactory::run_all_serial()
 
 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(
@@ -431,7 +427,7 @@ void RawContext::suspend_serial()
 
 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;
@@ -444,10 +440,10 @@ void RawContext::suspend_parallel()
   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);
   }
 
@@ -472,9 +468,9 @@ void RawContext::resume_serial()
 
 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);