#include "private.h"
#include "xbt/sysdep.h"
#include "xbt/log.h"
+#include "xbt/str.h"
#include "xbt/ex.h" /* ex_backtrace_display */
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_kernel, simix,
"Logging specific to SIMIX (kernel)");
/* To split the string in commands, and the cursors */
xbt_dynar_t set_strings;
char *str;
- int cpt;
+ unsigned int cpt;
if (!control_string)
return;
xbt_swag_new(xbt_swag_offset(proc, process_hookup));
simix_global->current_process = NULL;
simix_global->registered_functions = xbt_dict_new();
-
+
simix_global->create_process_function = NULL;
simix_global->kill_process_function = NULL;
simix_global->cleanup_process_function = SIMIX_process_cleanup;
simix_config_finalize();
free(simix_global);
simix_global = NULL;
+
surf_exit();
return;
return surf_get_clock();
}
+/**
+ * \brief Finish the simulation initialization
+ *
+ * Must be called before the first call to SIMIX_solve()
+ */
+void SIMIX_init(void) {
+ surf_presolve();
+}
+
/**
* \brief Does a turn of the simulation
*
{
smx_process_t process = NULL;
- int i;
+ unsigned int iter;
double elapsed_time = 0.0;
static int state_modifications = 1;
- static int first = 1;
xbt_context_empty_trash();
if (xbt_swag_size(simix_global->process_to_run) && (elapsed_time > 0)) {
DEBUG0("**************************************************");
}
- if (first) {
- surf_solve(); /* Takes traces into account. Returns 0.0 */
- first = 0;
- }
+
while ((process = xbt_swag_extract(simix_global->process_to_run))) {
DEBUG2("Scheduling %s on %s",
process->name, process->simdata->smx_host->name);
void *fun = NULL;
void *arg = NULL;
- xbt_dynar_foreach(model_list, i, model) {
+ xbt_dynar_foreach(model_list, iter, model) {
if (xbt_swag_size(model->common_public->states.failed_action_set)
|| xbt_swag_size(model->common_public->states.
done_action_set)) {
state_modifications = 1;
+ break;
}
}
DEBUG2("Launching %s on %s", args->name, args->hostname);
process = SIMIX_process_create(args->name, args->code,
args->data, args->hostname,
- args->argc, args->argv);
+ args->argc, args->argv, args->properties);
if (args->kill_time > SIMIX_get_clock()) {
surf_timer_model->extension_public->set(args->kill_time,
(void *)
}
/* Wake up all process waiting for the action finish */
- xbt_dynar_foreach(model_list, i, model) {
+ xbt_dynar_foreach(model_list, iter, model) {
while ((action =
xbt_swag_extract(model->common_public->states.
failed_action_set))) {
* \param function Create process function
*
*/
-void SIMIX_function_register_process_create(smx_creation_func_t * function)
+void SIMIX_function_register_process_create(smx_creation_func_t function)
{
xbt_assert0((simix_global->create_process_function == NULL),
"Data already set");
* \param function Kill process function
*
*/
-void SIMIX_function_register_process_kill(void_f_pvoid_t * function)
+void SIMIX_function_register_process_kill(void_f_pvoid_t function)
{
xbt_assert0((simix_global->kill_process_function == NULL),
"Data already set");
* \param function cleanup process function
*
*/
-void SIMIX_function_register_process_cleanup(void_f_pvoid_t * function)
+void SIMIX_function_register_process_cleanup(void_f_pvoid_t function)
{
simix_global->cleanup_process_function = function;
}