#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;
asprintf(&who, "%s on %s: %s",
process->name,
- p_simdata->s_host->name,
+ p_simdata->smx_host->name,
(process->simdata->blocked) ? "[BLOCKED] "
: ((process->simdata->suspended) ? "[SUSPENDED] " : ""));
if (p_simdata->mutex) {
- who2 = bprintf("%s Blocked on mutex %p", who, p_simdata->mutex);
+ who2 = bprintf("%s Blocked on mutex %p", who, (XBT_LOG_ISENABLED(simix_kernel,xbt_log_priority_verbose))?p_simdata->mutex:(void*)0xdead);
free(who);
who = who2;
} else if (p_simdata->cond) {
who2 =
bprintf
("%s Blocked on condition %p; Waiting for the following actions:",
- who, p_simdata->cond);
+ who, (XBT_LOG_ISENABLED(simix_kernel,xbt_log_priority_verbose))?p_simdata->cond:(void*)0xdead);
free(who);
who = who2;
xbt_fifo_foreach(p_simdata->cond->actions, item, act, smx_action_t) {
- who2 = bprintf("%s '%s'", who, act->name);
+ who2 = bprintf("%s '%s'(%p)", who, act->name,(XBT_LOG_ISENABLED(simix_kernel,xbt_log_priority_verbose))?act:(void*)0xdead);
free(who);
who = who2;
}
xbt_fifo_foreach(smx_action->cond_list, _cursor, cond, smx_cond_t) {
xbt_swag_foreach(process, cond->sleeping) {
DEBUG2("\t preparing to wake up %s on %s",
- process->name, process->simdata->s_host->name);
+ process->name, process->simdata->smx_host->name);
}
SIMIX_cond_broadcast(cond);
/* remove conditional from action */
- xbt_fifo_remove(smx_action->cond_list, cond);
+ SIMIX_unregister_action_to_condition(smx_action, cond);
}
}
xbt_fifo_foreach(smx_action->cond_list, _cursor, cond, smx_cond_t) {
xbt_swag_foreach(process, cond->sleeping) {
DEBUG2("\t preparing to wake up %s on %s",
- process->name, process->simdata->s_host->name);
+ process->name, process->simdata->smx_host->name);
}
SIMIX_cond_broadcast(cond);
/* remove conditional from action */
- xbt_fifo_remove(smx_action->cond_list, cond);
+ SIMIX_unregister_action_to_condition(smx_action, cond);
}
}
}
xbt_dict_free(&(simix_global->registered_functions));
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->s_host->name);
+ process->name, process->simdata->smx_host->name);
simix_global->current_process = process;
xbt_context_schedule(process->simdata->context);
/* fflush(NULL); */
{
surf_action_t action = NULL;
- surf_resource_t resource = NULL;
+ surf_model_t model = NULL;
smx_action_t smx_action = NULL;
void *fun = NULL;
void *arg = NULL;
- xbt_dynar_foreach(resource_list, i, resource) {
- if (xbt_swag_size(resource->common_public->states.failed_action_set)
- || xbt_swag_size(resource->common_public->states.
+ 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;
}
}
DEBUG1("Elapsed_time %f", elapsed_time);
}
- while (surf_timer_resource->extension_public->get(&fun, (void *) &arg)) {
+ while (surf_timer_model->extension_public->get(&fun, (void *) &arg)) {
DEBUG2("got %p %p", fun, arg);
if (fun == SIMIX_process_create) {
smx_process_arg_t args = arg;
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_resource->extension_public->set(args->kill_time,
+ surf_timer_model->extension_public->set(args->kill_time,
(void *)
&SIMIX_process_kill,
(void *) process);
if (fun == SIMIX_process_kill) {
process = arg;
DEBUG2("Killing %s on %s", process->name,
- process->simdata->s_host->name);
+ process->simdata->smx_host->name);
SIMIX_process_kill(process);
}
}
/* Wake up all process waiting for the action finish */
- xbt_dynar_foreach(resource_list, i, resource) {
+ xbt_dynar_foreach(model_list, iter, model) {
while ((action =
- xbt_swag_extract(resource->common_public->states.
+ xbt_swag_extract(model->common_public->states.
failed_action_set))) {
smx_action = action->data;
if (smx_action) {
}
}
while ((action =
- xbt_swag_extract(resource->common_public->states.
+ xbt_swag_extract(model->common_public->states.
done_action_set))) {
smx_action = action->data;
if (smx_action) {
*/
void SIMIX_timer_set(double date, void *function, void *arg)
{
- surf_timer_resource->extension_public->set(date, function, arg);
+ surf_timer_model->extension_public->set(date, function, arg);
}
int SIMIX_timer_get(void **function, void **arg)
{
- return surf_timer_resource->extension_public->get(function, arg);
+ return surf_timer_model->extension_public->get(function, arg);
}
/**
* \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;
}