Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
3a64215081c954cc0fbb65bbb98c95542aaee063
[simgrid.git] / src / msg / msg_host.c
1 /* Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010. 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 "msg/msg_private.h"
8 #include "msg/msg_mailbox.h"
9 #include "xbt/sysdep.h"
10 #include "xbt/log.h"
11 #include "simgrid/simix.h"
12
13 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg);
14
15 /** @addtogroup m_host_management
16  *     \htmlonly <!-- DOXYGEN_NAVBAR_LABEL="Hosts" --> \endhtmlonly
17  * (#msg_host_t) and the functions for managing it.
18  *  
19  *  A <em>location</em> (or <em>host</em>) is any possible place where
20  *  a process may run. Thus it may be represented as a
21  *  <em>physical resource with computing capabilities</em>, some
22  *  <em>mailboxes</em> to enable running process to communicate with
23  *  remote ones, and some <em>private data</em> that can be only
24  *  accessed by local process.
25  *  \see msg_host_t
26  */
27
28 /********************************* Host **************************************/
29 msg_host_t __MSG_host_create(smx_host_t workstation)
30 {
31   const char *name = SIMIX_host_get_name(workstation);
32   msg_host_priv_t priv = xbt_new0(s_msg_host_priv_t, 1);
33
34 #ifdef MSG_USE_DEPRECATED
35   int i;
36   char alias[MAX_ALIAS_NAME + 1] = { 0 };       /* buffer used to build the key of the mailbox */
37
38   if (msg_global->max_channel > 0)
39     priv->mailboxes = xbt_new0(msg_mailbox_t, msg_global->max_channel);
40
41   for (i = 0; i < msg_global->max_channel; i++) {
42     sprintf(alias, "%s:%d", name, i);
43
44     /* the key of the mailbox (in this case) is build from the name of the host and the channel number */
45     priv->mailboxes[i] = MSG_mailbox_new(alias);
46     memset(alias, 0, MAX_ALIAS_NAME + 1);
47   }
48 #endif
49
50
51   priv->dp_objs = xbt_dict_new();
52   priv->dp_enabled = 0;
53   priv->dp_updated_by_deleted_tasks = 0;
54
55   xbt_lib_set(host_lib, name, MSG_HOST_LEVEL, priv);
56   
57   return xbt_lib_get_elm_or_null(host_lib, name);
58 }
59
60
61 /** \ingroup msg_host_management
62  * \brief Finds a msg_host_t using its name.
63  *
64  * This is a name directory service
65  * \param name the name of an host.
66  * \return the corresponding host
67  */
68 msg_host_t MSG_get_host_by_name(const char *name)
69 {
70   return (msg_host_t) xbt_lib_get_elm_or_null(host_lib,name);
71 }
72
73 /** \ingroup m_host_management
74  *
75  * \brief Set the user data of a #msg_host_t.
76  *
77  * This functions checks whether some data has already been associated to \a host 
78    or not and attach \a data to \a host if it is possible.
79  */
80 msg_error_t MSG_host_set_data(msg_host_t host, void *data)
81 {
82   SIMIX_host_set_data(host,data);
83
84   return MSG_OK;
85 }
86
87 /** \ingroup m_host_management
88  *
89  * \brief Return the user data of a #msg_host_t.
90  *
91  * This functions checks whether \a host is a valid pointer or not and return
92    the user data associated to \a host if it is possible.
93  */
94 void *MSG_host_get_data(msg_host_t host)
95 {
96   return SIMIX_host_get_data(host);
97 }
98
99 /** \ingroup m_host_management
100  *
101  * \brief Return the name of the #msg_host_t.
102  *
103  * This functions checks whether \a host is a valid pointer or not and return
104    its name.
105  */
106 const char *MSG_host_get_name(msg_host_t host) {
107   return SIMIX_host_get_name(host);
108 }
109
110 /** \ingroup m_host_management
111  *
112  * \brief Return the location on which the current process is executed.
113  */
114 msg_host_t MSG_host_self(void)
115 {
116   return MSG_process_get_host(NULL);
117 }
118
119
120 /*
121  * \brief Start the host if it is off
122  */
123 void MSG_host_on(msg_host_t host)
124 {
125   simcall_host_on(host);
126 }
127
128 /*
129  * \brief Stop the host if it is on
130  */
131 void MSG_host_off(msg_host_t host)
132
133   simcall_host_off(host);
134 }
135
136 /*
137  * \brief Frees private data of a host (internal call only)
138  */
139 void __MSG_host_priv_free(msg_host_priv_t priv)
140 {
141   unsigned int size = xbt_dict_size(priv->dp_objs);
142   if (size > 0)
143     XBT_WARN("dp_objs: %u pending task?", size);
144   xbt_dict_free(&priv->dp_objs);
145
146 #ifdef MSG_USE_DEPRECATED
147   if (msg_global->max_channel > 0)
148     free(priv->mailboxes);
149 #endif
150
151   free(priv);
152 }
153
154 /*
155  * \brief Destroys a host (internal call only)
156  */
157 void __MSG_host_destroy(msg_host_t host)
158 {
159   const char *name = MSG_host_get_name(host);
160   /* TODO:
161    * What happens if VMs still remain on this host?
162    * Revisit here after the surf layer gets stable.
163    **/
164
165   xbt_lib_unset(host_lib, name, MSG_HOST_LEVEL, 1);
166 }
167
168 /** \ingroup m_host_management
169  * \brief Return the current number MSG hosts.
170  */
171 int MSG_get_host_number(void)
172 {
173   return xbt_lib_length(host_lib);
174 }
175
176 #ifdef MSG_USE_DEPRECATED
177 msg_host_t *MSG_get_host_table(void)
178 {
179       void **array;
180     int i = 0;
181     xbt_lib_cursor_t cursor;
182     char *key;
183     void **data;
184
185     if (xbt_lib_length(host_lib) == 0)
186     return NULL;
187     else
188     array = xbt_new0(void *, xbt_lib_length(host_lib));
189
190     xbt_lib_foreach(host_lib, cursor, key, data) {
191       if(routing_get_network_element_type(key) == SURF_NETWORK_ELEMENT_HOST)
192         array[i++] = data[MSG_HOST_LEVEL];
193     }
194
195     return (msg_host_t *)array;
196 }
197 #endif
198
199 /** \ingroup m_host_management
200  * \brief Return a dynar containing all the hosts declared at a given point of time
201  */
202 xbt_dynar_t MSG_hosts_as_dynar(void) {
203   xbt_lib_cursor_t cursor;
204   char *key;
205   void **data;
206   xbt_dynar_t res = xbt_dynar_new(sizeof(msg_host_t),NULL);
207
208   xbt_lib_foreach(host_lib, cursor, key, data) {
209     if(routing_get_network_element_type(key) == SURF_NETWORK_ELEMENT_HOST) {
210       xbt_dictelm_t elm = xbt_dict_cursor_get_elm(cursor);
211       xbt_dynar_push(res, &elm);
212     }
213   }
214   return res;
215 }
216
217 /** \ingroup m_host_management
218  * \brief Return the number of MSG tasks currently running on a
219  * #msg_host_t. The external load is not taken in account.
220  */
221 int MSG_get_host_msgload(msg_host_t h)
222 {
223   xbt_assert((h != NULL), "Invalid parameters");
224   xbt_die( "Not implemented yet");
225
226   return (0);
227 }
228
229 /** \ingroup m_host_management
230  * \brief Return the speed of the processor (in flop/s), regardless of 
231     the current load on the machine.
232  */
233 double MSG_get_host_speed(msg_host_t h)
234 {
235   xbt_assert((h != NULL), "Invalid parameters");
236
237   return (simcall_host_get_speed(h));
238 }
239
240
241 /** \ingroup m_host_management
242  * \brief Return the number of core.
243  */
244 int MSG_get_host_core(msg_host_t h)
245 {
246   xbt_assert((h != NULL), "Invalid parameters");
247
248   return (simcall_host_get_core(h));
249 }
250
251 /** \ingroup m_host_management
252  * \brief Returns the value of a given host property
253  *
254  * \param host a host
255  * \param name a property name
256  * \return value of a property (or NULL if property not set)
257  */
258 const char *MSG_host_get_property_value(msg_host_t host, const char *name)
259 {
260   return xbt_dict_get_or_null(MSG_host_get_properties(host), name);
261 }
262
263 /** \ingroup m_host_management
264  * \brief Returns a xbt_dict_t consisting of the list of properties assigned to this host
265  *
266  * \param host a host
267  * \return a dict containing the properties
268  */
269 xbt_dict_t MSG_host_get_properties(msg_host_t host)
270 {
271   xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
272
273   return (simcall_host_get_properties(host));
274 }
275
276 /** \ingroup m_host_management
277  * \brief Change the value of a given host property
278  *
279  * \param host a host
280  * \param name a property name
281  * \param value what to change the property to
282  * \param free_ctn the freeing function to use to kill the value on need
283  */
284 void MSG_host_set_property_value(msg_host_t host, const char *name, char *value,void_f_pvoid_t free_ctn) {
285
286   xbt_dict_set(MSG_host_get_properties(host), name, value,free_ctn);
287 }
288
289
290 /** \ingroup msg_gos_functions
291  * \brief Determine if a host is available.
292  *
293  * \param host host to test
294  * \return Returns 1 if host is available, 0 otherwise
295  */
296 int MSG_host_is_avail(msg_host_t host)
297 {
298   xbt_assert((host != NULL), "Invalid parameters (host is NULL)");
299   return (simcall_host_get_state(host));
300 }
301
302 /** \ingroup m_host_management
303  * \brief Set the parameters of a given host
304  *
305  * \param host a host
306  * \param params a prameter object
307  */
308 void MSG_host_set_params(msg_host_t ind_pm, ws_params_t params)
309 {
310   simcall_host_set_params(ind_pm, params);
311 }
312
313 /** \ingroup m_host_management
314  * \brief Get the parameters of a given host
315  *
316  * \param host a host
317  * \param params a prameter object
318  */
319 void MSG_host_get_params(msg_host_t ind_pm, ws_params_t params)
320 {
321   simcall_host_get_params(ind_pm, params);
322 }