Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fe3d4fd611a85a236474018d23ee4922800a2b58
[simgrid.git] / include / simgrid / simix.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_HPP
8 #define SIMGRID_SIMIX_HPP
9
10 #include <cstddef>
11
12 #include <string>
13 #include <utility>
14 #include <memory>
15 #include <functional>
16
17 #include <xbt/function_types.h>
18 #include <xbt/future.hpp>
19 #include <xbt/functional.hpp>
20
21 #include <simgrid/simix.h>
22
23 XBT_PUBLIC(void) simcall_run_kernel(std::function<void()> const& code);
24
25 /** Execute some code in the kernel and block
26  *
27  * run_blocking() is a generic blocking simcall. It is given a callback
28  * which is executed immediately in the SimGrid kernel. The callback is
29  * responsible for setting the suitable logic for waking up the process
30  * when needed.
31  *
32  * @ref simix::kernelSync() is a higher level wrapper for this.
33  */
34 XBT_PUBLIC(void) simcall_run_blocking(std::function<void()> const& code);
35
36 template<class F> inline
37 void simcall_run_kernel(F& f)
38 {
39   simcall_run_kernel(std::function<void()>(std::ref(f)));
40 }
41 template<class F> inline
42 void simcall_run_blocking(F& f)
43 {
44   simcall_run_blocking(std::function<void()>(std::ref(f)));
45 }
46
47 namespace simgrid {
48
49 namespace simix {
50
51 /** Execute some code in the kernel/maestro
52  *
53  *  This can be used to enforce mutual exclusion with other simcall.
54  *  More importantly, this enforces a deterministic/reproducible ordering
55  *  of the operation with respect to other simcalls.
56  */
57 template<class F>
58 typename std::result_of<F()>::type kernelImmediate(F&& code)
59 {
60   // If we are in the maestro, we take the fast path and execute the
61   // code directly without simcall mashalling/unmarshalling/dispatch:
62   if (SIMIX_is_maestro())
63     return std::forward<F>(code)();
64
65   // If we are in the application, pass the code to the maestro which
66   // executes it for us and reports the result. We use a std::future which
67   // conveniently handles the success/failure value for us.
68   typedef typename std::result_of<F()>::type R;
69   simgrid::xbt::Result<R> result;
70   simcall_run_kernel([&]{
71     xbt_assert(SIMIX_is_maestro(), "Not in maestro");
72     simgrid::xbt::fulfillPromise(result, std::forward<F>(code));
73   });
74   return result.get();
75 }
76
77
78 XBT_PUBLIC(void) set_maestro(std::function<void()> code);
79 XBT_PUBLIC(void) create_maestro(std::function<void()> code);
80
81 // What's executed as SIMIX actor code:
82 typedef std::function<void()> ActorCode;
83
84 // Create ActorCode based on argv:
85 typedef std::function<ActorCode(std::vector<std::string> args)> ActorCodeFactory;
86
87 XBT_PUBLIC(void) registerFunction(const char* name, ActorCodeFactory factory);
88
89 }
90 }
91
92 /*
93  * Type of function that creates a process.
94  * The function must accept the following parameters:
95  * void* process: the process created will be stored there
96  * const char *name: a name for the object. It is for user-level information and can be NULL
97  * xbt_main_func_t code: is a function describing the behavior of the process
98  * void *data: data a pointer to any data one may want to attach to the new object.
99  * sg_host_t host: the location where the new process is executed
100  * int argc, char **argv: parameters passed to code
101  * xbt_dict_t pros: properties
102  */
103 typedef smx_actor_t (*smx_creation_func_t) (
104                                       /* name */ const char*,
105                                       std::function<void()> code,
106                                       /* userdata */ void*,
107                                       /* hostname */ const char*,
108                                       /* kill_time */ double,
109                                       /* props */ xbt_dict_t,
110                                       /* auto_restart */ int,
111                                       /* parent_process */ smx_actor_t);
112
113 extern "C"
114 XBT_PUBLIC(void) SIMIX_function_register_process_create(smx_creation_func_t function);
115
116 XBT_PUBLIC(smx_actor_t) simcall_process_create(const char *name,
117                                           std::function<void()> code,
118                                           void *data,
119                                           const char *hostname,
120                                           double kill_time,
121                                           xbt_dict_t properties,
122                                           int auto_restart);
123
124 XBT_PUBLIC(smx_timer_t) SIMIX_timer_set(double date, simgrid::xbt::Task<void()> callback);
125
126 template<class F> inline
127 XBT_PUBLIC(smx_timer_t) SIMIX_timer_set(double date, F callback)
128 {
129   return SIMIX_timer_set(date, simgrid::xbt::Task<void()>(std::move(callback)));
130 }
131
132 template<class R, class T> inline
133 XBT_PUBLIC(smx_timer_t) SIMIX_timer_set(double date, R(*callback)(T*), T* arg)
134 {
135   return SIMIX_timer_set(date, [=](){ callback(arg); });
136 }
137
138 #endif