Logo AND Algorithmique Numérique Distribuée

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