Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove extern "C" from cpp files.
[simgrid.git] / src / simgrid / host.cpp
1 /* Copyright (c) 2013-2018. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include <algorithm>
7 #include <vector>
8
9 #include "simgrid/host.h"
10 #include "simgrid/s4u/Engine.hpp"
11 #include "simgrid/s4u/Host.hpp"
12 #include "xbt/Extendable.hpp"
13 #include "xbt/dict.h"
14
15 #include "simgrid/kernel/routing/NetPoint.hpp"
16 #include "src/simix/smx_host_private.hpp"
17 #include "src/surf/HostImpl.hpp"
18 #include "src/surf/cpu_interface.hpp"
19
20 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sg_host, sd, "Logging specific to sg_hosts");
21
22 size_t sg_host_count()
23 {
24   return simgrid::s4u::Engine::getInstance()->getHostCount();
25 }
26 /** @brief Returns the host list
27  *
28  * Uses sg_host_count() to know the array size.
29  *
30  * \return an array of \ref sg_host_t containing all the hosts in the platform.
31  * \remark The host order in this array is generally different from the
32  * creation/declaration order in the XML platform (we use a hash table
33  * internally).
34  * \see sg_host_count()
35  */
36 sg_host_t *sg_host_list() {
37   xbt_assert(sg_host_count() > 0, "There is no host!");
38   std::vector<simgrid::s4u::Host*> hosts = simgrid::s4u::Engine::getInstance()->getAllHosts();
39
40   sg_host_t* res = (sg_host_t*)malloc(sizeof(sg_host_t) * hosts.size());
41   memcpy(res, hosts.data(), sizeof(sg_host_t) * hosts.size());
42
43   return res;
44 }
45
46 const char *sg_host_get_name(sg_host_t host)
47 {
48   return host->getCname();
49 }
50
51 void* sg_host_extension_get(sg_host_t host, size_t ext)
52 {
53   return host->extension(ext);
54 }
55
56 size_t sg_host_extension_create(void(*deleter)(void*))
57 {
58   return simgrid::s4u::Host::extension_create(deleter);
59 }
60
61 sg_host_t sg_host_by_name(const char *name)
62 {
63   return simgrid::s4u::Host::by_name_or_null(name);
64 }
65
66 static int hostcmp_voidp(const void* pa, const void* pb)
67 {
68   return strcmp((*static_cast<simgrid::s4u::Host* const*>(pa))->getCname(),
69                 (*static_cast<simgrid::s4u::Host* const*>(pb))->getCname());
70 }
71
72 xbt_dynar_t sg_hosts_as_dynar()
73 {
74   xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t),nullptr);
75
76   std::vector<simgrid::s4u::Host*> list = simgrid::s4u::Engine::getInstance()->getAllHosts();
77
78   for (auto const& host : list) {
79     if (host && host->pimpl_netpoint && host->pimpl_netpoint->isHost())
80       xbt_dynar_push(res, &host);
81   }
82   xbt_dynar_sort(res, hostcmp_voidp);
83   return res;
84 }
85
86 // ========= Layering madness ==============*
87
88 // ========== User data Layer ==========
89 void *sg_host_user(sg_host_t host) {
90   return host->extension(USER_HOST_LEVEL);
91 }
92 void sg_host_user_set(sg_host_t host, void* userdata) {
93   host->extension_set(USER_HOST_LEVEL,userdata);
94 }
95 void sg_host_user_destroy(sg_host_t host) {
96   host->extension_set(USER_HOST_LEVEL, nullptr);
97 }
98
99 // ========= storage related functions ============
100 xbt_dict_t sg_host_get_mounted_storage_list(sg_host_t host){
101   xbt_assert((host != nullptr), "Invalid parameters");
102   xbt_dict_t res = xbt_dict_new_homogeneous(nullptr);
103   for (auto const& elm : host->getMountedStorages()) {
104     const char* mount_name = elm.first.c_str();
105     sg_storage_t storage   = elm.second;
106     xbt_dict_set(res, mount_name, (void*)storage->getCname(), nullptr);
107   }
108
109   return res;
110 }
111
112 xbt_dynar_t sg_host_get_attached_storage_list(sg_host_t host){
113   std::vector<const char*>* storage_vector = new std::vector<const char*>();
114   xbt_dynar_t storage_dynar = xbt_dynar_new(sizeof(const char*), nullptr);
115   host->getAttachedStorages(storage_vector);
116   for (auto const& name : *storage_vector)
117     xbt_dynar_push(storage_dynar, &name);
118   delete storage_vector;
119   return storage_dynar;
120 }
121
122 // =========== user-level functions ===============
123 // ================================================
124 /** @brief Returns the total speed of a host */
125 double sg_host_speed(sg_host_t host)
126 {
127   return host->getSpeed();
128 }
129
130 /** \brief Return the speed of the processor (in flop/s) at a given pstate. See also @ref plugin_energy.
131  *
132  * \param  host host to test
133  * \param pstate_index pstate to test
134  * \return Returns the processor speed associated with pstate_index
135  */
136 double sg_host_get_pstate_speed(sg_host_t host, int pstate_index)
137 {
138   return host->getPstateSpeed(pstate_index);
139 }
140
141 /** \ingroup m_host_management
142  * \brief Return the number of cores.
143  *
144  * \param host a host
145  * \return the number of cores
146  */
147 int sg_host_core_count(sg_host_t host)
148 {
149   return host->getCoreCount();
150 }
151
152 double sg_host_get_available_speed(sg_host_t host)
153 {
154   return host->pimpl_cpu->getAvailableSpeed();
155 }
156
157 /** @brief Returns the number of power states for a host.
158  *
159  *  See also @ref plugin_energy.
160  */
161 int sg_host_get_nb_pstates(sg_host_t host) {
162   return host->getPstatesCount();
163 }
164
165 /** @brief Gets the pstate at which that host currently runs.
166  *
167  *  See also @ref plugin_energy.
168  */
169 int sg_host_get_pstate(sg_host_t host) {
170   return host->getPstate();
171 }
172 /** @brief Sets the pstate at which that host should run.
173  *
174  *  See also @ref plugin_energy.
175  */
176 void sg_host_set_pstate(sg_host_t host,int pstate) {
177   host->setPstate(pstate);
178 }
179
180 /** \ingroup m_host_management
181  *
182  * \brief Start the host if it is off
183  *
184  * See also #sg_host_is_on() and #sg_host_is_off() to test the current state of the host and @ref plugin_energy
185  * for more info on DVFS.
186  */
187 void sg_host_turn_on(sg_host_t host)
188 {
189   host->turnOn();
190 }
191
192 /** \ingroup m_host_management
193  *
194  * \brief Stop the host if it is on
195  *
196  * See also #MSG_host_is_on() and #MSG_host_is_off() to test the current state of the host and @ref plugin_energy
197  * for more info on DVFS.
198  */
199 void sg_host_turn_off(sg_host_t host)
200 {
201   host->turnOff();
202 }
203
204 /** @ingroup m_host_management
205  * @brief Determine if a host is up and running.
206  *
207  * See also #sg_host_turn_on() and #sg_host_turn_off() to switch the host ON and OFF and @ref plugin_energy for more
208  * info on DVFS.
209  *
210  * @param host host to test
211  * @return Returns true if the host is up and running, and false if it's currently down
212  */
213 int sg_host_is_on(sg_host_t host)
214 {
215   return host->isOn();
216 }
217
218 /** @ingroup m_host_management
219  * @brief Determine if a host is currently off.
220  *
221  * See also #sg_host_turn_on() and #sg_host_turn_off() to switch the host ON and OFF and @ref plugin_energy for more
222  * info on DVFS.
223  */
224 int sg_host_is_off(sg_host_t host)
225 {
226   return host->isOff();
227 }
228
229 /** @brief Get the properties of an host */
230 xbt_dict_t sg_host_get_properties(sg_host_t host) {
231   xbt_dict_t as_dict = xbt_dict_new_homogeneous(xbt_free_f);
232   std::map<std::string, std::string>* props = host->getProperties();
233   if (props == nullptr)
234     return nullptr;
235   for (auto const& elm : *props) {
236     xbt_dict_set(as_dict, elm.first.c_str(), xbt_strdup(elm.second.c_str()), nullptr);
237   }
238   return as_dict;
239 }
240
241 /** \ingroup m_host_management
242  * \brief Returns the value of a given host property
243  *
244  * \param host a host
245  * \param name a property name
246  * \return value of a property (or nullptr if property not set)
247 */
248 const char *sg_host_get_property_value(sg_host_t host, const char *name)
249 {
250   return host->getProperty(name);
251 }
252
253 void sg_host_set_property_value(sg_host_t host, const char* name, const char* value)
254 {
255   host->setProperty(name, value);
256 }
257
258 /**
259  * \brief Find a route between two hosts
260  *
261  * \param from where from
262  * \param to where to
263  * \param links [OUT] where to store the list of links (must exist, cannot be nullptr).
264  */
265 void sg_host_route(sg_host_t from, sg_host_t to, xbt_dynar_t links)
266 {
267   std::vector<simgrid::s4u::Link*> vlinks;
268   from->routeTo(to, vlinks, nullptr);
269   for (auto const& link : vlinks)
270     xbt_dynar_push(links, &link);
271 }
272 /**
273  * \brief Find the latency of the route between two hosts
274  *
275  * \param from where from
276  * \param to where to
277  */
278 double sg_host_route_latency(sg_host_t from, sg_host_t to)
279 {
280   std::vector<simgrid::s4u::Link*> vlinks;
281   double res = 0;
282   from->routeTo(to, vlinks, &res);
283   return res;
284 }
285 /**
286  * \brief Find the bandwitdh of the route between two hosts
287  *
288  * \param from where from
289  * \param to where to
290  */
291 double sg_host_route_bandwidth(sg_host_t from, sg_host_t to)
292 {
293   double min_bandwidth = -1.0;
294
295   std::vector<simgrid::s4u::Link*> vlinks;
296   from->routeTo(to, vlinks, nullptr);
297   for (auto const& link : vlinks) {
298     double bandwidth = link->bandwidth();
299     if (bandwidth < min_bandwidth || min_bandwidth < 0.0)
300       min_bandwidth = bandwidth;
301   }
302   return min_bandwidth;
303 }
304
305 /** @brief Displays debugging information about a host */
306 void sg_host_dump(sg_host_t host)
307 {
308   XBT_INFO("Displaying host %s", host->getCname());
309   XBT_INFO("  - speed: %.0f", host->getSpeed());
310   XBT_INFO("  - available speed: %.2f", sg_host_get_available_speed(host));
311   std::map<std::string, std::string>* props = host->getProperties();
312
313   if (not props->empty()) {
314     XBT_INFO("  - properties:");
315     for (auto const& elm : *props) {
316       XBT_INFO("    %s->%s", elm.first.c_str(), elm.second.c_str());
317     }
318   }
319 }
320
321 /** \brief Return the list of actors attached to an host.
322  *
323  * \param host a host
324  * \param whereto a dynar in which we should push actors living on that host
325  */
326 void sg_host_get_actor_list(sg_host_t host, xbt_dynar_t whereto)
327 {
328   for (auto& actor : host->extension<simgrid::simix::Host>()->process_list) {
329     s4u_Actor* p = actor.ciface();
330     xbt_dynar_push(whereto, &p);
331   }
332 }
333
334 sg_host_t sg_host_self()
335 {
336   smx_actor_t process = SIMIX_process_self();
337   return (process == nullptr) ? nullptr : process->host;
338 }