Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Remove xbt_dict_t links from struct SD_global.
[simgrid.git] / src / simdag / sd_link.c
1 /* Copyright (c) 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 "private.h"
8 #include "simdag/simdag.h"
9 #include "xbt/dict.h"
10 #include "xbt/sysdep.h"
11 #include "surf/surf.h"
12
13 /* Creates a link and registers it in SD.
14  */
15 SD_link_t __SD_link_create(void *surf_link, void *data)
16 {
17
18   SD_link_t link;
19   const char *name;
20
21   SD_CHECK_INIT_DONE();
22   xbt_assert0(surf_link != NULL, "surf_link is NULL !");
23
24   link = xbt_new(s_SD_link_t, 1);
25   link->surf_link = surf_link;
26   link->data = data;            /* user data */
27   if (surf_workstation_model->extension.workstation.link_shared(surf_link))
28     link->sharing_policy = SD_LINK_SHARED;
29   else
30     link->sharing_policy = SD_LINK_FATPIPE;
31
32   name = SD_link_get_name(link);
33   xbt_lib_set(link_lib,name,SD_LINK_LEVEL,link);
34
35   return link;
36 }
37
38 /**
39  * \brief Returns the link list
40  *
41  * Use SD_link_get_number() to know the array size.
42  *
43  * \return an array of \ref SD_link_t containing all links
44  * \see SD_link_get_number()
45  */
46 const SD_link_t *SD_link_get_list(void)
47 {
48
49   xbt_lib_cursor_t cursor;
50   char *key;
51   void **data;
52   int i;
53
54   SD_CHECK_INIT_DONE();
55   xbt_assert0(SD_link_get_number() > 0, "There is no link!");
56
57   if (sd_global->link_list == NULL) {   /* this is the first time the function is called */
58     sd_global->link_list = xbt_new(SD_link_t, link_lib->count);
59
60     i = 0;
61     xbt_lib_foreach(link_lib, cursor, key, data) {
62                 sd_global->link_list[i++] = (SD_link_t) data[SD_LINK_LEVEL];
63     }
64   }
65   return sd_global->link_list;
66 }
67
68 /**
69  * \brief Returns the number of links
70  *
71  * \return the number of existing links
72  * \see SD_link_get_list()
73  */
74 int SD_link_get_number(void)
75 {
76   SD_CHECK_INIT_DONE();
77   return link_lib->count;
78 }
79
80 /**
81  * \brief Returns the user data of a link
82  *
83  * \param link a link
84  * \return the user data associated with this link (can be \c NULL)
85  * \see SD_link_set_data()
86  */
87 void *SD_link_get_data(SD_link_t link)
88 {
89   SD_CHECK_INIT_DONE();
90   xbt_assert0(link != NULL, "Invalid parameter");
91   return link->data;
92 }
93
94 /**
95  * \brief Sets the user data of a link
96  *
97  * The new data can be \c NULL. The old data should have been freed first
98  * if it was not \c NULL.
99  *
100  * \param link a link
101  * \param data the new data you want to associate with this link
102  * \see SD_link_get_data()
103  */
104 void SD_link_set_data(SD_link_t link, void *data)
105 {
106   SD_CHECK_INIT_DONE();
107   xbt_assert0(link != NULL, "Invalid parameter");
108   link->data = data;
109 }
110
111 /**
112  * \brief Returns the name of a link
113  *
114  * \param link a link
115  * \return the name of this link (cannot be \c NULL)
116  */
117 const char *SD_link_get_name(SD_link_t link)
118 {
119   SD_CHECK_INIT_DONE();
120   xbt_assert0(link != NULL, "Invalid parameter");
121   return surf_resource_name(link->surf_link);
122 }
123
124 /**
125  * \brief Returns the current bandwidth of a link
126  *
127  * \param link a link
128  * \return the current bandwidth of this link, in bytes per second
129  */
130 double SD_link_get_current_bandwidth(SD_link_t link)
131 {
132   SD_CHECK_INIT_DONE();
133   xbt_assert0(link != NULL, "Invalid parameter");
134   return surf_workstation_model->extension.workstation.
135       get_link_bandwidth(link->surf_link);
136 }
137
138 /**
139  * \brief Returns the current latency of a link
140  *
141  * \param link a link
142  * \return the current latency of this link, in seconds
143  */
144 double SD_link_get_current_latency(SD_link_t link)
145 {
146   SD_CHECK_INIT_DONE();
147   xbt_assert0(link != NULL, "Invalid parameter");
148   return surf_workstation_model->extension.workstation.
149       get_link_latency(link->surf_link);
150 }
151
152 /**
153  * \brief Returns the sharing policy of this workstation.
154  *
155  * \param link a link
156  * \return the sharing policyfor the flows going through this link:
157  * SD_LINK_SHARED or SD_LINK_FATPIPE
158  *
159  */
160 e_SD_link_sharing_policy_t SD_link_get_sharing_policy(SD_link_t link)
161 {
162   SD_CHECK_INIT_DONE();
163   xbt_assert0(link != NULL, "Invalid parameter");
164   return link->sharing_policy;
165 }
166
167
168 /* Destroys a link.
169  */
170 void __SD_link_destroy(void *link)
171 {
172   SD_CHECK_INIT_DONE();
173   xbt_assert0(link != NULL, "Invalid parameter");
174   /* link->surf_link is freed by surf_exit and link->data is freed by the user */
175   xbt_free(link);
176 }