Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
dde553a2031b3d064c151adcbee5dbd95f264b7d
[simgrid.git] / src / msg / msg_host.cpp
1 /* Copyright (c) 2004-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 #include "src/msg/msg_private.h"
8 #include "src/msg/msg_mailbox.h"
9 #include "xbt/sysdep.h"
10 #include "xbt/log.h"
11 #include "simgrid/simix.h"
12 #include <simgrid/s4u/host.hpp>
13
14 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg);
15
16 /** @addtogroup m_host_management
17  * \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Hosts" --> \endhtmlonly
18  * (#msg_host_t) and the functions for managing it.
19  *  
20  *  A <em>location</em> (or <em>host</em>) is any possible place where
21  *  a process may run. Thus it may be represented as a
22  *  <em>physical resource with computing capabilities</em>, some
23  *  <em>mailboxes</em> to enable running process to communicate with
24  *  remote ones, and some <em>private data</em> that can be only
25  *  accessed by local process.
26  *  \see msg_host_t
27  */
28
29 /********************************* Host **************************************/
30 msg_host_t __MSG_host_create(sg_host_t host) // FIXME: don't return our parameter
31 {
32   msg_host_priv_t priv = xbt_new0(s_msg_host_priv_t, 1);
33
34   priv->dp_objs = xbt_dict_new();
35   priv->dp_enabled = 0;
36   priv->dp_updated_by_deleted_tasks = 0;
37   priv->is_migrating = 0;
38
39   priv->affinity_mask_db = xbt_dict_new_homogeneous(NULL);
40
41   priv->file_descriptor_table = xbt_dynar_new(sizeof(int), NULL);
42   for (int i=1023; i>=0;i--)
43     xbt_dynar_push_as(priv->file_descriptor_table, int, i);
44
45   sg_host_msg_set(host,priv);
46   
47   return host;
48 }
49
50 /** \ingroup m_host_management
51  * \brief Finds a msg_host_t using its name.
52  *
53  * This is a name directory service
54  * \param name the name of an host.
55  * \return the corresponding host
56  */
57 msg_host_t MSG_host_by_name(const char *name)
58 {
59   return simgrid::s4u::Host::by_name_or_null(name);
60 }
61
62 /** \ingroup m_host_management
63  *
64  * \brief Set the user data of a #msg_host_t.
65  *
66  * This functions checks whether some data has already been associated to \a host
67    or not and attach \a data to \a host if it is possible.
68  */
69 msg_error_t MSG_host_set_data(msg_host_t host, void *data) {
70   sg_host_user_set(host, data);
71   return MSG_OK;
72 }
73
74 /** \ingroup m_host_management
75  *
76  * \brief Return the user data of a #msg_host_t.
77  *
78  * This functions checks whether \a host is a valid pointer or not and return
79    the user data associated to \a host if it is possible.
80  */
81 void *MSG_host_get_data(msg_host_t host) {
82   return sg_host_user(host);
83 }
84
85 /** \ingroup m_host_management
86  *
87  * \brief Return the location on which the current process is executed.
88  */
89 msg_host_t MSG_host_self(void)
90 {
91   return MSG_process_get_host(NULL);
92 }
93
94
95 /** \ingroup m_host_management
96  *
97  * \brief Start the host if it is off
98  *
99  * See also #MSG_host_is_on() and #MSG_host_is_off() to test the current state of the host and @ref SURF_plugin_energy for more info on DVFS.
100  */
101 void MSG_host_on(msg_host_t host)
102 {
103   host->turnOn();
104 }
105
106 /** \ingroup m_host_management
107  *
108  * \brief Stop the host if it is on
109  *
110  * See also #MSG_host_is_on() and #MSG_host_is_off() to test the current state of the host and @ref SURF_plugin_energy for more info on DVFS.
111  */
112 void MSG_host_off(msg_host_t host)
113 {
114   host->turnOff();
115 }
116
117 /*
118  * \brief Frees private data of a host (internal call only)
119  */
120 void __MSG_host_priv_free(msg_host_priv_t priv)
121 {
122
123   if (priv == NULL)
124     return;
125   unsigned int size = xbt_dict_size(priv->dp_objs);
126   if (size > 0)
127     XBT_WARN("dp_objs: %u pending task?", size);
128   xbt_dict_free(&priv->dp_objs);
129   xbt_dict_free(&priv->affinity_mask_db);
130   xbt_dynar_free(&priv->file_descriptor_table);
131
132   free(priv);
133 }
134
135 /** \ingroup m_host_management
136  * \brief Return the current number MSG hosts.
137  */
138 int MSG_get_host_number(void)
139 {
140   return xbt_dict_length(host_list);
141 }
142
143 /** \ingroup m_host_management
144  * \brief Return a dynar containing all the hosts declared at a given point of time
145  * \remark The host order in the returned array is generally different from the host creation/declaration order in the XML platform (we use a hash table internally)
146  */
147 xbt_dynar_t MSG_hosts_as_dynar(void) {
148   return sg_hosts_as_dynar();
149 }
150
151 /** \ingroup m_host_management
152  * \brief Return the speed of the processor (in flop/s), regardless of 
153     the current load on the machine.
154  */
155 double MSG_get_host_speed(msg_host_t host) {
156   return host->speed();
157 }
158
159
160 /** \ingroup m_host_management
161  * \brief Return the number of cores.
162  *
163  * \param host a host
164  * \return the number of cores
165  */
166 int MSG_host_get_core_number(msg_host_t host) {
167   return host->core_count();
168 }
169
170 /** \ingroup m_host_management
171  * \brief Return the list of processes attached to an host.
172  *
173  * \param host a host
174  * \return a swag with the attached processes
175  */
176 xbt_swag_t MSG_host_get_process_list(msg_host_t host)
177 {
178   xbt_assert((host != NULL), "Invalid parameters");
179   return host->processes();
180 }
181
182
183 /** \ingroup m_host_management
184  * \brief Returns the value of a given host property
185  *
186  * \param host a host
187  * \param name a property name
188  * \return value of a property (or NULL if property not set)
189  */
190 const char *MSG_host_get_property_value(msg_host_t host, const char *name)
191 {
192   return (const char*) xbt_dict_get_or_null(MSG_host_get_properties(host), name);
193 }
194
195 /** \ingroup m_host_management
196  * \brief Returns a xbt_dict_t consisting of the list of properties assigned to this host
197  *
198  * \param host a host
199  * \return a dict containing the properties
200  */
201 xbt_dict_t MSG_host_get_properties(msg_host_t host)
202 {
203   xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
204   return host->properties();
205 }
206
207 /** \ingroup m_host_management
208  * \brief Change the value of a given host property
209  *
210  * \param host a host
211  * \param name a property name
212  * \param value what to change the property to
213  * \param free_ctn the freeing function to use to kill the value on need
214  */
215 void MSG_host_set_property_value(msg_host_t host, const char *name, char *value,void_f_pvoid_t free_ctn) {
216
217   xbt_dict_set(MSG_host_get_properties(host), name, value,free_ctn);
218 }
219
220
221 /** @ingroup m_host_management
222  *
223  * @brief Determine if a host is up and running.
224  *
225  * See also #MSG_host_on() and #MSG_host_off() to switch the host ON and OFF and @ref SURF_plugin_energy for more info on DVFS.
226  *
227  * @param host host to test
228  * @return Returns true if the host is up and running, and false if it's currently down
229  */
230 int MSG_host_is_on(msg_host_t host)
231 {
232   xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
233   return sg_host_is_on(host);
234 }
235 /** @ingroup m_host_management
236  *
237  * @brief Determine if a host is currently off.
238  *
239  * See also #MSG_host_on() and #MSG_host_off() to switch the host ON and OFF and @ref SURF_plugin_energy for more info on DVFS.
240  */
241 int MSG_host_is_off(msg_host_t host)
242 {
243   xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
244   return !(sg_host_is_on(host));
245 }
246
247 /** \ingroup m_host_management
248  * \brief Set the parameters of a given host
249  *
250  * \param host a host
251  * \param params a prameter object
252  */
253 void MSG_host_set_params(msg_host_t host, vm_params_t params)
254 {
255   host->setParameters(params);
256 }
257
258 /** \ingroup m_host_management
259  * \brief Get the parameters of a given host
260  *
261  * \param host a host
262  * \param params a prameter object
263  */
264 void MSG_host_get_params(msg_host_t host, vm_params_t params)
265 {
266   host->parameters(params);
267 }
268
269 /** \ingroup m_host_management
270  * \brief Return the speed of the processor (in flop/s) at a given pstate. See also @ref SURF_plugin_energy.
271  *
272  * \param  host host to test
273  * \param pstate_index pstate to test
274  * \return Returns the processor speed associated with pstate_index
275  */
276 double MSG_host_get_power_peak_at(msg_host_t host, int pstate_index) {
277     xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
278     return host->powerPeakAt(pstate_index);
279 }
280
281 /** \ingroup m_host_management
282  * \brief Return the current speed of the processor (in flop/s)
283  *
284  * \param  host host to test
285  * \return Returns the current processor speed
286  */
287 double MSG_host_get_current_power_peak(msg_host_t host) {
288     xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
289     return host->currentPowerPeak();
290 }
291
292 /** \ingroup m_host_management
293  * \brief Return the total count of pstates defined for a host. See also @ref SURF_plugin_energy.
294  *
295  * \param  host host to test
296  */
297 int MSG_host_get_nb_pstates(msg_host_t host) {
298     return sg_host_get_nb_pstates(host);
299 }
300
301 /** \ingroup m_host_management
302  * \brief Return the list of mount point names on an host.
303  * \param host a host
304  * \return a dict containing all mount point on the host (mount_name => msg_storage_t)
305  */
306 xbt_dict_t MSG_host_get_mounted_storage_list(msg_host_t host)
307 {
308   xbt_assert((host != NULL), "Invalid parameters");
309   return host->mountedStoragesAsDict();
310 }
311
312 /** \ingroup m_host_management
313  * \brief Return the list of storages attached to an host.
314  * \param host a host
315  * \return a dynar containing all storages (name) attached to the host
316  */
317 xbt_dynar_t MSG_host_get_attached_storage_list(msg_host_t host)
318 {
319   xbt_assert((host != NULL), "Invalid parameters");
320   return host->attachedStorages();
321 }
322
323 /** \ingroup m_host_management
324  * \brief Return the content of mounted storages on an host.
325  * \param host a host
326  * \return a dict containing content (as a dict) of all storages mounted on the host
327  */
328 xbt_dict_t MSG_host_get_storage_content(msg_host_t host)
329 {
330   xbt_assert((host != NULL), "Invalid parameters");
331   xbt_dict_t contents = xbt_dict_new_homogeneous(NULL);
332   msg_storage_t storage;
333   char* storage_name;
334   char* mount_name;
335   xbt_dict_cursor_t cursor = NULL;
336
337   xbt_dict_t storage_list = host->mountedStoragesAsDict();
338
339   xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){
340     storage = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib,storage_name);
341     xbt_dict_t content = simcall_storage_get_content(storage);
342     xbt_dict_set(contents,mount_name, content,NULL);
343   }
344   xbt_dict_free(&storage_list);
345   return contents;
346 }
347
348 int __MSG_host_get_file_descriptor_id(msg_host_t host){
349   msg_host_priv_t priv = sg_host_msg(host);
350   xbt_assert(!xbt_dynar_is_empty(priv->file_descriptor_table),
351     "Too much files are opened! Some have to be closed.");
352   return xbt_dynar_pop_as(priv->file_descriptor_table, int);
353 }
354
355 void __MSG_host_release_file_descriptor_id(msg_host_t host, int id){
356   msg_host_priv_t priv = sg_host_msg(host);
357   xbt_dynar_push_as(priv->file_descriptor_table, int, id);
358 }