Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merging changes done by Steven, Samuel and Luka, regarding simulation of StarPU-MPI
[simgrid.git] / src / simix / smx_global.cpp
similarity index 92%
rename from src/simix/smx_global.c
rename to src/simix/smx_global.cpp
index 7c87387..3ba0e93 100644 (file)
@@ -5,32 +5,40 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdlib.h>
+#include "src/portable.h"
+#ifdef HAVE_SYS_PTRACE_H
+# include <sys/types.h>
+# include <sys/ptrace.h>
+#endif
 
 #include "smx_private.h"
+#include "smx_private.hpp"
 #include "xbt/heap.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 #include "xbt/str.h"
 #include "xbt/ex.h"             /* ex_backtrace_display */
 #include "mc/mc.h"
-#include "mc/mc_replay.h"
+#include "src/mc/mc_replay.h"
 #include "simgrid/sg_config.h"
 
+#include "src/surf/callbacks.h"
+
 #ifdef HAVE_MC
-#include "mc/mc_private.h"
-#include "mc/mc_protocol.h"
-#include "mc/mc_client.h"
+#include "src/mc/mc_private.h"
+#include "src/mc/mc_protocol.h"
+#include "src/mc/mc_client.h"
 #endif
 
 #ifdef HAVE_MC
 #include <stdlib.h>
-#include "mc/mc_protocol.h"
+#include "src/mc/mc_protocol.h"
 #endif 
 
-#include "mc/mc_record.h"
+#include "src/mc/mc_record.h"
 
 #ifdef HAVE_SMPI
-#include "smpi/private.h"
+#include "src/smpi/private.h"
 #endif
 
 XBT_LOG_NEW_CATEGORY(simix, "All SIMIX categories");
@@ -40,6 +48,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix,
 smx_global_t simix_global = NULL;
 static xbt_heap_t simix_timers = NULL;
 
+/** @brief Timer datatype */
+typedef struct s_smx_timer {
+  double date;
+  void(* func)(void*);
+  void* args;
+} s_smx_timer_t;
+
 void (*SMPI_switch_data_segment)(int) = NULL;
 
 static void* SIMIX_synchro_mallocator_new_f(void);
@@ -89,14 +104,6 @@ static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context)
     }
 #endif
   }
-#ifdef HAVE_MC
-  if (MC_is_active()) {
-    if (mc_stack) {
-      MC_dump_stack_safety(mc_stack);
-    }
-    MC_print_statistics(mc_stats);
-  }
-#endif
   raise(signum);
 }
 
@@ -145,11 +152,22 @@ static void install_segvhandler(void)
 #endif
 /********************************* SIMIX **************************************/
 
-XBT_INLINE double SIMIX_timer_next(void)
+double SIMIX_timer_next(void)
 {
   return xbt_heap_size(simix_timers) > 0 ? xbt_heap_maxkey(simix_timers) : -1.0;
 }
 
+static void kill_process(smx_process_t process)
+{
+  SIMIX_process_kill(process, NULL);
+}
+
+static void SIMIX_storage_create_(smx_storage_t storage)
+{
+  const char* key = xbt_dict_get_elm_key(storage);
+  SIMIX_storage_create(key, storage, NULL);
+}
+
 /**
  * \ingroup SIMIX_API
  * \brief Initialize SIMIX internal data.
@@ -184,7 +202,7 @@ void SIMIX_global_init(int *argc, char **argv)
     simix_global->registered_functions = xbt_dict_new_homogeneous(NULL);
 
     simix_global->create_process_function = SIMIX_process_create;
-    simix_global->kill_process_function = SIMIX_process_kill;
+    simix_global->kill_process_function = kill_process;
     simix_global->cleanup_process_function = SIMIX_process_cleanup;
     simix_global->synchro_mallocator = xbt_mallocator_new(65536,
         SIMIX_synchro_mallocator_new_f, SIMIX_synchro_mallocator_free_f,
@@ -212,6 +230,8 @@ void SIMIX_global_init(int *argc, char **argv)
     /* register a function to be called by SURF after the environment creation */
     sg_platf_init();
     sg_platf_postparse_add_cb(SIMIX_post_create_environment);
