1 /* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #ifndef SIMGRID_SIMIX_PRIVATE_HPP
8 #define SIMGRID_SIMIX_PRIVATE_HPP
10 #include <simgrid/simix.hpp>
11 #include "smx_private.h"
12 #include "src/simix/popping_private.h"
15 * \brief destroy a context
16 * \param context the context to destroy
17 * Argument must be stopped first -- runs in maestro context
19 static XBT_INLINE void SIMIX_context_free(smx_context_t context)
25 * \brief stops the execution of a context
26 * \param context to stop
28 static XBT_INLINE void SIMIX_context_stop(smx_context_t context)
34 \brief suspends a context and return the control back to the one which
36 \param context the context to be suspended (it must be the running one)
38 static XBT_INLINE void SIMIX_context_suspend(smx_context_t context)
44 \brief Executes all the processes to run (in parallel if possible).
46 static XBT_INLINE void SIMIX_context_runall(void)
48 if (!xbt_dynar_is_empty(simix_global->process_to_run))
49 simix_global->context_factory->run_all();
53 \brief returns the current running context
55 static XBT_INLINE smx_context_t SIMIX_context_self(void)
57 if (simix_global && simix_global->context_factory)
58 return simix_global->context_factory->self();
64 \brief returns the SIMIX process associated to a context
65 \param context The context
66 \return The SIMIX process
68 static XBT_INLINE smx_process_t SIMIX_context_get_process(smx_context_t context)
70 return context->process();
76 XBT_PRIVATE ContextFactory* thread_factory();
77 XBT_PRIVATE ContextFactory* sysv_factory();
78 XBT_PRIVATE ContextFactory* raw_factory();
79 XBT_PRIVATE ContextFactory* boost_factory();
81 template<class R, class... Args> inline
82 R simcall(e_smx_simcall_t call, Args&&... args)
84 smx_process_t self = SIMIX_process_self();
85 marshal(&self->simcall, call, std::forward<Args>(args)...);
87 return unmarshal<R>(self->simcall.result);