+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);
+void __SIMIX_create_maestro_process(void);
+
+/******************************** 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; \
+ ex_ctx_t *exception; \
+ xbt_main_func_t code; \
+
+/* 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);
+
+/* 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*);
+
+/* 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) (int);
+
+/* 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_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;
+ 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);
+
+/* ******************************* */
+/* contexts manipulation functions */
+/* ******************************* */
+
+/**
+ * \param smx_process the simix maestro process that contains this context
+ */
+static inline smx_context_t SIMIX_context_create_maestro()
+{
+ return (*(simix_global->context_factory->create_maestro_context)) ();
+}
+
+/**
+ * \param smx_process the simix process that contains this context
+ * \param code a main function
+ */
+static inline smx_context_t SIMIX_context_new(xbt_main_func_t code)
+{
+ return (*(simix_global->context_factory->create_context)) (code);
+}
+
+/* Scenario for the end of a context:
+ *
+ * CASE 1: death after end of function
+ * __context_wrapper, called by os thread, calls smx_context_stop after user code stops
+ * smx_context_stop calls user cleanup_func if any (in context settings),
+ * add current to trashbin
+ * yields back to maestro (destroy os thread on need)
+ * From time to time, maestro calls smx_context_empty_trash,
+ * which maps smx_context_free on the content
+ * smx_context_free frees some more memory,
+ * joins os thread
+ *
+ * CASE 2: brutal death
+ * smx_context_kill (from any context)
+ * set context->wannadie to 1
+ * yields to the context
+ * the context is awaken in the middle of __yield.
+ * At the end of it, it checks that wannadie == 1, and call smx_context_stop
+ * (same than first case afterward)
+ */
+
+/* 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);
+}
+
+/**
+ * \param context the context to start
+ *
+ * Calling this function prepares \a process to be run. It will
+ however run effectively only when calling #SIMIX_context_schedule
+ */
+static inline void SIMIX_context_start(smx_context_t context)
+{
+ (*(simix_global->context_factory->start)) (context);
+}
+
+static inline void SIMIX_context_stop(int exit_code)
+{
+ (*(simix_global->context_factory->stop)) (exit_code);
+}
+
+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);
+}
+
+static inline void SIMIX_context_suspend(smx_context_t context)
+{
+ (*(simix_global->context_factory->suspend)) (context);
+}