+    surf_on_host_created(SIMIX_host_create);
+    surf_on_storage_created(SIMIX_storage_create_);
 
   }
   if (!simix_timers) {
@@ -226,14 +246,7 @@ void SIMIX_global_init(int *argc, char **argv)
 #ifdef HAVE_MC
   // The communication initialization is done ASAP.
   // We need to communicate  initialization of the different layers to the model-checker.
-  if (mc_mode == MC_MODE_NONE) {
-    if (getenv(MC_ENV_SOCKET_FD)) {
-      mc_mode = MC_MODE_CLIENT;
-      MC_client_init();
-      MC_client_hello();
-      MC_client_handle_messages();
-    }
-  }
+  MC_client_init();
 #endif
 
   if (_sg_cfg_exit_asap)
@@ -319,7 +332,7 @@ void SIMIX_clean(void)
  *
  * \return Return the clock.
  */
-XBT_INLINE double SIMIX_get_clock(void)
+double SIMIX_get_clock(void)
 {
   if(MC_is_active() || MC_record_replay_is_active()){
     return MC_process_clock_get(SIMIX_process_self());
@@ -445,7 +458,7 @@ void SIMIX_run(void)
         }
       }
       /* Wake up all processes waiting for a Surf action to finish */
-      xbt_dynar_foreach(model_list, iter, model) {
+      xbt_dynar_foreach(all_existing_models, iter, model) {
         XBT_DEBUG("Handling process whose action failed");
         while ((action = surf_model_extract_failed_action_set(model))) {
           XBT_DEBUG("   Handling Action %p",action);
@@ -476,14 +489,14 @@ void SIMIX_run(void)
     while (xbt_heap_size(simix_timers) > 0 && SIMIX_get_clock() >= SIMIX_timer_next()) {
        //FIXME: make the timers being real callbacks
        // (i.e. provide dispatchers that read and expand the args)
-       timer = xbt_heap_pop(simix_timers);
+       timer = (smx_timer_t) xbt_heap_pop(simix_timers);
        if (timer->func)
-         ((void (*)(void*))timer->func)(timer->args);
+         timer->func(timer->args);
        xbt_free(timer);
     }
 
     /* Wake up all processes waiting for a Surf action to finish */
-    xbt_dynar_foreach(model_list, iter, model) {
+    xbt_dynar_foreach(all_existing_models, iter, model) {
       XBT_DEBUG("Handling process whose action failed");
       while ((action = surf_model_extract_failed_action_set(model))) {
         XBT_DEBUG("   Handling Action %p",action);
@@ -536,7 +549,7 @@ void SIMIX_run(void)
  *   \param arg Parameters of the function
  *
  */
-XBT_INLINE smx_timer_t SIMIX_timer_set(double date, void *function, void *arg)
+smx_timer_t SIMIX_timer_set(double date, void (*function)(void*), void *arg)
 {
   smx_timer_t timer = xbt_new0(s_smx_timer_t, 1);
 
@@ -547,12 +560,12 @@ XBT_INLINE smx_timer_t SIMIX_timer_set(double date, void *function, void *arg)
   return timer;
 }
 /** @brief cancels a timer that was added earlier */
-XBT_INLINE void SIMIX_timer_remove(smx_timer_t timer) {
+void SIMIX_timer_remove(smx_timer_t timer) {
        xbt_heap_rm_elm(simix_timers, timer, timer->date);
 }
 
 /** @brief Returns the date at which the timer will trigger (or 0 if NULL timer) */
-XBT_INLINE double SIMIX_timer_get_date(smx_timer_t timer) {
+double SIMIX_timer_get_date(smx_timer_t timer) {
        return timer?timer->date:0;
 }
 
@@ -564,7 +577,7 @@ XBT_INLINE double SIMIX_timer_get_date(smx_timer_t timer) {
  * to call SIMIX_process_create().
  * \param function create process function
  */
-XBT_INLINE void SIMIX_function_register_process_create(smx_creation_func_t
+void SIMIX_function_register_process_create(smx_creation_func_t
                                                        function)
 {
   simix_global->create_process_function = function;
@@ -578,7 +591,7 @@ XBT_INLINE void SIMIX_function_register_process_create(smx_creation_func_t
  *
  * \param function Kill process function
  */
-XBT_INLINE void SIMIX_function_register_process_kill(void_pfn_smxprocess_t_smxprocess_t
+void SIMIX_function_register_process_kill(void_pfn_smxprocess_t
                                                      function)
 {
   simix_global->kill_process_function = function;
@@ -592,7 +605,7 @@ XBT_INLINE void SIMIX_function_register_process_kill(void_pfn_smxprocess_t_smxpr
  *
  * \param function cleanup process function
  */
-XBT_INLINE void SIMIX_function_register_process_cleanup(void_pfn_smxprocess_t
+void SIMIX_function_register_process_cleanup(void_pfn_smxprocess_t
                                                         function)
 {
   simix_global->cleanup_process_function = function;
@@ -648,12 +661,12 @@ void SIMIX_display_process_status(void)
         break;
       }
       XBT_INFO("Process %lu (%s@%s): waiting for %s synchro %p (%s) in state %d to finish",
-          process->pid, process->name, sg_host_name(process->host),
+          process->pid, process->name, sg_host_get_name(process->host),
           synchro_description, process->waiting_synchro,
           process->waiting_synchro->name, (int)process->waiting_synchro->state);
     }
     else {
-      XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_name(process->host));
+      XBT_INFO("Process %lu (%s@%s)", process->pid, process->name, sg_host_get_name(process->host));
     }
   }
 }
@@ -683,5 +696,5 @@ xbt_dict_t simcall_HANDLER_asr_get_properties(smx_simcall_t simcall, const char
 }
 xbt_dict_t SIMIX_asr_get_properties(const char *name)
 {
-  return xbt_lib_get_or_null(as_router_lib, name, ROUTING_PROP_ASR_LEVEL);
+  return (xbt_dict_t) xbt_lib_get_or_null(as_router_lib, name, ROUTING_PROP_ASR_LEVEL);
 }