/* The previous name was model_type. For VM support, we have to distinguish a
* model type and its model object. Thus, we use model_obj here. The type of
- * a model object is available through a macro. */
+ * a model object is available by looking at the inside of the model object. */
surf_model_t model_obj; /**< the surf model object */
#ifdef HAVE_TRACING
* You shouldn't have to call it by yourself.
* \see surf_workstation_model_init_CLM03()
*/
-XBT_PUBLIC(void) surf_cpu_model_init_ti(surf_model_t cpu_model);
+XBT_PUBLIC(surf_model_t) surf_cpu_model_init_ti(void);
/** \brief This function call the share resources function needed
*
}
}
-static void cpu_define_callbacks()
+static void cpu_define_callbacks_cas01()
{
sg_platf_host_add_cb(parse_cpu_init);
sg_platf_postparse_add_cb(cpu_add_traces_cpu);
cpu_running_action_set_that_does_not_need_being_checked = NULL;
}
-static void surf_cpu_model_init_internal(surf_model_t cpu_model)
+static surf_model_t surf_cpu_model_init_cas01(void)
{
s_surf_action_t action;
s_surf_action_cpu_Cas01_t comp;
int select =
xbt_cfg_get_int(_sg_cfg_set, "cpu/maxmin_selective_update");
- cpu_model = surf_model_init();
+ surf_model_t cpu_model = surf_model_init();
if (!strcmp(optim, "Full")) {
cpu_model->model_private->update_mechanism = UM_FULL;
xbt_swag_new(xbt_swag_offset(comp, generic_lmm_action.action_list_hookup));
cpu_model->model_private->maxmin_system->keep_track = cpu_model->model_private->modified_set;
}
+
+ return cpu_model;
}
/*********************************************************************/
/* } */
-static void create_cpu_model_object(surf_model_t cpu_model)
+void surf_cpu_model_init_Cas01(void)
{
char *optim = xbt_cfg_get_string(_sg_cfg_set, "cpu/optim");
- xbt_assert(cpu_model == NULL, "wrong intialization");
+ xbt_assert(!surf_cpu_model_pm);
+ xbt_assert(!surf_cpu_model_vm);
- if (!strcmp(optim, "TI")) {
- surf_cpu_model_init_ti(cpu_model);
- return;
- }
+ if (strcmp(optim, "TI") == 0) {
+ /* FIXME: do we have to supprot TI? for VM */
+ surf_cpu_model_pm = surf_cpu_model_init_ti();
- surf_cpu_model_init_internal(cpu_model);
- cpu_define_callbacks();
+ } else {
+ surf_cpu_model_pm = surf_cpu_model_init_cas01();
+ surf_cpu_model_vm = surf_cpu_model_init_cas01();
- /* cpu_model is registered only to model_list, and not to
- * model_list_invoke. The shared_resource callback function will be called
- * from that of the workstation model. */
- xbt_dynar_push(model_list, &cpu_model);
-}
+ /* cpu_model is registered only to model_list, and not to
+ * model_list_invoke. The shared_resource callback function will be called
+ * from that of the workstation model. */
+ xbt_dynar_push(model_list, &surf_cpu_model_pm);
+ xbt_dynar_push(model_list, &surf_cpu_model_vm);
-void surf_cpu_model_init_Cas01(void)
-{
- create_cpu_model_object(surf_cpu_model_pm);
- create_cpu_model_object(surf_cpu_model_vm);
+ cpu_define_callbacks_cas01();
+ }
}
/* TODO: do we address nested virtualization later? */
xbt_heap_free(cpu_ti_action_heap);
}
-static void surf_cpu_ti_model_init_internal(surf_model_t cpu_model)
+surf_model_t surf_cpu_ti_model_init_internal(void)
{
s_surf_action_t action;
s_cpu_ti_t cpu;
- cpu_model = surf_model_init();
+ surf_model_t cpu_model = surf_model_init();
cpu_ti_running_action_set_that_does_not_need_being_checked =
xbt_swag_new(xbt_swag_offset(action, state_hookup));
xbt_heap_set_update_callback(cpu_ti_action_heap,
cpu_ti_action_update_index_heap);
+ return cpu_model;
}
-void surf_cpu_model_init_ti(surf_model_t cpu_model)
+surf_model_t surf_cpu_model_init_ti(void)
{
- xbt_assert(!cpu_model,"CPU model already initialized. This should not happen.");
- surf_cpu_ti_model_init_internal(cpu_model);
+ surf_model_t cpu_model = surf_cpu_ti_model_init_internal();
cpu_ti_define_callbacks();
xbt_dynar_push(model_list, &cpu_model);
+
+ return cpu_model;
}
static void surf_vm_workstation_model_init_internal(void)
{
- surf_vm_workstation_model = surf_model_init();
+ surf_model_t model = surf_model_init();
- surf_vm_workstation_model->name = "Virtual Workstation";
- surf_vm_workstation_model->type = SURF_MODEL_TYPE_VM_WORKSTATION;
+ model->name = "Virtual Workstation";
+ model->type = SURF_MODEL_TYPE_VM_WORKSTATION;
- surf_vm_workstation_model->extension.vm_workstation.basic.cpu_model = surf_cpu_model_vm;
+ model->extension.vm_workstation.basic.cpu_model = surf_cpu_model_vm;
- surf_vm_workstation_model->extension.vm_workstation.create = vm_ws_create;
- surf_vm_workstation_model->extension.vm_workstation.set_state = vm_ws_set_state;
- surf_vm_workstation_model->extension.vm_workstation.get_state = vm_ws_get_state;
- surf_vm_workstation_model->extension.vm_workstation.migrate = vm_ws_migrate;
- surf_vm_workstation_model->extension.vm_workstation.get_phys_host = vm_ws_get_phys_host;
- surf_vm_workstation_model->extension.vm_workstation.destroy = vm_ws_destroy;
+ model->extension.vm_workstation.create = vm_ws_create;
+ model->extension.vm_workstation.set_state = vm_ws_set_state;
+ model->extension.vm_workstation.get_state = vm_ws_get_state;
+ model->extension.vm_workstation.migrate = vm_ws_migrate;
+ model->extension.vm_workstation.get_phys_host = vm_ws_get_phys_host;
+ model->extension.vm_workstation.destroy = vm_ws_destroy;
- surf_vm_workstation_model->model_private->share_resources = vm_ws_share_resources;
+ model->model_private->share_resources = vm_ws_share_resources;
+ model->model_private->resource_used = ws_resource_used;
+ model->model_private->update_actions_state = ws_update_actions_state;
+ model->model_private->update_resource_state = ws_update_resource_state;
+ model->model_private->finalize = ws_finalize;
+
+ surf_vm_workstation_model = model;
}
void surf_vm_workstation_model_init()
static void surf_workstation_model_init_internal(void)
{
- surf_workstation_model = surf_model_init();
-
- surf_workstation_model->name = "Workstation";
- surf_workstation_model->type = SURF_MODEL_TYPE_WORKSTATION;
- surf_workstation_model->action_unref = ws_action_unref;
- surf_workstation_model->action_cancel = ws_action_cancel;
- surf_workstation_model->action_state_set = ws_action_state_set;
-
- surf_workstation_model->model_private->resource_used = ws_resource_used;
- surf_workstation_model->model_private->share_resources =
- ws_share_resources;
- surf_workstation_model->model_private->update_actions_state =
- ws_update_actions_state;
- surf_workstation_model->model_private->update_resource_state =
- ws_update_resource_state;
- surf_workstation_model->model_private->finalize = ws_finalize;
-
- surf_workstation_model->suspend = ws_action_suspend;
- surf_workstation_model->resume = ws_action_resume;
- surf_workstation_model->is_suspended = ws_action_is_suspended;
- surf_workstation_model->set_max_duration = ws_action_set_max_duration;
- surf_workstation_model->set_priority = ws_action_set_priority;
-#ifdef HAVE_TRACING
- surf_workstation_model->set_category = ws_action_set_category;
-#endif
- surf_workstation_model->get_remains = ws_action_get_remains;
-#ifdef HAVE_LATENCY_BOUND_TRACKING
- surf_workstation_model->get_latency_limited = ws_get_latency_limited;
-#endif
+ surf_model_t model = surf_model_init();
+
+ model->name = "Workstation";
+ model->type = SURF_MODEL_TYPE_WORKSTATION;
+ model->action_unref = ws_action_unref;
+ model->action_cancel = ws_action_cancel;
+ model->action_state_set = ws_action_state_set;
+
+ model->model_private->resource_used = ws_resource_used;
+ model->model_private->share_resources = ws_share_resources;
+ model->model_private->update_actions_state = ws_update_actions_state;
+ model->model_private->update_resource_state = ws_update_resource_state;
+ model->model_private->finalize = ws_finalize;
+
+ model->suspend = ws_action_suspend;
+ model->resume = ws_action_resume;
+ model->is_suspended = ws_action_is_suspended;
+ model->set_max_duration = ws_action_set_max_duration;
+ model->set_priority = ws_action_set_priority;
+ #ifdef HAVE_TRACING
+ model->set_category = ws_action_set_category;
+ #endif
+ model->get_remains = ws_action_get_remains;
+ #ifdef HAVE_LATENCY_BOUND_TRACKING
+ model->get_latency_limited = ws_get_latency_limited;
+ #endif
/* For VM support, we have a surf cpu model object for each workstation model
* object. The physical workstation model object has the cpu model object of
* the physical machine layer. */
- surf_workstation_model->extension.workstation.cpu_model = surf_cpu_model_pm;
-
- surf_workstation_model->extension.workstation.execute = ws_execute;
- surf_workstation_model->extension.workstation.sleep = ws_action_sleep;
- surf_workstation_model->extension.workstation.get_state = ws_get_state;
- surf_workstation_model->extension.workstation.get_speed = ws_get_speed;
- surf_workstation_model->extension.workstation.get_available_speed =
- ws_get_available_speed;
-
- surf_workstation_model->extension.workstation.communicate =
- ws_communicate;
- surf_workstation_model->extension.workstation.get_route = ws_get_route;
- surf_workstation_model->extension.workstation.execute_parallel_task =
- ws_execute_parallel_task;
- surf_workstation_model->extension.workstation.get_link_bandwidth =
- ws_get_link_bandwidth;
- surf_workstation_model->extension.workstation.get_link_latency =
- ws_get_link_latency;
- surf_workstation_model->extension.workstation.link_shared =
- ws_link_shared;
- surf_workstation_model->extension.workstation.get_properties =
- ws_get_properties;
-
- surf_workstation_model->extension.workstation.open = ws_action_open;
- surf_workstation_model->extension.workstation.close = ws_action_close;
- surf_workstation_model->extension.workstation.read = ws_action_read;
- surf_workstation_model->extension.workstation.write = ws_action_write;
- surf_workstation_model->extension.workstation.stat = ws_action_stat;
- surf_workstation_model->extension.workstation.unlink = ws_action_unlink;
- surf_workstation_model->extension.workstation.ls = ws_action_ls;
+ model->extension.workstation.cpu_model = surf_cpu_model_pm;
+
+ model->extension.workstation.execute = ws_execute;
+ model->extension.workstation.sleep = ws_action_sleep;
+ model->extension.workstation.get_state = ws_get_state;
+ model->extension.workstation.get_speed = ws_get_speed;
+ model->extension.workstation.get_available_speed = ws_get_available_speed;
+
+ model->extension.workstation.communicate = ws_communicate;
+ model->extension.workstation.get_route = ws_get_route;
+ model->extension.workstation.execute_parallel_task = ws_execute_parallel_task;
+ model->extension.workstation.get_link_bandwidth = ws_get_link_bandwidth;
+ model->extension.workstation.get_link_latency = ws_get_link_latency;
+ model->extension.workstation.link_shared = ws_link_shared;
+ model->extension.workstation.get_properties = ws_get_properties;
+
+ model->extension.workstation.open = ws_action_open;
+ model->extension.workstation.close = ws_action_close;
+ model->extension.workstation.read = ws_action_read;
+ model->extension.workstation.write = ws_action_write;
+ model->extension.workstation.stat = ws_action_stat;
+ model->extension.workstation.unlink = ws_action_unlink;
+ model->extension.workstation.ls = ws_action_ls;
+
+ surf_workstation_model = model;
}
void surf_workstation_model_init_current_default(void)