Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
c305f4e0d5ad359c650c51759687661e005944ef
[simgrid.git] / src / msg / msg_global.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_private.h"
8 #include "msg_mailbox.h"
9 #include "mc/mc.h"
10 #include "xbt/sysdep.h"
11 #include "xbt/log.h"
12 #include "xbt/virtu.h"
13 #include "xbt/ex.h"             /* ex_backtrace_display */
14
15 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_kernel, msg,
16                                 "Logging specific to MSG (kernel)");
17
18 MSG_Global_t msg_global = NULL;
19
20 /********************************* MSG **************************************/
21
22 /** \ingroup msg_simulation
23  * \brief Initialize some MSG internal data.
24  */
25 void MSG_global_init_args(int *argc, char **argv)
26 {
27   MSG_global_init(argc, argv);
28 }
29
30
31 XBT_LOG_EXTERNAL_CATEGORY(msg_gos);
32 XBT_LOG_EXTERNAL_CATEGORY(msg_kernel);
33 XBT_LOG_EXTERNAL_CATEGORY(msg_mailbox);
34 XBT_LOG_EXTERNAL_CATEGORY(msg_process);
35
36 /** \ingroup msg_simulation
37  * \brief Initialize some MSG internal data.
38  */
39 void MSG_global_init(int *argc, char **argv)
40 {
41 #ifdef HAVE_TRACING
42   TRACE_global_init(argc, argv);
43 #endif
44
45   xbt_getpid = MSG_process_self_PID;
46   if (!msg_global) {
47     /* Connect our log channels: that must be done manually under windows */
48     XBT_LOG_CONNECT(msg_gos, msg);
49     XBT_LOG_CONNECT(msg_kernel, msg);
50     XBT_LOG_CONNECT(msg_mailbox, msg);
51     XBT_LOG_CONNECT(msg_process, msg);
52
53     SIMIX_global_init(argc, argv);
54
55     msg_global = xbt_new0(s_MSG_Global_t, 1);
56
57 #ifdef MSG_USE_DEPRECATED
58     msg_global->max_channel = 0;
59 #endif
60     msg_global->PID = 1;
61     msg_global->sent_msg = 0;
62     msg_global->task_copy_callback = NULL;
63     msg_global->process_data_cleanup = NULL;
64
65     /* initialization of the action module */
66     _MSG_action_init();
67
68     SIMIX_function_register_process_create(MSG_process_create_from_SIMIX);
69     SIMIX_function_register_process_cleanup(MSG_process_cleanup_from_SIMIX);
70     SIMIX_function_register_process_kill(MSG_process_kill_from_SIMIX);
71   }
72 #ifdef HAVE_TRACING
73   TRACE_start();
74 #endif
75
76   XBT_DEBUG("ADD MSG LEVELS");
77   MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_destroy);
78 }
79
80 #ifdef MSG_USE_DEPRECATED
81
82 /* This deprecated function has to be called to fix the number of channel in the
83    simulation before creating any host. Indeed, each channel is
84    represented by a different mailbox on each #m_host_t. This
85    function can then be called only once. This function takes only one
86    parameter.
87  * \param number the number of channel in the simulation. It has to be >0
88  */
89 MSG_error_t MSG_set_channel_number(int number)
90 {
91   XBT_WARN("DEPRECATED! Please use aliases instead");
92   xbt_assert((msg_global)
93               && (msg_global->max_channel == 0),
94               "Channel number already set!");
95
96   msg_global->max_channel = number;
97
98   return MSG_OK;
99 }
100
101 /* This deprecated function has to be called once the number of channel is fixed. I can't
102    figure out a reason why anyone would like to call this function but nevermind.
103  * \return the number of channel in the simulation.
104  */
105 int MSG_get_channel_number(void)
106 {
107   XBT_WARN("DEPRECATED! Please use aliases instead");
108   xbt_assert((msg_global)
109               && (msg_global->max_channel != 0),
110               "Channel number not set yet!");
111
112   return msg_global->max_channel;
113 }
114 #endif
115
116 /** \ingroup msg_simulation
117  * \brief Launch the MSG simulation
118  */
119 MSG_error_t MSG_main(void)
120 {
121   /* Clean IO before the run */
122   fflush(stdout);
123   fflush(stderr);
124
125   if (MC_IS_ENABLED) {
126     MC_modelcheck();
127   }
128   else {
129     SIMIX_run();
130   }
131   return MSG_OK;
132 }
133
134 MSG_error_t MSG_main_stateful(void)
135 {
136   /* Clean IO before the run */
137   fflush(stdout);
138   fflush(stderr);
139
140   if (MC_IS_ENABLED) {
141     MC_modelcheck_stateful();
142   }
143   else {
144     SIMIX_run();
145   }
146   return MSG_OK;
147 }
148
149
150 MSG_error_t MSG_main_liveness(xbt_automaton_t a, char *prgm)
151 {
152   /* Clean IO before the run */
153   fflush(stdout);
154   fflush(stderr);
155
156   if (MC_IS_ENABLED) {
157     MC_modelcheck_liveness(a, prgm);
158   }
159   else {
160     SIMIX_run();
161   }
162   return MSG_OK;
163 }
164
165 /** \ingroup msg_simulation
166  * \brief Kill all running process
167
168  * \param reset_PIDs should we reset the PID numbers. A negative
169  *   number means no reset and a positive number will be used to set the PID
170  *   of the next newly created process.
171  */
172 int MSG_process_killall(int reset_PIDs)
173 {
174   simcall_process_killall();
175
176   if (reset_PIDs > 0) {
177     msg_global->PID = reset_PIDs;
178     msg_global->session++;
179   }
180
181   return msg_global->PID;
182
183 }
184
185 /** \ingroup msg_simulation
186  * \brief Clean the MSG simulation
187  */
188 MSG_error_t MSG_clean(void)
189 {
190   XBT_DEBUG("Closing MSG");
191
192 #ifdef HAVE_TRACING
193   TRACE_surf_release();
194 #endif
195
196   MSG_process_killall(0);
197
198   /* initialization of the action module */
199   _MSG_action_exit();
200
201 #ifdef HAVE_TRACING
202   TRACE_end();
203 #endif
204
205   SIMIX_clean();
206
207   free(msg_global);
208   msg_global = NULL;
209
210   return MSG_OK;
211 }
212
213
214 /** \ingroup msg_easier_life
215  * \brief A clock (in second).
216  */
217 XBT_INLINE double MSG_get_clock(void)
218 {
219   return SIMIX_get_clock();
220 }
221
222 unsigned long int MSG_get_sent_msg()
223 {
224   return msg_global->sent_msg;
225 }