double NOW = 0;
-xbt_dynar_t model_list = NULL;
+/* model_list_invoke contains only surf_workstation and surf_vm_workstation.
+ * The callback functions of cpu_model and network_model will be called from
+ * those of these workstation models. */
+xbt_dynar_t model_list = NULL; /* for destroying all models correctly */
+xbt_dynar_t model_list_invoke = NULL; /* for invoking callbacks */
tmgr_history_t history = NULL;
lmm_system_t maxmin_system = NULL;
xbt_dynar_t surf_path = NULL;
xbt_init(argc, argv);
if (!model_list)
model_list = xbt_dynar_new(sizeof(surf_model_private_t), NULL);
+ if (!model_list_invoke)
+ model_list_invoke = xbt_dynar_new(sizeof(surf_model_private_t), NULL);
if (!history)
history = tmgr_history_new();
xbt_dynar_foreach(model_list, iter, model)
model->model_private->finalize();
xbt_dynar_free(&model_list);
+
+ xbt_dynar_free(&model_list_invoke);
+
routing_exit();
if (maxmin_system) {
}
}
}
+
+ /* FIXME: see what is check_update_action_state(). if necessary, use model_list_invoke. */
xbt_dynar_foreach(model_list, iter, model)
model->model_private->update_actions_state(NOW, 0.0);
}
XBT_DEBUG("Looking for next action end for all models except NS3");
if (surf_mins == NULL) {
- surf_mins = xbt_new(double, xbt_dynar_length(model_list));
+ surf_mins = xbt_new(double, xbt_dynar_length(model_list_invoke));
}
surf_min_index = 0;
if (surf_get_nthreads() > 1) {
/* parallel version */
#ifdef CONTEXT_THREADS
- xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_share_resources, model_list);
+ xbt_parmap_apply(surf_parmap, (void_f_pvoid_t) surf_share_resources, model_list_invoke);
#else
xbt_die("Asked to run in parallel, but no thread at hand...");
#endif
}
else {
/* sequential version */
- xbt_dynar_foreach(model_list, iter, model) {
+ xbt_dynar_foreach(model_list_invoke, iter, model) {
surf_share_resources(model);
}
}
unsigned i;
- for (i = 0; i < xbt_dynar_length(model_list); i++) {
+ for (i = 0; i < xbt_dynar_length(model_list_invoke); i++) {
if ((min < 0.0 || surf_mins[i] < min)
&& surf_mins[i] >= 0.0) {
min = surf_mins[i];
#endif
}
else {
+ /* FIXME: model_list or model_list_invoke? revisit here later */
/* sequential version */
xbt_dynar_foreach(model_list, iter, model) {
surf_update_actions_state(model);
static double ws_share_resources(double now)
{
- // Can be obsolete if you right can ensure that ws_model has been code previously
- // invoke ws_share_resources on the physical_lyer: sub_ws->ws_share_resources()
+ // Can be obsolete if you right can ensure that ws_model has been code previously
+ // invoke ws_share_resources on the physical_lyer: sub_ws->ws_share_resources()
+ {
+ unsigned int index_of_pm_ws_model = xbt_dynar_search(model_list_invoke, surf_workstation_model);
+ unsigned int index_of_vm_ws_model = xbt_dynar_search(model_list_invoke, surf_vm_workstation_model);
+ xbt_assert((index_of_pm_ws_model < index_of_vm_ws_model), "Cannot assume surf_workstation_model comes before");
+ /* we have to make sure that the share_resource() callback of the model of the lower layer must be called in advance. */
+ }
// assign the corresponding value to X1, X2, ....
{
surf_vm_workstation_model_init_internal();
xbt_dynar_push(model_list, &surf_vm_workstation_model);
+ xbt_dynar_push(model_list_invoke, &surf_vm_workstation_model);
}
surf_network_model_init_LegrandVelho();
xbt_dynar_push(model_list, &surf_workstation_model);
+ xbt_dynar_push(model_list_invoke, &surf_workstation_model);
sg_platf_host_add_cb(workstation_new);
// sg_platf_postparse_add_cb(create_workstations);
}
xbt_assert(surf_network_model, "No network model defined yet!");
surf_workstation_model_init_internal();
xbt_dynar_push(model_list, &surf_workstation_model);
+ xbt_dynar_push(model_list_invoke, &surf_workstation_model);
sg_platf_host_add_cb(workstation_new);
// sg_platf_postparse_add_cb(create_workstations);
}