Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new entry in Release_Notes.
[simgrid.git] / src / simgrid / module.hpp
1 /* Copyright (c) 2004-2023. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #ifndef SIMGRID_MODULE_HPP
7 #define SIMGRID_MODULE_HPP
8
9 #include <xbt/base.h>
10
11 #include <functional>
12 #include <string>
13 #include <vector>
14
15 namespace simgrid {
16
17 struct Module {
18   const char* name_;
19   const char* description_;
20   std::function<void()> init;
21   Module(const char* id, const char* desc, std::function<void()> init_fun)
22       : name_(id), description_(desc), init(std::move(init_fun))
23   {
24   }
25 };
26
27 class ModuleGroup {
28   std::vector<Module> table_;
29   const std::string kind_; // either 'plugin' or 'CPU model' or whatever. Used in error messages only
30   std::string opt_name_;
31
32 public:
33   explicit ModuleGroup(const std::string& kind) : kind_(kind) {}
34
35   ModuleGroup& add(const char* id, const char* desc, std::function<void()> init);
36   Module const& by_name(const std::string& name) const;
37   void help() const;
38   const std::string& get_kind() const { return kind_; }
39   std::string existing_values() const;
40   void create_flag(const std::string& opt_name, const std::string& descr, const std::string& default_value,
41                    bool init_now);
42   void init_from_flag_value() const;
43 };
44
45 }; // namespace simgrid
46
47 #define SIMGRID_REGISTER_PLUGIN(id, desc, init)                                                                        \
48   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _plugin_register)()                               \
49   {                                                                                                                    \
50     simgrid_plugins().add(_XBT_STRINGIFY(id), (desc), (init));                                                         \
51   }
52 /** @brief The list of all available plugins */
53 inline auto& simgrid_plugins() // Function to avoid static initialization order fiasco
54 {
55   static simgrid::ModuleGroup plugins("plugin");
56   return plugins;
57 }
58
59 #define SIMGRID_REGISTER_NETWORK_MODEL(id, desc, init)                                                                 \
60   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _network_model_register)()                        \
61   {                                                                                                                    \
62     simgrid_network_models().add(_XBT_STRINGIFY(id), (desc), (init));                                                  \
63   }
64 /** @brief The list of all available network models (pick one with --cfg=network/model) */
65 inline auto& simgrid_network_models() // Function to avoid static initialization order fiasco
66 {
67   static simgrid::ModuleGroup models("network model");
68   return models;
69 }
70
71 #define SIMGRID_REGISTER_CPU_MODEL(id, desc, init)                                                                     \
72   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _cpu_model_register)()                            \
73   {                                                                                                                    \
74     simgrid_cpu_models().add(_XBT_STRINGIFY(id), (desc), (init));                                                      \
75   }
76 /** @brief The list of all available CPU models (pick one with --cfg=cpu/model) */
77 inline auto& simgrid_cpu_models() // Function to avoid static initialization order fiasco
78 {
79   static simgrid::ModuleGroup models("CPU model");
80   return models;
81 }
82
83 #define SIMGRID_REGISTER_DISK_MODEL(id, desc, init)                                                                    \
84   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _disk_model_register)()                           \
85   {                                                                                                                    \
86     simgrid_disk_models().add(_XBT_STRINGIFY(id), (desc), (init));                                                     \
87   }
88 /** @brief The list of all available disk models (pick one with --cfg=disk/model) */
89 inline auto& simgrid_disk_models() // Function to avoid static initialization order fiasco
90 {
91   static simgrid::ModuleGroup models("disk model");
92   return models;
93 }
94
95 #define SIMGRID_REGISTER_HOST_MODEL(id, desc, init)                                                                    \
96   static void XBT_ATTRIB_CONSTRUCTOR(800) _XBT_CONCAT3(simgrid_, id, _host_model_register)()                           \
97   {                                                                                                                    \
98     simgrid_host_models().add(_XBT_STRINGIFY(id), (desc), (init));                                                     \
99   }
100 /** @brief The list of all available host models (pick one with --cfg=host/model) */
101 inline auto& simgrid_host_models() // Function to avoid static initialization order fiasco
102 {
103   static simgrid::ModuleGroup models("host model");
104   return models;
105 }
106
107 XBT_PUBLIC void simgrid_vm_model_init_HL13();
108
109 #endif