X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b08cf565e62c980d3fa23c031b341ca4f1427bd9..0319431d6c2e70971f907c27e584d194104c7bb3:/src/simix/smx_private.h diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index 02907e5213..1808c16991 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -8,6 +8,11 @@ #define _SIMIX_PRIVATE_H #include +#include +#include + +#include + #include "src/internal_config.h" #include "simgrid/simix.h" @@ -58,37 +63,56 @@ 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 { + +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; +}; + +} +} + +SG_BEGIN_DECL() - xbt_os_mutex_t mutex; -} s_smx_global_t, *smx_global_t; +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 ************************************ */ @@ -150,4 +174,6 @@ XBT_PRIVATE void SIMIX_process_set_cleanup_function(smx_process_t process, void_ SG_END_DECL() +XBT_PRIVATE simgrid::simix::ActorCodeFactory& SIMIX_get_actor_code_factory(const char *name); + #endif