X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b38d5c15755a98cc7ef99a0a9c4936357dbedce3..548029a96b99a66a16b530071b492e7d3dcd9e5e:/src/simix/private.h diff --git a/src/simix/private.h b/src/simix/private.h index eec2c34c6f..653575e3dc 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -26,7 +26,7 @@ @ingroup m_datatypes_management_details */ typedef struct s_smx_host { char *name; /**< @brief host name if any */ - void *host; /* SURF modeling */ + void *host; /* SURF modeling */ xbt_swag_t process_list; void *data; /**< @brief user data */ } s_smx_host_t; @@ -47,6 +47,10 @@ typedef struct SIMIX_Global { smx_creation_func_t create_process_function; void_f_pvoid_t kill_process_function; void_f_pvoid_t cleanup_process_function; + xbt_dict_t msg_sizes; /* pimple to get an histogram of message sizes in the simulation */ +#ifdef HAVE_LATENCY_BOUND_TRACKING + xbt_dict_t latency_limited_dict; +#endif } s_SIMIX_Global_t, *SIMIX_Global_t; extern SIMIX_Global_t simix_global; @@ -55,27 +59,27 @@ extern SIMIX_Global_t simix_global; /** @brief Process datatype @ingroup m_datatypes_management_details @{ */ - typedef struct s_smx_process { - s_xbt_swag_hookup_t process_hookup; - s_xbt_swag_hookup_t synchro_hookup; /* process_to_run or mutex->sleeping and co */ - s_xbt_swag_hookup_t host_proc_hookup; - s_xbt_swag_hookup_t destroy_hookup; - - char *name; /**< @brief process name if any */ - smx_host_t smx_host; /* the host on which the process is running */ - smx_context_t context; /* the context that executes the scheduler function */ - ex_ctx_t *exception; - int blocked : 1; - int suspended : 1; - int iwannadie : 1; - smx_mutex_t mutex; /* mutex on which the process is blocked */ - smx_cond_t cond; /* cond on which the process is blocked */ - smx_sem_t sem; /* semaphore on which the process is blocked */ - smx_action_t waiting_action; - xbt_dict_t properties; - void *data; /* kept for compatibility, it should be replaced with moddata */ - - } s_smx_process_t; +typedef struct s_smx_process { + s_xbt_swag_hookup_t process_hookup; + s_xbt_swag_hookup_t synchro_hookup; /* process_to_run or mutex->sleeping and co */ + s_xbt_swag_hookup_t host_proc_hookup; + s_xbt_swag_hookup_t destroy_hookup; + + char *name; /**< @brief process name if any */ + smx_host_t smx_host; /* the host on which the process is running */ + smx_context_t context; /* the context that executes the scheduler function */ + ex_ctx_t *exception; + int blocked:1; + int suspended:1; + int iwannadie:1; + smx_mutex_t mutex; /* mutex on which the process is blocked */ + smx_cond_t cond; /* cond on which the process is blocked */ + smx_sem_t sem; /* semaphore on which the process is blocked */ + smx_action_t waiting_action; + xbt_dict_t properties; + void *data; /* kept for compatibility, it should be replaced with moddata */ + +} s_smx_process_t; /** @} */ typedef struct s_smx_process_arg { @@ -95,36 +99,6 @@ void SIMIX_process_schedule(smx_process_t process); ex_ctx_t *SIMIX_process_get_exception(void); void SIMIX_process_exception_terminate(xbt_ex_t * e); -/*************************** Mutex and Conditional ****************************/ - -typedef struct s_smx_mutex { - - /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_mutex */ - xbt_swag_t sleeping; /* list of sleeping process */ - int refcount; - /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_mutex */ - -} s_smx_mutex_t; - -typedef struct s_smx_cond { - - /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_cond */ - xbt_swag_t sleeping; /* list of sleeping process */ - smx_mutex_t mutex; - xbt_fifo_t actions; /* list of actions */ - /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_cond */ - -} s_smx_cond_t; - -typedef struct s_smx_sem { - /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_sem */ - xbt_swag_t sleeping; /* list of sleeping process */ - int capacity; - xbt_fifo_t actions; /* list of actions */ - /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_sem */ - -} s_smx_sem_t; - /******************************* Networking ***********************************/ /** @brief Rendez-vous point datatype */ @@ -132,17 +106,17 @@ typedef struct s_smx_rvpoint { char *name; smx_mutex_t read; smx_mutex_t write; - xbt_fifo_t comm_fifo; + xbt_fifo_t comm_fifo; void *data; } s_smx_rvpoint_t; typedef struct s_smx_comm { - smx_comm_type_t type; /* Type of the communication (comm_send,comm_recv) */ - smx_rdv_t rdv; /* Rendez-vous where the comm is queued */ - smx_sem_t sem; /* Semaphore associated to the surf simulation */ - int refcount; /* Number of processes involved in the cond */ + smx_comm_type_t type; /* Type of the communication (comm_send,comm_recv) */ + smx_rdv_t rdv; /* Rendez-vous where the comm is queued */ + smx_sem_t sem; /* Semaphore associated to the surf simulation */ + int refcount; /* Number of processes involved in the cond */ /* Surf action data */ smx_process_t src_proc; @@ -159,34 +133,37 @@ typedef struct s_smx_comm { size_t src_buff_size; size_t *dst_buff_size; char copied; - - void *data; /* User data associated to communication */ + + void *data; /* User data associated to communication */ } s_smx_comm_t; void SIMIX_network_copy_data(smx_comm_t comm); smx_comm_t SIMIX_communication_new(smx_comm_type_t type); -static inline void SIMIX_communication_use(smx_comm_t comm); -static inline void SIMIX_communication_wait_for_completion(smx_comm_t comm, double timeout); -static inline void SIMIX_rdv_push(smx_rdv_t rdv, smx_comm_t comm); -static inline void SIMIX_rdv_remove(smx_rdv_t rdv, smx_comm_t comm); +static XBT_INLINE void SIMIX_communication_use(smx_comm_t comm); +static XBT_INLINE void SIMIX_communication_wait_for_completion(smx_comm_t + comm, + double + timeout); +static XBT_INLINE void SIMIX_rdv_push(smx_rdv_t rdv, smx_comm_t comm); +static XBT_INLINE void SIMIX_rdv_remove(smx_rdv_t rdv, smx_comm_t comm); /********************************* Action *************************************/ -typedef enum {ready, ongoing, done, failed} smx_action_state_t; +typedef enum { ready, ongoing, done, failed } smx_action_state_t; /** @brief Action datatype @ingroup m_datatypes_management_details */ typedef struct s_smx_action { char *name; /**< @brief action name if any */ - xbt_fifo_t cond_list; /*< conditional variables that must be signaled when the action finish. */ - xbt_fifo_t sem_list; /*< semaphores that must be signaled when the action finish. */ + xbt_fifo_t cond_list; /*< conditional variables that must be signaled when the action finish. */ + xbt_fifo_t sem_list; /*< semaphores that must be signaled when the action finish. */ void *data; /**< @brief user data */ int refcount; /**< @brief reference counter */ surf_action_t surf_action; /* SURF modeling of computation */ smx_host_t source; #ifdef HAVE_TRACING - long long int counter; /* simix action unique identifier for instrumentation */ - char *category; /* simix action category for instrumentation */ + long long int counter; /* simix action unique identifier for instrumentation */ + char *category; /* simix action category for instrumentation */ #endif } s_smx_action_t; @@ -200,7 +177,8 @@ extern int _simix_init_status; /* 0: beginning of time; FIXME: KILLME ? get_state(SIMIX_host_self()->host)==SURF_RESOURCE_ON,\ "Host failed, you cannot call this function.") -smx_host_t __SIMIX_host_create(const char *name, void *workstation, void *data); +smx_host_t __SIMIX_host_create(const char *name, void *workstation, + void *data); void __SIMIX_host_destroy(void *host); void __SIMIX_cond_wait(smx_cond_t cond); void __SIMIX_cond_display_actions(smx_cond_t cond); @@ -211,9 +189,10 @@ void __SIMIX_action_display_conditions(smx_action_t action); /* The following function pointer types describe the interface that any context factory should implement */ -typedef smx_context_t (*smx_pfn_context_factory_create_context_t) - (xbt_main_func_t, int, char**, void_f_pvoid_t, void*); -typedef int (*smx_pfn_context_factory_finalize_t) (smx_context_factory_t*); +typedef smx_context_t(*smx_pfn_context_factory_create_context_t) + (xbt_main_func_t, int, char **, void_f_pvoid_t, void *); +typedef int (*smx_pfn_context_factory_finalize_t) (smx_context_factory_t + *); typedef void (*smx_pfn_context_free_t) (smx_context_t); typedef void (*smx_pfn_context_start_t) (smx_context_t); typedef void (*smx_pfn_context_stop_t) (smx_context_t); @@ -236,24 +215,10 @@ void SIMIX_context_mod_init(void); void SIMIX_context_mod_exit(void); -/* Selects a context factory associated with the name specified by the parameter name. - * If successful the function returns 0. Otherwise the function returns the error code. - */ -int SIMIX_context_select_factory(const char *name); - -/* Initializes a context factory from the name specified by the parameter name. - * If the factory cannot be found, an exception is raised. - */ -void SIMIX_context_init_factory_by_name(smx_context_factory_t * factory, const char *name); /* 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_lua_factory_init(smx_context_factory_t * factory); - - -void SIMIX_ctx_java_factory_init(smx_context_factory_t * factory); /* ****************************** */ /* context manipulation functions */ @@ -284,13 +249,15 @@ void SIMIX_ctx_java_factory_init(smx_context_factory_t * factory); * \param cleanup_func the function to call when the context stops * \param cleanup_arg the argument of the cleanup_func function */ -static inline smx_context_t SIMIX_context_new(xbt_main_func_t code, int argc, - char** argv, - void_f_pvoid_t cleanup_func, - void* cleanup_arg) { +static XBT_INLINE smx_context_t SIMIX_context_new(xbt_main_func_t code, + int argc, char **argv, + void_f_pvoid_t + cleanup_func, + void *cleanup_arg) +{ return (*(simix_global->context_factory->create_context)) - (code, argc, argv, cleanup_func, cleanup_arg); + (code, argc, argv, cleanup_func, cleanup_arg); } /** @@ -298,7 +265,8 @@ static inline smx_context_t SIMIX_context_new(xbt_main_func_t code, int argc, * \param context the context to destroy * Argument must be stopped first -- runs in maestro context */ -static inline void SIMIX_context_free(smx_context_t context) { +static XBT_INLINE void SIMIX_context_free(smx_context_t context) +{ (*(simix_global->context_factory->free)) (context); } @@ -306,7 +274,8 @@ static inline void SIMIX_context_free(smx_context_t context) { * \brief stops the execution of a context * \param context to stop */ -static inline void SIMIX_context_stop(smx_context_t context) { +static XBT_INLINE void SIMIX_context_stop(smx_context_t context) +{ (*(simix_global->context_factory->stop)) (context); } @@ -315,7 +284,7 @@ static inline void SIMIX_context_stop(smx_context_t context) { \param old_context the actual context from which is resuming \param new_context the context to resume */ -static inline void SIMIX_context_resume(smx_context_t new_context) +static XBT_INLINE void SIMIX_context_resume(smx_context_t new_context) { (*(simix_global->context_factory->resume)) (new_context); } @@ -325,7 +294,7 @@ static inline void SIMIX_context_resume(smx_context_t new_context) scheduled it \param context the context to be suspended (it must be the running one) */ -static inline void SIMIX_context_suspend(smx_context_t context) +static XBT_INLINE void SIMIX_context_suspend(smx_context_t context) { (*(simix_global->context_factory->suspend)) (context); }