extern double sg_latency_factor;
extern double sg_bandwidth_factor;
extern double sg_weight_S_parameter;
-extern int sg_maxmin_selective_update;
extern int sg_network_crosstraffic;
#ifdef HAVE_GTNETS
extern double sg_gtnets_jitter;
NOTSET
};
+
+typedef struct surf_resource {
+ surf_model_t model;
+ char *name;
+ xbt_dict_t properties;
+} s_surf_resource_t, *surf_resource_t;
+
/** \ingroup SURF_actions
* \brief Action structure
*
xbt_swag_t state_set;
double cost; /**< cost */
double priority; /**< priority (1.0 by default) */
+ double bound; /**< the capping of the CPU use */
double max_duration; /**< max_duration (may fluctuate until
the task is completed) */
double remains; /**< How much of that cost remains to
* and fluctuates until the task is completed */
void *data; /**< for your convenience */
int refcount;
- surf_model_t model_type;
+
+ /* 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 by looking at the inside of the model object. */
+ surf_model_t model_obj; /**< the surf model object */
+
#ifdef HAVE_TRACING
char *category; /**< tracing category for categorized resource utilization monitoring */
#endif
surf_action_t(*ls) (void *storage, const char *path);
} s_surf_model_extension_storage_t;
- /** \ingroup SURF_models
- * \brief Workstation model extension public
- *
- * Public functions specific to the workstation model.
- */
+/** \ingroup SURF_models
+ * \brief Workstation model extension public
+ *
+ * Public functions specific to the workstation model.
+ */
typedef struct surf_workstation_model_extension_public {
+ /* This points to the surf cpu model object bound to the workstation model. */
+ surf_model_t cpu_model;
+
surf_action_t(*execute) (void *workstation, double size); /**< Execute a computation amount on a workstation
and create the corresponding action */
surf_action_t(*sleep) (void *workstation, double duration); /**< Make a workstation sleep during a given duration */
xbt_dict_t(*get_properties) (const void *resource);
void (*add_traces) (void);
+ void (*get_params) (void *ind_vm_ws, ws_params_t param);
+ void (*set_params) (void *ind_vm_ws, ws_params_t param);
+ xbt_dynar_t (*get_vms) (void *ind_vm_ws);
+
} s_surf_model_extension_workstation_t;
typedef struct surf_vm_workstation_model_extension_public {
+ /* The vm workstation model object has all members of the physical machine
+ * workstation model object. If these members are correctly initialized also
+ * in the vm workstation model object, we can access the vm workstation model
+ * object as if it is the pm workstatoin model object.
+ *
+ * But, it's not so clean. Think it again later.
+ * */
s_surf_model_extension_workstation_t basic;
- void* (*create) (const char *name, void *ind_phys_workstation); // First operation of the VM model
+
// start does not appear here as it corresponds to turn the state from created to running (see smx_vm.c)
- int (*get_state) (void *ind_phys_workstation);
- void (*set_state) (void *ind_phys_workstation, int state);
- void (*destroy) (void *ind_phys_workstation); // will be vm_ws_destroy(), which destroies the vm-specific data
+
+ void (*create) (const char *name, void *ind_phys_workstation); // First operation of the VM model
+ void (*destroy) (void *ind_vm_ws); // will be vm_ws_destroy(), which destroies the vm-workstation-specific data
+
+ void (*suspend) (void *ind_vm_ws);
+ void (*resume) (void *ind_vm_ws);
+
+ void (*save) (void *ind_vm_ws);
+ void (*restore) (void *ind_vm_ws);
+
+ void (*migrate) (void *ind_vm_ws, void *ind_vm_ws_dest); // will be vm_ws_migrate()
+
+ int (*get_state) (void *ind_vm_ws);
+ void (*set_state) (void *ind_vm_ws, int state);
+
+ void * (*get_pm) (void *ind_vm_ws); // will be vm_ws_get_pm()
+
} s_surf_model_extension_vm_workstation_t;
+/** \ingroup SURF_models
+ * \brief Model types
+ *
+ * The type of the model object. For example, we will have two model objects
+ * of the surf cpu model. One is for physical machines, and the other is for
+ * virtual machines.
+ *
+ */
+typedef enum {
+ SURF_MODEL_TYPE_CPU = 0,
+ SURF_MODEL_TYPE_NETWORK,
+ SURF_MODEL_TYPE_STORAGE,
+ SURF_MODEL_TYPE_WORKSTATION,
+ SURF_MODEL_TYPE_VM_WORKSTATION,
+ SURF_MODEL_TYPE_NEW_MODEL
+} e_surf_model_type_t;
+
/** \ingroup SURF_models
* \brief Model datatype
*
const char *name; /**< Name of this model */
s_surf_action_state_t states; /**< Any living action on this model */
- e_surf_action_state_t(*action_state_get) (surf_action_t action);
+ e_surf_model_type_t type; /**< See e_surf_model_type_t */
+
+ e_surf_action_state_t(*action_state_get) (surf_action_t action);
/**< Return the state of an action */
void (*action_state_set) (surf_action_t action,
e_surf_action_state_t state);
int (*is_suspended) (surf_action_t action); /**< Return whether an action is suspended */
void (*set_max_duration) (surf_action_t action, double duration); /**< Set the max duration of an action*/
void (*set_priority) (surf_action_t action, double priority); /**< Set the priority of an action */
+ void (*set_bound) (surf_action_t action, double bound); /**< Set the bound (the maximum CPU utilization) of an action */
#ifdef HAVE_TRACING
void (*set_category) (surf_action_t action, const char *category); /**< Set the category of an action */
#endif
return xbt_lib_get_elm_or_null(storage_lib, name);
}
-typedef struct surf_resource {
- surf_model_t model;
- char *name;
- xbt_dict_t properties;
-} s_surf_resource_t, *surf_resource_t;
+static inline surf_model_t surf_resource_model(const void *host, int level) {
+ /* If level is SURF_WKS_LEVEL, ws is a workstation_CLM03 object. It has
+ * surf_resource at the generic_resource field. */
+ surf_resource_t ws = xbt_lib_get_level((void *) host, level);
+ return ws->model;
+}
+
+
/**
* Resource which have a metric handled by a maxmin system
/** \ingroup SURF_models
- * \brief The CPU model
+ * \brief The CPU model object for the physical machine layer
*/
-XBT_PUBLIC_DATA(surf_model_t) surf_cpu_model;
+XBT_PUBLIC_DATA(surf_model_t) surf_cpu_model_pm;
+
+/** \ingroup SURF_models
+ * \brief The CPU model object for the virtual machine layer
+ */
+XBT_PUBLIC_DATA(surf_model_t) surf_cpu_model_vm;
/** \ingroup SURF_models
* \brief Initializes the CPU model with the model Cas01
* You can change this behavior by setting the cpu/optim configuration
* variable to a different value.
*
- * This function is called by surf_workstation_model_init_CLM03
- * so you shouldn't have to call it by yourself.
- *
- * \see surf_workstation_model_init_CLM03()
+ * You shouldn't have to call it by yourself.
*/
XBT_PUBLIC(void) surf_cpu_model_init_Cas01(void);
* \brief Initializes the CPU model with trace integration [Deprecated]
*
* You shouldn't have to call it by yourself.
- * \see surf_workstation_model_init_CLM03()
*/
-XBT_PUBLIC(void) surf_cpu_model_init_ti(void);
-
-/** \brief This function call the share resources function needed
- *
- */
-XBT_PUBLIC(double) generic_share_resources(double now);
-
-/** \brief This function call the update action state function needed
- *
- */
-XBT_PUBLIC(void) generic_update_actions_state(double now, double delta);
+XBT_PUBLIC(surf_model_t) surf_cpu_model_init_ti(void);
/** \ingroup SURF_models
* \brief The list of all available optimization modes (both for cpu and networks).
*/
XBT_PUBLIC_DATA(s_surf_model_description_t) surf_cpu_model_description[];
-XBT_PUBLIC(void) create_workstations(void);
-
/**\brief create new host bypass the parser
*
*/
/** \ingroup SURF_models
* \brief Initializes the platform with the network model CM02
*
- * This function is called by surf_workstation_model_init_CLM03
- * or by yourself only if you plan using surf_workstation_model_init_compound
+ * You sould call this function by yourself only if you plan using
+ * surf_workstation_model_init_compound.
* See comments in the code for more information.
- *
- * \see surf_workstation_model_init_CLM03()
*/
XBT_PUBLIC(void) surf_network_model_init_CM02(void);
-/**
- * brief initialize the the network model bypassing the XML parser
- */
-XBT_PUBLIC(void) surf_network_model_init_bypass(const char *id,
- double initial_bw,
- double initial_lat);
-
#ifdef HAVE_GTNETS
/** \ingroup SURF_models
* \brief Initializes the platform with the network model GTNETS
*/
XBT_PUBLIC_DATA(surf_model_t) surf_workstation_model;
+/** \ingroup SURF_models
+ * \brief The vm_workstation model
+ *
+ * Note that when you create an API on top of SURF,
+ * the vm_workstation model should be the only one you use
+ * because depending on the platform model, the network model and the CPU model
+ * may not exist.
+ */
+XBT_PUBLIC_DATA(surf_model_t) surf_vm_workstation_model;
+
/** \ingroup SURF_models
* \brief Initializes the platform with a compound workstation model
*
*/
XBT_PUBLIC(void) surf_workstation_model_init_current_default(void);
-/** \ingroup SURF_models
- * \brief Initializes the platform with the workstation model CLM03
- *
- * This platform model seperates the workstation model and the network model.
- * The workstation model will be initialized with the model CLM03, the network
- * model with the model CM02 and the CPU model with the model Cas01.
- * In future releases, some other network models will be implemented and will be
- * combined with the workstation model CLM03.
- *
- */
-XBT_PUBLIC(void) surf_workstation_model_init_CLM03(void);
-
/** \ingroup SURF_models
* \brief Initializes the platform with the model KCCFLN05
*
* \brief List of initialized models
*/
XBT_PUBLIC_DATA(xbt_dynar_t) model_list;
+XBT_PUBLIC_DATA(xbt_dynar_t) model_list_invoke;
/*******************************************/
/*** SURF Globals **************************/
* This function has to be called to initialize the common
* structures. Then you will have to create the environment by
* calling
- * e.g. surf_workstation_model_init_CLM03()
+ * e.g. surf_workstation_model_init_CM02()
*
- * \see surf_workstation_model_init_CLM03(), surf_workstation_model_init_compound(), surf_exit()
+ * \see surf_workstation_model_init_CM02(), surf_workstation_model_init_compound(), surf_exit()
*/
XBT_PUBLIC(void) surf_init(int *argc, char **argv); /* initialize common structures */
/* Prototypes of the functions that handle the properties */
XBT_PUBLIC_DATA(xbt_dict_t) current_property_set; /* the prop set for the currently parsed element (also used in SIMIX) */
-XBT_PUBLIC(void) parse_properties(void);
/* surf parse file related (public because called from a test suite) */
XBT_PUBLIC(void) parse_platform_file(const char *file);
-/* Stores the sets */
-XBT_PUBLIC_DATA(xbt_dict_t) set_list;
-
/* For the trace and trace:connect tag (store their content till the end of the parsing) */
XBT_PUBLIC_DATA(xbt_dict_t) traces_set_list;
XBT_PUBLIC_DATA(xbt_dict_t) trace_connect_list_host_avail;