Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
don't even try to have ucontextes on windows.
[simgrid.git] / src / simix / UContext.cpp
index 45b50be..7cb720a 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 
 #include <functional>
+#include <ucontext.h>           /* context relative declarations */
 
 #include "xbt/parmap.h"
 #include "src/simix/smx_private.h"
 #include "src/context_sysv_config.h"        /* loads context system definitions */
 #include "mc/mc.h"
 
-#ifdef _XBT_WIN32
-#  include <xbt/win32_ucontext.h>     /* context relative declarations */
-#else
-#  include <ucontext.h>           /* context relative declarations */
-#endif
-
 /** Many integers are needed to store a pointer
  *
  * This is a bit paranoid about sizeof(smx_ctx_sysv_t) not being a multiple
@@ -68,7 +63,7 @@ namespace simix {
 #ifdef HAVE_THREAD_CONTEXTS
 static xbt_parmap_t sysv_parmap;
 static simgrid::simix::ParallelUContext** sysv_workers_context;   /* space to save the worker's context in each thread */
-static unsigned long sysv_threads_working;     /* number of threads that have started their work */
+static uintptr_t sysv_threads_working;     /* number of threads that have started their work */
 static xbt_os_thread_key_t sysv_worker_id_key; /* thread-specific storage for the thread id */
 #endif
 static unsigned long sysv_process_index = 0;   /* index of the next process to run in the
@@ -233,7 +228,7 @@ UContext::UContext(std::function<void()> code,
   }
 
 #ifdef HAVE_MC
-  if (MC_is_active() && code) {
+  if (MC_is_active() && has_code()) {
     MC_register_stack_area(this->stack_, process,
                       &(this->uc_), smx_context_usable_stack_size);
   }
@@ -316,7 +311,7 @@ void ParallelUContext::resume()
 {
 #ifdef HAVE_THREAD_CONTEXTS
   // What is my containing body?
-  unsigned long worker_id = __sync_fetch_and_add(&sysv_threads_working, 1);
+  uintptr_t worker_id = __sync_fetch_and_add(&sysv_threads_working, 1);
   // Store the number of my containing body in os-thread-specific area :
   xbt_os_thread_set_specific(sysv_worker_id_key, (void*) worker_id);
   // Get my current soul:
@@ -373,8 +368,8 @@ void ParallelUContext::suspend()
     XBT_DEBUG("No more processes to run");
     // Get back the identity of my body that was stored when starting
     // the scheduling round
-    unsigned long worker_id =
-        (unsigned long) xbt_os_thread_get_specific(sysv_worker_id_key);
+    uintptr_t worker_id =
+        (uintptr_t) xbt_os_thread_get_specific(sysv_worker_id_key);
     // Deduce the initial soul of that body
     next_context = (ParallelUContext*) sysv_workers_context[worker_id];
     // When given that soul, the body will wait for the next scheduling round