Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Allow to register functions that are void (*code)(std::vector<std::string>)
authorMartin Quinson <martin.quinson@loria.fr>
Sun, 5 Aug 2018 23:01:27 +0000 (01:01 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Sun, 5 Aug 2018 23:01:27 +0000 (01:01 +0200)
include/simgrid/s4u/Engine.hpp
include/simgrid/simix.h
include/simgrid/simix.hpp
include/xbt/functional.hpp
src/s4u/s4u_Engine.cpp
src/simix/smx_deployment.cpp

index 27445d9..fe486f4 100644 (file)
@@ -53,7 +53,8 @@ public:
 
   /** Registers the main function of an actor that will be launched from the deployment file */
   void register_function(std::string name, int (*code)(int, char**));
-  // FIXME: provide a register_function(std::string, std::vector<std::string>)
+  /** Registers the main function of an actor that will be launched from the deployment file */
+  void register_function(std::string name, void (*code)(std::vector<std::string>));
 
   /** Registers a function as the default main function of actors
    *
index 0331d6b..7f20595 100644 (file)
@@ -14,6 +14,7 @@
 #include <functional>
 #include <string>
 #include <unordered_map>
+#include <vector>
 #endif
 
 /* ******************************** Host ************************************ */
@@ -134,6 +135,7 @@ XBT_PUBLIC void SIMIX_process_set_function(const char* process_host, const char*
 SG_END_DECL()
 
 #ifdef __cplusplus
+XBT_PUBLIC void SIMIX_function_register(std::string name, void (*code)(std::vector<std::string>));
 XBT_PUBLIC void SIMIX_function_register(std::string name, xbt_main_func_t code);
 XBT_PUBLIC void SIMIX_launch_application(std::string file);
 #endif
index 0af3963..9720dc8 100644 (file)
@@ -70,7 +70,7 @@ XBT_PUBLIC const std::vector<smx_actor_t>& process_get_runnable();
 // What's executed as SIMIX actor code:
 typedef std::function<void()> ActorCode;
 
-// Create ActorCode based on argv:
+// Create an ActorCode based on a std::string
 typedef std::function<ActorCode(std::vector<std::string> args)> ActorCodeFactory;
 
 XBT_PUBLIC void register_function(std::string name, ActorCodeFactory factory);
index 4b5f0af..a0c4f26 100644 (file)
 namespace simgrid {
 namespace xbt {
 
-template<class F>
-class MainFunction {
+template <class F> class MainFunction {
 private:
   F code_;
   std::shared_ptr<const std::vector<std::string>> args_;
+
 public:
-  MainFunction(F code, std::vector<std::string> args) :
-    code_(std::move(code)),
-    args_(std::make_shared<const std::vector<std::string>>(std::move(args)))
-  {}
+  MainFunction(F code, std::vector<std::string> args)
+      : code_(std::move(code)), args_(std::make_shared<const std::vector<std::string>>(std::move(args)))
+  {
+  }
   void operator()() const
   {
-    const int argc = args_->size();
+    const int argc                = args_->size();
     std::vector<std::string> args = *args_;
     if (not args.empty()) {
       char noarg[] = {'\0'};
       std::unique_ptr<char* []> argv(new char*[argc + 1]);
       for (int i = 0; i != argc; ++i)
-        argv[i]  = args[i].empty() ? noarg : &args[i].front();
+        argv[i] = args[i].empty() ? noarg : &args[i].front();
       argv[argc] = nullptr;
       code_(argc, argv.get());
     } else
       code_(argc, nullptr);
   }
 };
+class MainStdFunction {
+private:
+  void (*code_)(std::vector<std::string>);
+  std::shared_ptr<const std::vector<std::string>> args_;
+
+public:
+  MainStdFunction(void (*code)(std::vector<std::string>), std::vector<std::string> args)
+      : code_(std::move(code)), args_(std::make_shared<const std::vector<std::string>>(std::move(args)))
+  {
+  }
+  void operator()() const
+  {
+    std::vector<std::string> args = *args_;
+    code_(args);
+  }
+};
 
 template <class F>
 inline XBT_ATTRIB_DEPRECATED_v323("Please use wrap_main()") std::function<void()> wrapMain(
@@ -63,6 +79,10 @@ template <class F> inline std::function<void()> wrap_main(F code, std::vector<st
 {
   return MainFunction<F>(std::move(code), std::move(args));
 }
+inline std::function<void()> wrap_main(void (*code)(std::vector<std::string>), std::vector<std::string> args)
+{
+  return MainStdFunction(std::move(code), std::move(args));
+}
 
 template <class F>
 inline XBT_ATTRIB_DEPRECATED_v323("Please use wrap_main()") std::function<void()> wrapMain(F code, int argc,
index 6f5e4d6..afdc16f 100644 (file)
@@ -80,6 +80,10 @@ void Engine::register_function(std::string name, int (*code)(int, char**))
 {
   SIMIX_function_register(name, code);
 }
+void Engine::register_function(std::string name, void (*code)(std::vector<std::string>))
+{
+  SIMIX_function_register(name, code);
+}
 void Engine::register_default(int (*code)(int, char**))
 {
   SIMIX_function_register_default(code);
index e947067..79045d9 100644 (file)
@@ -67,6 +67,10 @@ static simgrid::simix::ActorCodeFactory toActorCodeFactory(xbt_main_func_t code)
 {
   return [code](std::vector<std::string> args) { return simgrid::xbt::wrap_main(code, std::move(args)); };
 }
+static simgrid::simix::ActorCodeFactory toActorCodeFactory(void (*code)(std::vector<std::string>))
+{
+  return [code](std::vector<std::string> args) { return simgrid::xbt::wrap_main(code, std::move(args)); };
+}
 
 /**
  * @brief Registers a #xbt_main_func_t code in a global table.
@@ -78,8 +82,10 @@ static simgrid::simix::ActorCodeFactory toActorCodeFactory(xbt_main_func_t code)
  */
 void SIMIX_function_register(std::string name, xbt_main_func_t code)
 {
-  xbt_assert(simix_global,
-    "SIMIX_global_init has to be called before SIMIX_function_register.");
+  simix_global->registered_functions[name] = toActorCodeFactory(code);
+}
+void SIMIX_function_register(std::string name, void (*code)(std::vector<std::string>))
+{
   simix_global->registered_functions[name] = toActorCodeFactory(code);
 }