Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
move things to a righter place
[simgrid.git] / src / simix / smx_private.h
index 472d523..b591a57 100644 (file)
@@ -14,6 +14,7 @@
 #include "xbt/dict.h"
 #include "xbt/mallocator.h"
 #include "xbt/config.h"
+#include "xbt/xbt_os_time.h"
 #include "xbt/function_types.h"
 #include "xbt/ex_interface.h"
 #include "instr/instr_private.h"
 #include "smx_network_private.h"
 #include "smx_smurf_private.h"
 #include "smx_synchro_private.h"
+/* ****************************************************************************************** */
+/* TUTORIAL: New API                                                                        */
+/* ****************************************************************************************** */
+#include "smx_new_api_private.h"
 
 /* Define only for SimGrid benchmarking purposes */
-#undef TIME_BENCH
+//#define TIME_BENCH_PER_SR /* this aims at measuring the time spent in each scheduling round per each thread. The code is thus run in sequential to bench separately each SSR */
+//#define TIME_BENCH_AMDAHL /* this aims at measuring the porting of time that could be parallelized at maximum (to get the optimal speedup by applying the amdahl law). */
 
 /********************************** Simix Global ******************************/
 typedef struct s_smx_global {
@@ -41,6 +47,11 @@ typedef struct s_smx_global {
   void_pfn_smxprocess_t cleanup_process_function;
   xbt_mallocator_t action_mallocator;
   void_pfn_smxhost_t autorestart;
+
+#ifdef TIME_BENCH_AMDAHL
+  xbt_os_timer_t timer_seq; /* used to bench the sequential and parallel parts of the simulation, if requested to */
+  xbt_os_timer_t timer_par;
+#endif
 } s_smx_global_t, *smx_global_t;
 
 extern smx_global_t simix_global;
@@ -62,12 +73,9 @@ extern xbt_dict_t watched_hosts_lib;
 /* ******************************** File ************************************ */
 typedef struct s_smx_file {
   surf_file_t surf_file;
+  void* data;                   /**< @brief user data */
 } s_smx_file_t;
 
-typedef struct s_smx_stat {
-  s_file_stat_t surf_stat;
-} s_smx_stat_t;
-
 /*********************************** Time ************************************/
 
 /** @brief Timer datatype */
@@ -85,7 +93,11 @@ typedef enum {
   SIMIX_ACTION_COMMUNICATE,
   SIMIX_ACTION_SLEEP,
   SIMIX_ACTION_SYNCHRO,
-  SIMIX_ACTION_IO
+  SIMIX_ACTION_IO,
+  /* ****************************************************************************************** */
+  /* TUTORIAL: New API                                                                        */
+  /* ****************************************************************************************** */
+  SIMIX_ACTION_NEW_API
 } e_smx_action_type_t;
 
 typedef enum {
@@ -121,6 +133,12 @@ typedef struct s_smx_action {
     struct {
       e_smx_comm_type_t type;         /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */
       smx_rdv_t rdv;                  /* Rendez-vous where the comm is queued */
+
+#ifdef HAVE_MC
+      smx_rdv_t rdv_cpy;              /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR 
+                                         (comm.rdv set to NULL when the communication is removed from the mailbox 
+                                         (used as garbage collector)) */
+#endif
       int refcount;                   /* Number of processes involved in the cond */
       int detached;                   /* If detached or not */
 
@@ -162,6 +180,13 @@ typedef struct s_smx_action {
       smx_host_t host;
       surf_action_t surf_io;
     } io;
+
+    /* ****************************************************************************************** */
+    /* TUTORIAL: New API                                                                        */
+    /* ****************************************************************************************** */
+    struct {
+      surf_action_t surf_new_api;
+    } new_api;
   };
 
 #ifdef HAVE_LATENCY_BOUND_TRACKING
@@ -197,6 +222,7 @@ void SIMIX_context_set_current(smx_context_t context);
 smx_context_t SIMIX_context_get_current(void);
 
 /* All factories init */
+
 void SIMIX_ctx_thread_factory_init(smx_context_factory_t *factory);
 void SIMIX_ctx_sysv_factory_init(smx_context_factory_t *factory);
 void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory);
@@ -235,7 +261,8 @@ static XBT_INLINE smx_context_t SIMIX_context_new(xbt_main_func_t code,
                                                   void_pfn_smxprocess_t cleanup_func,
                                                   smx_process_t simix_process)
 {
-
+  if (!simix_global)
+    xbt_die("simix is not initialized, please call MSG_init first");
   return simix_global->context_factory->create_context(code,
                                                        argc, argv,
                                                        cleanup_func,
@@ -276,7 +303,9 @@ static XBT_INLINE void SIMIX_context_suspend(smx_context_t context)
  */
 static XBT_INLINE void SIMIX_context_runall(void)
 {
-  simix_global->context_factory->runall();
+  if (!xbt_dynar_is_empty(simix_global->process_to_run)) {
+    simix_global->context_factory->runall();
+  }
 }
 
 /**
@@ -287,7 +316,6 @@ static XBT_INLINE smx_context_t SIMIX_context_self(void)
   if (simix_global && simix_global->context_factory) {
     return simix_global->context_factory->self();
   }
-
   return NULL;
 }
 
@@ -302,4 +330,7 @@ static XBT_INLINE void* SIMIX_context_get_data(smx_context_t context)
 }
 
 XBT_PUBLIC(int) SIMIX_process_get_maxpid(void);
+
+void SIMIX_post_create_environment(void);
+
 #endif