X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/81588aeededcff1407c760226b43f347eb832b39..b9684d3607aa558c95b7185ddf147b478a7e367f:/src/simix/smx_private.h diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index d0384513a9..6906a08b6d 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -7,6 +7,12 @@ #ifndef _SIMIX_PRIVATE_H #define _SIMIX_PRIVATE_H +#include +#include +#include + +#include + #include "src/internal_config.h" #include "simgrid/simix.h" #include "surf/surf.h" @@ -56,37 +62,62 @@ typedef struct s_smx_context_factory *smx_context_factory_t; #endif -SG_BEGIN_DECL() - /********************************** Simix Global ******************************/ -typedef struct s_smx_global { - smx_context_factory_t context_factory; - xbt_dynar_t process_to_run; - xbt_dynar_t process_that_ran; - xbt_swag_t process_list; - xbt_swag_t process_to_destroy; - smx_process_t maestro_process; - xbt_dict_t registered_functions; - smx_creation_func_t create_process_function; - void_pfn_smxprocess_t kill_process_function; + +namespace simgrid { +namespace simix { + +// What's executed as SIMIX actor code: +typedef std::function ActorCode; + +// Create ActorCode based on argv: +typedef std::function ActorCodeFactory; + +class Global { +public: + smx_context_factory_t context_factory = nullptr; + xbt_dynar_t process_to_run = nullptr; + xbt_dynar_t process_that_ran = nullptr; + xbt_swag_t process_list = nullptr; + xbt_swag_t process_to_destroy = nullptr; + smx_process_t maestro_process = nullptr; + + // Maps function names to actor code: + std::unordered_map registered_functions; + + // This might be used when no corresponding function name is registered: + simgrid::simix::ActorCodeFactory default_function; + + smx_creation_func_t create_process_function = nullptr; + void_pfn_smxprocess_t kill_process_function = nullptr; /** Callback used when killing a SMX_process */ - void_pfn_smxprocess_t cleanup_process_function; + void_pfn_smxprocess_t cleanup_process_function = nullptr; + xbt_os_mutex_t mutex = nullptr; +}; - xbt_os_mutex_t mutex; -} s_smx_global_t, *smx_global_t; +} +} + +SG_BEGIN_DECL() + +XBT_PUBLIC_DATA(std::unique_ptr) simix_global; -XBT_PUBLIC_DATA(smx_global_t) simix_global; extern XBT_PRIVATE unsigned long simix_process_maxpid; XBT_PUBLIC(void) SIMIX_clean(void); /******************************** Exceptions *********************************/ /** @brief Ask to the provided simix process to raise the provided exception */ -#define SMX_EXCEPTION(issuer, cat, val, msg) \ - if (1) { \ - smx_process_t _smx_throw_issuer = (issuer); /* evaluate only once */\ - THROW_PREPARE(_smx_throw_issuer->running_ctx, (cat), (val), xbt_strdup(msg)); \ - _smx_throw_issuer->doexception = 1; \ +#define SMX_EXCEPTION(issuer, cat, val, msg) \ + if (1) { \ + smx_process_t _smx_throw_issuer = (issuer); /* evaluate only once */ \ + xbt_ex e(msg); \ + e.category = cat; \ + e.value = val; \ + e.file = __FILE__; \ + e.line = __LINE__; \ + e.func = __func__; \ + _smx_throw_issuer->exception = std::make_exception_ptr(e); \ } else ((void)0) /* ******************************** File ************************************ */ @@ -99,7 +130,7 @@ XBT_PRIVATE void SIMIX_context_mod_init(void); XBT_PRIVATE void SIMIX_context_mod_exit(void); XBT_PRIVATE smx_context_t SIMIX_context_new( - xbt_main_func_t code, int argc, char **argv, + std::function code, void_pfn_smxprocess_t cleanup_func, smx_process_t simix_process); @@ -146,6 +177,8 @@ XBT_PRIVATE void SIMIX_post_create_environment(void); // FIXME, Dirty hack for SMPI+MSG XBT_PRIVATE void SIMIX_process_set_cleanup_function(smx_process_t process, void_pfn_smxprocess_t cleanup); +XBT_PRIVATE simgrid::simix::ActorCodeFactory& SIMIX_get_actor_code_factory(const char *name); + SG_END_DECL() #endif