-/* Copyright (c) 2004-2018. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2004-2019. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include "mc/mc.h"
#include "simgrid/s4u/Engine.hpp"
#include "simgrid/sg_config.hpp"
-#include "src/instr/instr_private.hpp" // TRACE_end(). FIXME: remove by subscribing tracing to the surf signals
#include "src/internal_config.h"
+#include "src/simgrid/version.h"
#include "src/surf/HostImpl.hpp"
#include "src/surf/xml/platf.hpp"
#include "surf/surf.hpp"
+#include "xbt/module.h"
#include <fstream>
#include <string>
* Utils *
*********/
-std::vector<simgrid::kernel::resource::Model*>* all_existing_models = nullptr; /* to destroy models correctly */
+std::vector<simgrid::kernel::resource::Model*> all_existing_models; /* to destroy models correctly */
-simgrid::trace_mgr::future_evt_set *future_evt_set = nullptr;
+simgrid::kernel::profile::FutureEvtSet future_evt_set;
std::vector<std::string> surf_path;
-std::vector<simgrid::s4u::Host*> host_that_restart;
/** 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 {
+s_surf_model_description_t* surf_plugin_description = nullptr;
+XBT_PUBLIC void simgrid_add_plugin_description(const char* name, const char* description, void_f_void_t init_fun)
+{
+ static int plugin_amount = 0;
-simgrid::xbt::signal<void()> surfExitCallbacks;
-}
-}
+ /* no need to check for plugin name conflict: the compiler already ensures that the generated
+ * simgrid_##id##_plugin_register() is unique */
-#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
+ plugin_amount++;
+ surf_plugin_description = static_cast<s_surf_model_description_t*>(
+ xbt_realloc(surf_plugin_description, sizeof(s_surf_model_description_t) * (plugin_amount + 2)));
-s_surf_model_description_t surf_plugin_description[] = {
- {"Energy", "Cpu energy consumption.", &sg_host_energy_plugin_init},
- {"Load", "Cpu load.", &sg_host_load_plugin_init},
- {nullptr, nullptr, nullptr} /* this array must be nullptr terminated */
-};
+ surf_plugin_description[plugin_amount - 1] = {name, description, init_fun};
+ surf_plugin_description[plugin_amount] = {nullptr, nullptr, nullptr}; // this array must be null terminated
+}
/* Don't forget to update the option description in smx_config when you change this */
s_surf_model_description_t surf_network_model_description[] = {
return NOW;
}
-std::ifstream* surf_ifsopen(std::string name)
+/* returns whether #file_path is a absolute file path. Surprising, isn't it ? */
+static bool is_absolute_file_path(const std::string& file_path)
+{
+#ifdef _WIN32
+ WIN32_FIND_DATA wfd = {0};
+ HANDLE hFile = FindFirstFile(file_path.c_str(), &wfd);
+
+ if (INVALID_HANDLE_VALUE == hFile)
+ return false;
+
+ FindClose(hFile);
+ return true;
+#else
+ return (file_path.c_str()[0] == '/');
+#endif
+}
+
+std::ifstream* surf_ifsopen(const std::string& name)
{
- std::ifstream* fs = new std::ifstream();
xbt_assert(not name.empty());
- if (__surf_is_absolute_file_path(name.c_str())) { /* don't mess with absolute file names */
+
+ std::ifstream* fs = new std::ifstream();
+ if (is_absolute_file_path(name)) { /* don't mess with absolute file names */
fs->open(name.c_str(), std::ifstream::in);
}
return fs;
}
-FILE *surf_fopen(const char *name, const char *mode)
+FILE* surf_fopen(const std::string& name, const char* mode)
{
FILE *file = nullptr;
- xbt_assert(name);
-
- if (__surf_is_absolute_file_path(name)) /* don't mess with absolute file names */
- return fopen(name, mode);
+ if (is_absolute_file_path(name)) /* don't mess with absolute file names */
+ return fopen(name.c_str(), mode);
/* search relative files in the path */
for (auto const& path_elm : surf_path) {
return nullptr;
}
-/* The __surf_is_absolute_file_path() returns 1 if
- * file_path is a absolute file path, in the other
- * case the function returns 0.
- */
-int __surf_is_absolute_file_path(const char *file_path)
-{
-#ifdef _WIN32
- WIN32_FIND_DATA wfd = { 0 };
- HANDLE hFile = FindFirstFile(file_path, &wfd);
-
- if (INVALID_HANDLE_VALUE == hFile)
- return 0;
-
- FindClose(hFile);
- return 1;
-#else
- return (file_path[0] == '/');
-#endif
-}
-
/** Displays the long description of all registered models, and quit */
void model_help(const char *category, s_surf_model_description_t * table)
{
printf(" %s: %s\n", table[i].name, table[i].description);
}
-int find_model_description(s_surf_model_description_t* table, std::string name)
+int find_model_description(s_surf_model_description_t* table, const std::string& name)
{
for (int i = 0; table[i].name; i++)
if (name == table[i].name)
abort();
}
if (lib_version_patch != SIMGRID_VERSION_PATCH) {
- if (SIMGRID_VERSION_PATCH >= 90 || lib_version_patch >= 90) {
+ if (SIMGRID_VERSION_PATCH > 89 || lib_version_patch > 89) {
fprintf(
stderr,
"FATAL ERROR: Your program was compiled with SimGrid version %d.%d.%d, "
USER_HOST_LEVEL = simgrid::s4u::Host::extension_create(nullptr);
xbt_init(argc, argv);
- if (not all_existing_models)
- all_existing_models = new std::vector<simgrid::kernel::resource::Model*>();
- if (not future_evt_set)
- future_evt_set = new simgrid::trace_mgr::future_evt_set();
sg_config_init(argc, argv);
void surf_exit()
{
- TRACE_end(); /* Just in case it was not called by the upper layer (or there is no upper layer) */
-
simgrid::s4u::Engine::shutdown();
- sg_link_exit();
for (auto const& e : storage_types) {
simgrid::surf::StorageType* stype = e.second;
delete stype->properties;
delete stype;
}
- for (auto const& model : *all_existing_models)
+ for (auto const& model : all_existing_models)
delete model;
- delete all_existing_models;
-
- if (future_evt_set) {
- delete future_evt_set;
- future_evt_set = nullptr;
- }
+ xbt_free(surf_plugin_description);
tmgr_finalize();
sg_platf_exit();