Logo AND Algorithmique Numérique Distribuée

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