X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cf108868b4eeed4d0d9d343bc68557d7814e18c0..5c037db836667c8408d94daf61b893dd1efbabca:/include/simgrid/simix.hpp diff --git a/include/simgrid/simix.hpp b/include/simgrid/simix.hpp index fb3fd5aa5d..9f73275352 100644 --- a/include/simgrid/simix.hpp +++ b/include/simgrid/simix.hpp @@ -9,6 +9,7 @@ #include +#include #include #include #include @@ -81,13 +82,37 @@ typename std::result_of::type kernel(F&& code) class args { private: - int argc_; - char** argv_; + int argc_ = 0; + char** argv_ = nullptr; public: // Main constructors - args() : argc_(0), argv_(nullptr) {} - args(int argc, char** argv) : argc_(argc), argv_(argv) {} + args() {} + + void assign(int argc, const char*const* argv) + { + clear(); + char** new_argv = xbt_new(char*,argc + 1); + for (int i = 0; i < argc; i++) + new_argv[i] = xbt_strdup(argv[i]); + new_argv[argc] = nullptr; + this->argc_ = argc; + this->argv_ = new_argv; + } + args(int argc, const char*const* argv) + { + this->assign(argc, argv); + } + + char** to_argv() const + { + const int argc = argc_; + char** argv = xbt_new(char*, argc + 1); + for (int i=0; i< argc; i++) + argv[i] = xbt_strdup(argv_[i]); + argv[argc] = nullptr; + return argv; + } // Free void clear() @@ -101,8 +126,15 @@ public: ~args() { clear(); } // Copy - args(args const& that) = delete; - args& operator=(args const& that) = delete; + args(args const& that) + { + this->assign(that.argc(), that.argv()); + } + args& operator=(args const& that) + { + this->assign(that.argc(), that.argv()); + return *this; + } // Move: args(args&& that) : argc_(that.argc_), argv_(that.argv_) @@ -125,19 +157,32 @@ public: char* operator[](std::size_t i) { return argv_[i]; } }; -inline -std::function wrap_main(xbt_main_func_t code, int argc, char **argv) +inline std::function wrap_main( + xbt_main_func_t code, std::shared_ptr args) { if (code) { - auto arg = std::make_shared(argc, argv); return [=]() { - code(arg->argc(), arg->argv()); + code(args->argc(), args->argv()); }; } - // TODO, we should free argv else return std::function(); } +inline +std::function wrap_main(xbt_main_func_t code, simgrid::simix::args args) +{ + if (code) + return wrap_main(code, std::unique_ptr( + new simgrid::simix::args(std::move(args)))); + else return std::function(); +} + +inline +std::function wrap_main(xbt_main_func_t code, int argc, const char*const* argv) +{ + return wrap_main(code, simgrid::simix::args(argc, argv)); +} + class Context; class ContextFactory; @@ -238,4 +283,29 @@ XBT_PUBLIC(void) create_maestro(std::function code); } } +/* + * Type of function that creates a process. + * The function must accept the following parameters: + * void* process: the process created will be stored there + * const char *name: a name for the object. It is for user-level information and can be NULL + * xbt_main_func_t code: is a function describing the behavior of the process + * void *data: data a pointer to any data one may want to attach to the new object. + * sg_host_t host: the location where the new process is executed + * int argc, char **argv: parameters passed to code + * xbt_dict_t pros: properties + */ +typedef smx_process_t (*smx_creation_func_t) ( + /* name */ const char*, + /* code */ xbt_main_func_t, + /* userdata */ void*, + /* hostname */ const char*, + /* kill_time */ double, + simgrid::simix::args args, + /* props */ xbt_dict_t, + /* auto_restart */ int, + /* parent_process */ smx_process_t); + +extern "C" +XBT_PUBLIC(void) SIMIX_function_register_process_create(smx_creation_func_t function); + #endif