#include "mc/mc.h"
#include "simgrid/s4u/Engine.hpp"
#include "simgrid/sg_config.h"
-#include "src/instr/instr_private.h" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals
+#include "src/instr/instr_private.hpp" // TRACE_is_enabled(). FIXME: remove by subscribing tracing to the surf signals
#include "src/kernel/routing/NetPoint.hpp"
#include "src/surf/HostImpl.hpp"
#include <fstream>
+#include <set>
+#include <string>
#include <vector>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
XBT_LOG_NEW_CATEGORY(surf, "All SURF categories");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_kernel, surf, "Logging specific to SURF (kernel)");
simgrid::trace_mgr::future_evt_set *future_evt_set = nullptr;
std::vector<std::string> surf_path;
std::vector<simgrid::s4u::Host*> host_that_restart;
-xbt_dict_t watched_hosts_lib;
-extern std::map<std::string, storage_type_t> storage_types;
+/** set of hosts for which one want to be notified if they ever restart. */
+std::set<std::string> watched_hosts;
+extern std::map<std::string, simgrid::surf::StorageType*> storage_types;
namespace simgrid {
namespace surf {
}
}
-#include <simgrid/plugins/energy.h> // FIXME: this plugin should not be linked to the core
-#include <simgrid/plugins/load.h> // FIXME: this plugin should not be linked to the core
+#include <simgrid/plugins/energy.h> // FIXME: this plug-in should not be linked to the core
+#include <simgrid/plugins/load.h> // FIXME: this plug-in should not be linked to the core
s_surf_model_description_t surf_plugin_description[] = {
{"Energy", "Cpu energy consumption.", &sg_host_energy_plugin_init},
{nullptr, nullptr, nullptr} /* this array must be nullptr terminated */
};
-#if HAVE_THREAD_CONTEXTS
-static xbt_parmap_t surf_parmap = nullptr; /* parallel map on models */
-#endif
-
double NOW = 0;
double surf_get_clock()
# define FILE_DELIM "/" /* FIXME: move to better location */
#endif
-std::ifstream* surf_ifsopen(const char* name)
+std::ifstream* surf_ifsopen(std::string name)
{
std::ifstream* fs = new std::ifstream();
- xbt_assert(name);
- if (__surf_is_absolute_file_path(name)) { /* don't mess with absolute file names */
- fs->open(name, std::ifstream::in);
+ xbt_assert(not name.empty());
+ if (__surf_is_absolute_file_path(name.c_str())) { /* don't mess with absolute file names */
+ fs->open(name.c_str(), std::ifstream::in);
}
/* search relative files in the path */
- for (auto path_elm : surf_path) {
+ for (auto const& path_elm : surf_path) {
std::string buff = path_elm + FILE_DELIM + name;
fs->open(buff.c_str(), std::ifstream::in);
return fs;
}
+
FILE *surf_fopen(const char *name, const char *mode)
{
FILE *file = nullptr;
return fopen(name, mode);
/* search relative files in the path */
- for (auto path_elm : surf_path) {
+ for (auto const& path_elm : surf_path) {
std::string buff = path_elm + FILE_DELIM + name;
file = fopen(buff.c_str(), mode);
return nullptr;
}
-#ifdef _WIN32
-#include <windows.h>
-#define MAX_DRIVE 26
-static const char *disk_drives_letter_table[MAX_DRIVE] = {
- "A:\\","B:\\","C:\\","D:\\","E:\\","F:\\","G:\\","H:\\","I:\\","J:\\","K:\\","L:\\","M:\\",
- "N:\\","O:\\","P:\\","Q:\\","R:\\","S:\\","T:\\","U:\\","V:\\","W:\\","X:\\","Y:\\","Z:\\"
-};
-#endif
-
-/*
- * Returns the initial path. On Windows the initial path is
- * the current directory for the current process in the other
- * case the function returns "./" that represents the current
- * directory on Unix/Linux platforms.
- */
-
-const char *__surf_get_initial_path()
-{
-
-#ifdef _WIN32
- unsigned i;
- char current_directory[MAX_PATH + 1] = { 0 };
- unsigned int len = GetCurrentDirectory(MAX_PATH + 1, current_directory);
- char root[4] = { 0 };
-
- if (not len)
- return nullptr;
-
- strncpy(root, current_directory, 3);
-
- for (i = 0; i < MAX_DRIVE; i++) {
- if (toupper(root[0]) == disk_drives_letter_table[i][0])
- return disk_drives_letter_table[i];
- }
-
- return nullptr;
-#else
- return "./";
-#endif
-}
-
/* The __surf_is_absolute_file_path() returns 1 if
* file_path is a absolute file path, in the other
* case the function returns 0.
printf(" %s: %s\n", table[i].name, table[i].description);
}
-int find_model_description(s_surf_model_description_t * table,
- const char *name)
+int find_model_description(s_surf_model_description_t* table, std::string name)
{
- int i;
- char *name_list = nullptr;
-
- for (i = 0; table[i].name; i++)
- if (not strcmp(name, table[i].name)) {
+ for (int i = 0; table[i].name; i++)
+ if (name == table[i].name)
return i;
- }
+
if (not table[0].name)
xbt_die("No model is valid! This is a bug.");
- name_list = xbt_strdup(table[0].name);
- for (i = 1; table[i].name; i++) {
- name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3);
- strncat(name_list, ", ", 2);
- strncat(name_list, table[i].name, strlen(table[i].name));
- }
- xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list);
+
+ std::string name_list = std::string(table[0].name);
+ for (int i = 1; table[i].name; i++)
+ name_list = name_list + ", " + table[i].name;
+
+ xbt_die("Model '%s' is invalid! Valid models are: %s.", name.c_str(), name_list.c_str());
return -1;
}
XBT_DEBUG("Create all Libs");
USER_HOST_LEVEL = simgrid::s4u::Host::extension_create(nullptr);
- watched_hosts_lib = xbt_dict_new_homogeneous(nullptr);
-
xbt_init(argc, argv);
if (not all_existing_models)
all_existing_models = new std::vector<simgrid::surf::Model*>();
if (not future_evt_set)
future_evt_set = new simgrid::trace_mgr::future_evt_set();
- TRACE_surf_alloc();
- simgrid::surf::surfExitCallbacks.connect(TRACE_surf_release);
-
sg_config_init(argc, argv);
if (MC_is_active())
sg_host_exit();
sg_link_exit();
- xbt_dict_free(&watched_hosts_lib);
- for (auto e : storage_types) {
- storage_type_t stype = e.second;
- free(stype->model);
- free(stype->type_id);
- free(stype->content);
- xbt_dict_free(&(stype->properties));
+ for (auto const& e : storage_types) {
+ simgrid::surf::StorageType* stype = e.second;
+ delete stype->properties;
delete stype->model_properties;
- free(stype);
+ delete stype;
}
- for (auto s : *simgrid::surf::StorageImpl::storagesMap())
+ for (auto const& s : *simgrid::surf::StorageImpl::storagesMap())
delete s.second;
delete simgrid::surf::StorageImpl::storagesMap();
- for (auto model : *all_existing_models)
+ for (auto const& model : *all_existing_models)
delete model;
delete all_existing_models;
future_evt_set = nullptr;
}
-#if HAVE_THREAD_CONTEXTS
- xbt_parmap_destroy(surf_parmap);
-#endif
-
tmgr_finalize();
sg_platf_exit();
simgrid::s4u::Engine::shutdown();
doneActionSet_ = new ActionList();
modifiedSet_ = nullptr;
- actionHeap_ = nullptr;
updateMechanism_ = UM_UNDEFINED;
selectiveUpdate_ = 0;
}
delete doneActionSet_;
}
+Action* Model::actionHeapPop()
+{
+ Action* action = actionHeap_.top().second;
+ actionHeap_.pop();
+ action->clearHeapHandle();
+ return action;
+}
+
double Model::nextOccuringEvent(double now)
{
//FIXME: set the good function once and for all
}
//hereafter must have already the min value for this resource model
- if (xbt_heap_size(actionHeap_) > 0) {
- double min = xbt_heap_maxkey(actionHeap_) - now;
+ if (not actionHeapIsEmpty()) {
+ double min = actionHeapTopDate() - now;
XBT_DEBUG("minimum with the HEAP %f", min);
return min;
} else {
namespace simgrid {
namespace surf {
-Resource::Resource(Model* model, const char* name, lmm_constraint_t constraint)
+Resource::Resource(Model* model, const std::string& name, lmm_constraint_t constraint)
: name_(name), model_(model), constraint_(constraint)
{}
return model_;
}
-const char* Resource::cname() const
+const std::string& Resource::getName() const
+{
+ return name_;
+}
+
+const char* Resource::getCname() const
{
return name_.c_str();
}
"SURF_ACTION_NOT_IN_THE_SYSTEM"
};
-/* added to manage the communication action's heap */
-void surf_action_lmm_update_index_heap(void *action, int i) {
- static_cast<simgrid::surf::Action*>(action)->updateIndexHeap(i);
-}
-
namespace simgrid {
namespace surf {
xbt_free(category_);
}
-void Action::finish() {
- finishTime_ = surf_get_clock();
+void Action::finish(Action::State state)
+{
+ finishTime_ = surf_get_clock();
+ setState(state);
}
Action::State Action::getState()
double Action::getFinishTime()
{
- /* keep the function behavior, some models (cpu_ti) change the finish time before the action end */
- return remains_ <= 0 ? finishTime_ : -1;
+ return finishTime_;
}
void Action::setData(void* data)
{
XBT_IN("(%p)", this);
if (suspended_ != 2) {
- lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), sharingWeight_);
+ lmm_update_variable_weight(getModel()->getMaxminSystem(), getVariable(), getPriority());
suspended_ = 0;
if (getModel()->getUpdateMechanism() == UM_LAZY)
heapRemove(getModel()->getActionHeap());
* LATENCY = this is a heap entry to warn us when the latency is payed
* MAX_DURATION =this is a heap entry to warn us when the max_duration limit is reached
*/
-void Action::heapInsert(xbt_heap_t heap, double key, enum heap_action_type hat)
+void Action::heapInsert(heap_type& heap, double key, enum heap_action_type hat)
{
hat_ = hat;
- xbt_heap_push(heap, this, key);
+ heapHandle_ = heap.emplace(std::make_pair(key, this));
}
-void Action::heapRemove(xbt_heap_t heap)
+void Action::heapRemove(heap_type& heap)
{
hat_ = NOTSET;
- if (indexHeap_ >= 0) {
- xbt_heap_remove(heap, indexHeap_);
+ if (heapHandle_) {
+ heap.erase(*heapHandle_);
+ clearHeapHandle();
}
}
-void Action::heapUpdate(xbt_heap_t heap, double key, enum heap_action_type hat)
+void Action::heapUpdate(heap_type& heap, double key, enum heap_action_type hat)
{
hat_ = hat;
- if (indexHeap_ >= 0) {
- xbt_heap_update(heap, indexHeap_, key);
- }else{
- xbt_heap_push(heap, this, key);
+ if (heapHandle_) {
+ heap.update(*heapHandle_, std::make_pair(key, this));
+ } else {
+ heapHandle_ = heap.emplace(std::make_pair(key, this));
}
}
-void Action::updateIndexHeap(int i) {
- indexHeap_ = i;
-}
-
double Action::getRemains()
{
XBT_IN("(%p)", this);
return remains_;
}
-//FIXME split code in the right places
-void Action::updateRemainingLazy(double now)
-{
- double delta = 0.0;
-
- if(getModel() == surf_network_model)
- {
- if (suspended_ != 0)
- return;
- }
- else
- {
- xbt_assert(stateSet_ == getModel()->getRunningActionSet(), "You're updating an action that is not running.");
- xbt_assert(sharingWeight_ > 0, "You're updating an action that seems suspended.");
- }
-
- delta = now - lastUpdate_;
-
- if (remains_ > 0) {
- XBT_DEBUG("Updating action(%p): remains was %f, last_update was: %f", this, remains_, lastUpdate_);
- double_update(&remains_, lastValue_ * delta, sg_surf_precision*sg_maxmin_precision);
-
- if (getModel() == surf_cpu_model_pm && TRACE_is_enabled()) {
- simgrid::surf::Resource *cpu = static_cast<simgrid::surf::Resource*>(
- lmm_constraint_id(lmm_get_cnst_from_var(getModel()->getMaxminSystem(), getVariable(), 0)));
- TRACE_surf_host_set_utilization(cpu->cname(), getCategory(), lastValue_, lastUpdate_, now - lastUpdate_);
- }
- XBT_DEBUG("Updating action(%p): remains is now %f", this, remains_);
- }
-
- if(getModel() == surf_network_model)
- {
- if (maxDuration_ != NO_MAX_DURATION)
- double_update(&maxDuration_, delta, sg_surf_precision);
-
- //FIXME: duplicated code
- if (((remains_ <= 0) && (lmm_get_variable_weight(getVariable()) > 0)) ||
- ((maxDuration_ > NO_MAX_DURATION) && (maxDuration_ <= 0))) {
- finish();
- setState(Action::State::done);
- heapRemove(getModel()->getActionHeap());
- }
- }
-
- lastUpdate_ = now;
- lastValue_ = lmm_variable_getvalue(getVariable());
-}
-
}
}