Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
sort Context files
[simgrid.git] / src / simix / smx_private.hpp
1 /* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
7 #ifndef SIMGRID_SIMIX_PRIVATE_HPP
8 #define SIMGRID_SIMIX_PRIVATE_HPP
9
10 #include <simgrid/simix.hpp>
11 #include "smx_private.h"
12 #include "src/simix/popping_private.h"
13
14 /**
15  * \brief destroy a context
16  * \param context the context to destroy
17  * Argument must be stopped first -- runs in maestro context
18  */
19 static inline void SIMIX_context_free(smx_context_t context)
20 {
21   delete context;
22 }
23
24 /**
25  * \brief stops the execution of a context
26  * \param context to stop
27  */
28 static inline void SIMIX_context_stop(smx_context_t context)
29 {
30   context->stop();
31 }
32
33 /**
34  \brief suspends a context and return the control back to the one which
35         scheduled it
36  \param context the context to be suspended (it must be the running one)
37  */
38 static inline void SIMIX_context_suspend(smx_context_t context)
39 {
40   context->suspend();
41 }
42
43 /**
44  \brief Executes all the processes to run (in parallel if possible).
45  */
46 static inline void SIMIX_context_runall(void)
47 {
48   if (!xbt_dynar_is_empty(simix_global->process_to_run))
49     simix_global->context_factory->run_all();
50 }
51
52 /**
53  \brief returns the current running context
54  */
55 static inline smx_context_t SIMIX_context_self(void)
56 {
57   if (simix_global && simix_global->context_factory)
58     return simix_global->context_factory->self();
59   else
60     return nullptr;
61 }
62
63 namespace simgrid {
64 namespace simix {
65
66 XBT_PRIVATE ContextFactory* thread_factory();
67 XBT_PRIVATE ContextFactory* sysv_factory();
68 XBT_PRIVATE ContextFactory* raw_factory();
69 XBT_PRIVATE ContextFactory* boost_factory();
70
71 template<class R, class... Args> inline
72 R simcall(e_smx_simcall_t call, Args&&... args)
73 {
74   smx_process_t self = SIMIX_process_self();
75   marshal(&self->simcall, call, std::forward<Args>(args)...);
76   simcall_call(self);
77   return unmarshal<R>(self->simcall.result);
78 }
79
80 }
81 }
82
83 #endif