+void __SIMIX_host_destroy(void *host);
+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);
+
+/******************************** Context *************************************/
+
+void SIMIX_context_mod_init(void);
+
+void SIMIX_context_mod_exit(void);
+
+/* *********************** */
+/* Context type definition */
+/* *********************** */
+/* the following function pointers types describe the interface that all context
+ concepts must implement */
+
+/* each context type must contain this macro at its begining -- OOP in C :/ */
+#define SMX_CTX_BASE_T \
+ s_xbt_swag_hookup_t hookup; \
+ xbt_main_func_t code; \
+ int argc; \
+ char **argv; \
+ void_f_pvoid_t cleanup_func; \
+ void *cleanup_arg; \
+
+/* all other context types derive from this structure */
+typedef struct s_smx_context {
+ SMX_CTX_BASE_T;
+} s_smx_context_t;
+
+/* *********************** */
+/* factory type definition */
+/* *********************** */
+
+/* Each context implementation define its own context factory
+ * A context factory is responsable of the creation and manipulation of the
+ * execution context of all the simulated processes (and maestro) using the
+ * selected implementation.
+ *
+ * For example, the context switch based on java thread use the
+ * java implementation of the context and the java factory to build and control
+ * the contexts depending on this implementation.
+
+ * The following function pointer types describe the interface that any context
+ * factory should implement.
+ */
+
+/* function used to create a new context */
+typedef smx_context_t (*smx_pfn_context_factory_create_context_t)
+ (xbt_main_func_t, int, char**, void_f_pvoid_t, void*);
+
+/* this function finalize the specified context factory */
+typedef int (*smx_pfn_context_factory_finalize_t) (smx_context_factory_t*);
+
+/* function used to destroy the specified context */
+typedef void (*smx_pfn_context_free_t) (smx_context_t);
+
+/* function used to start the specified context */
+typedef void (*smx_pfn_context_start_t) (smx_context_t);
+
+/* function used to stop the current context */
+typedef void (*smx_pfn_context_stop_t) (smx_context_t);
+
+/* function used to suspend the current context */
+typedef void (*smx_pfn_context_suspend_t) (smx_context_t context);
+
+/* function used to resume the current context */
+typedef void (*smx_pfn_context_resume_t) (smx_context_t old_context,
+ smx_context_t new_context);
+
+/* interface of the context factories */
+typedef struct s_smx_context_factory {
+ smx_pfn_context_factory_create_context_t create_context;
+ smx_pfn_context_factory_finalize_t finalize;
+ smx_pfn_context_free_t free;
+ smx_pfn_context_start_t start;
+ smx_pfn_context_stop_t stop;
+ smx_pfn_context_suspend_t suspend;
+ smx_pfn_context_resume_t resume;
+ const char *name;
+} s_smx_context_factory_t;
+
+/* 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_java_factory_init(smx_context_factory_t * factory);
+
+/* ****************************** */
+/* context manipulation functions */
+/* ****************************** */
+
+/* Scenario for the end of a context:
+ *
+ * CASE 1: death after end of the main function
+ * the context_wrapper, called internally by the context module, calls
+ * SIMIX_context_stop after user code stops, smx_context_stop calls user
+ * cleanup_func if any (in context settings), add current process to trashbin
+ * and yields back to maestro.
+ * From time to time, maestro calls SIMIX_context_empty_trash, which destroy
+ * all the process and context data structures, and frees the memory
+ *
+ * CASE 2: brutal death
+ * SIMIX_process_kill (from any process) set process->iwannadie = 1 and then
+ * schedules the process. Then the process is awaken in the middle of the
+ * SIMIX_process_yield function, and at the end of it, it checks that
+ * iwannadie == 1, and call SIMIX_context_stop(same than first case afterward)
+ */
+
+/**
+ * \brief creates a new context for a user level process
+ * \param code a main function
+ * \param argc the number of arguments of the main function
+ * \param argv the vector of arguments of the main function
+ * \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)
+{
+ return (*(simix_global->context_factory->create_context))
+ (code, argc, argv, cleanup_func, cleanup_arg);
+}
+
+/**
+ * \brief destroy a context
+ * \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)
+{
+ (*(simix_global->context_factory->free)) (context);
+}
+
+/**
+ * \brief prepares aa context to be run
+ * \param context the context to start
+ * It will however run effectively only when calling #SIMIX_process_schedule
+ */
+static inline void SIMIX_context_start(smx_context_t context)
+{
+ (*(simix_global->context_factory->start)) (context);
+}
+
+/**
+ * \brief stops the execution of a context
+ * \param context to stop
+ */
+static inline void SIMIX_context_stop(smx_context_t context)
+{
+ (*(simix_global->context_factory->stop)) (context);
+}
+
+/**
+ \brief resumes the execution of a 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 old_context,
+ smx_context_t new_context)
+{
+ (*(simix_global->context_factory->resume)) (old_context, new_context);
+}
+
+/**
+ \brief suspends a context and return the control back to the one which
+ 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)
+{
+ (*(simix_global->context_factory->suspend)) (context);
+}