#include "xbt/dict.h"
#include "xbt/config.h"
#include "xbt/function_types.h"
+#include "xbt/ex_interface.h"
/******************************** Datatypes ***********************************/
/******************************** Process *************************************/
-typedef struct s_smx_context *smx_context_t;
-
-/** @brief Process datatype
+/** @brief Process datatype
@ingroup m_datatypes_management_details @{ */
typedef struct s_smx_process {
s_xbt_swag_hookup_t process_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_action_t waiting_action;
xbt_dict_t properties;
void *data; /* kept for compatibility, it should be replaced with moddata */
xbt_dict_t properties;
} s_smx_process_arg_t, *smx_process_arg_t;
+void SIMIX_create_maestro_process(void);
void SIMIX_process_empty_trash(void);
-void __SIMIX_process_schedule(smx_process_t process);
-void __SIMIX_process_yield(void);
+void SIMIX_process_schedule(smx_process_t process);
+void SIMIX_process_yield(void);
+ex_ctx_t *SIMIX_process_get_exception(void);
+void SIMIX_process_exception_terminate(xbt_ex_t * e);
/*************************** Mutex and Conditional ****************************/
} s_smx_cond_t;
+/******************************* Networking ***********************************/
+
+/** @brief Rendez-vous point datatype */
+typedef struct s_smx_rvpoint {
+ char *name;
+ smx_mutex_t read;
+ smx_mutex_t write;
+ xbt_fifo_t comm_fifo;
+} 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_cond_t cond; /* Condition associated to the surf simulation */
+ int refcount; /* Number of processes involved in the cond */
+
+ /* Surf action data */
+ smx_process_t src_proc;
+ smx_process_t dst_proc;
+ smx_action_t act;
+ double rate;
+ double task_size;
+
+ /* Data to be transfered */
+ void *src_buff;
+ size_t src_buff_size;
+ void *dst_buff;
+ size_t *dst_buff_size;
+ 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);
+void SIMIX_communication_destroy(smx_comm_t comm);
+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);
+
/********************************* Action *************************************/
+typedef enum {ready, ongoing, done, failed} smx_action_state_t;
+
/** @brief Action datatype
@ingroup m_datatypes_management_details */
typedef struct s_smx_action {
void __SIMIX_cond_wait(smx_cond_t cond);
void __SIMIX_cond_display_actions(smx_cond_t cond);
void __SIMIX_action_display_conditions(smx_action_t action);
-void __SIMIX_create_maestro_process(void);
/******************************** Context *************************************/
/* each context type must contain this macro at its begining -- OOP in C :/ */
#define SMX_CTX_BASE_T \
s_xbt_swag_hookup_t hookup; \
- ex_ctx_t *exception; \
xbt_main_func_t code; \
int argc; \
char **argv; \
typedef smx_context_t (*smx_pfn_context_factory_create_context_t)
(xbt_main_func_t, int, char**, void_f_pvoid_t, void*);
-/* function used to create the context for the maestro process */
-typedef smx_context_t (*smx_pfn_context_factory_create_maestro_context_t) (void);
-
/* this function finalize the specified context factory */
typedef int (*smx_pfn_context_factory_finalize_t) (smx_context_factory_t*);
/* interface of the context factories */
typedef struct s_smx_context_factory {
- smx_pfn_context_factory_create_maestro_context_t create_maestro_context;
smx_pfn_context_factory_create_context_t create_context;
smx_pfn_context_factory_finalize_t finalize;
smx_pfn_context_free_t free;
* iwannadie == 1, and call SIMIX_context_stop(same than first case afterward)
*/
-/**
- * \brief creates the context for the maestro process
- */
-static inline smx_context_t SIMIX_context_create_maestro()
-{
- return (*(simix_global->context_factory->create_maestro_context)) ();
-}
-
/**
* \brief creates a new context for a user level process
* \param code a main function