Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add end line in msg_mailbox* files and add the file msg_mailbox.c in Makefile.am
[simgrid.git] / src / msg / msg_mailbox.c
1 #include "msg_mailbox.h"\r
2 #include "msg/private.h"\r
3 \r
4 static xbt_dict_t \r
5 msg_mailboxes = NULL;\r
6 \r
7 xbt_dict_t\r
8 MSG_get_mailboxes(void)\r
9 {\r
10         return msg_mailboxes;\r
11 }\r
12 \r
13 void\r
14 MSG_mailbox_mod_init(void)\r
15 {\r
16         msg_mailboxes = xbt_dict_new(); \r
17 }\r
18 \r
19 void\r
20 MSG_mailbox_mod_exit(void)\r
21 {\r
22         xbt_dict_free(&msg_mailboxes);\r
23 }\r
24 \r
25 msg_mailbox_t\r
26 MSG_mailbox_new(const char *alias)\r
27 {\r
28         msg_mailbox_t mailbox = xbt_new0(s_msg_mailbox_t,1);\r
29         \r
30         mailbox->tasks = xbt_fifo_new();\r
31         mailbox->cond = NULL;\r
32         mailbox->alias = xbt_strdup(alias);\r
33         mailbox->hostname = NULL;\r
34         \r
35         /* add the mbox in the dictionary */\r
36         xbt_dict_set(msg_mailboxes, alias, mailbox, MSG_mailbox_free);\r
37         \r
38         return mailbox;\r
39 }\r
40 \r
41 void\r
42 MSG_mailbox_destroy(msg_mailbox_t* mailbox)\r
43 {\r
44         xbt_dict_remove(msg_mailboxes,(*mailbox)->alias);\r
45 \r
46         if(NULL != ((*mailbox)->hostname))\r
47                 free((*mailbox)->hostname);\r
48 \r
49         \r
50         free((*mailbox)->alias);\r
51         \r
52         free(*mailbox);\r
53         \r
54         *mailbox = NULL;        \r
55 }\r
56 \r
57 void\r
58 MSG_mailbox_put(msg_mailbox_t mailbox, m_task_t task)\r
59 {\r
60         xbt_fifo_push(mailbox->tasks, task);\r
61 }\r
62 \r
63 smx_cond_t\r
64 MSG_mailbox_get_cond(msg_mailbox_t mailbox)\r
65 {\r
66         return mailbox->cond;\r
67 }\r
68 \r
69 void\r
70 MSG_mailbox_remove(msg_mailbox_t mailbox, m_task_t task)\r
71 {\r
72         xbt_fifo_remove(mailbox->tasks,task);\r
73 }\r
74 \r
75 int\r
76 MSG_mailbox_is_empty(msg_mailbox_t mailbox)\r
77 {\r
78         return (NULL == xbt_fifo_get_first_item(mailbox->tasks));\r
79 }\r
80 \r
81 m_task_t\r
82 MSG_mailbox_pop_head(msg_mailbox_t mailbox)\r
83 {\r
84         return (m_task_t)xbt_fifo_shift(mailbox->tasks);\r
85 }\r
86 \r
87 m_task_t\r
88 MSG_mailbox_get_head(msg_mailbox_t mailbox)\r
89 {\r
90         xbt_fifo_item_t item;\r
91         \r
92         if(NULL == (item = xbt_fifo_get_first_item(mailbox->tasks)))\r
93                 return NULL;\r
94                 \r
95         return (m_task_t)xbt_fifo_get_item_content(item);\r
96 }\r
97 \r
98 m_task_t\r
99 MSG_mailbox_get_first_host_task(msg_mailbox_t mailbox, m_host_t host)\r
100 {\r
101         m_task_t task = NULL;\r
102         xbt_fifo_item_t item = NULL;\r
103         \r
104         xbt_fifo_foreach(mailbox->tasks, item, task, m_task_t) \r
105         {\r
106                 if (task->simdata->source == host)\r
107                         break;\r
108         }\r
109         \r
110         if(item) \r
111                 xbt_fifo_remove_item(mailbox->tasks, item);\r
112                 \r
113         return task;\r
114 }\r
115 \r
116 int\r
117 MSG_mailbox_get_count_host_tasks(msg_mailbox_t mailbox, m_host_t host)\r
118 {\r
119         m_task_t task = NULL;\r
120         xbt_fifo_item_t item = NULL;\r
121         int count = 0;\r
122         \r
123         xbt_fifo_foreach(mailbox->tasks, item, task, m_task_t) \r
124         {\r
125                 if (task->simdata->source == host)\r
126                         count++;\r
127         }\r
128                 \r
129         return count;\r
130 }\r
131 \r
132 void\r
133 MSG_mailbox_set_cond(msg_mailbox_t mailbox, smx_cond_t cond)\r
134 {\r
135         mailbox->cond = cond;\r
136 }\r
137 \r
138 const char*\r
139 MSG_mailbox_get_alias(msg_mailbox_t mailbox)\r
140 {\r
141         return mailbox->alias;\r
142 }\r
143 \r
144 const char*\r
145 MSG_mailbox_get_hostname(msg_mailbox_t mailbox)\r
146 {\r
147         return mailbox->hostname;\r
148 }\r
149 \r
150 void\r
151 MSG_mailbox_set_hostname(msg_mailbox_t mailbox, const char* hostname)\r
152 {\r
153         mailbox->hostname = xbt_strdup(hostname);\r
154 }\r
155 \r
156 void\r
157 MSG_mailbox_free(void* mailbox)\r
158 {\r
159         msg_mailbox_t __mailbox = (msg_mailbox_t)mailbox;\r
160 \r
161         if(NULL != (__mailbox->hostname))\r
162                 free(__mailbox->hostname);\r
163 \r
164         free(__mailbox->alias);\r
165         \r
166         free(__mailbox);\r
167 }\r
168 \r
169 msg_mailbox_t\r
170 MSG_mailbox_get_by_alias(const char* alias)\r
171 {\r
172         xbt_ex_t e;\r
173         int found = 1;\r
174         msg_mailbox_t mailbox;\r
175 \r
176         TRY \r
177         {\r
178                 mailbox = xbt_dict_get(msg_mailboxes,alias);\r
179         } \r
180         CATCH(e) \r
181         {\r
182                 if (e.category == not_found_error) \r
183                 {\r
184                         found = 0;\r
185                         xbt_ex_free(e);\r
186                 } \r
187                 else \r
188                 {\r
189                         RETHROW;\r
190                 }\r
191         }\r
192 \r
193         if(!found)\r
194         {\r
195                 mailbox = MSG_mailbox_new(alias);\r
196                 MSG_mailbox_set_hostname(mailbox,MSG_host_self()->name);\r
197         }\r
198         \r
199         return mailbox; \r
200 }\r