X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4a6b0a991a67e6f2f67c03fed43529e078da7115..f232c72280368ced3f5706dde1014d969dac3649:/include/simgrid/simix.hpp?ds=sidebyside diff --git a/include/simgrid/simix.hpp b/include/simgrid/simix.hpp index fb3fd5aa5d..bb75c8a9fb 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,44 @@ 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*, + std::function code, + /* userdata */ void*, + /* hostname */ const char*, + /* kill_time */ double, + /* 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); + +XBT_PUBLIC(smx_process_t) simcall_process_create(const char *name, + std::function code, + void *data, + const char *hostname, + double kill_time, + xbt_dict_t properties, + int auto_restart); + +XBT_PUBLIC(smx_timer_t) SIMIX_timer_set(double date, std::function callback); + +template inline +XBT_PUBLIC(smx_timer_t) SIMIX_timer_set(double date, R(*callback)(T*), T* arg) +{ + return SIMIX_timer_set(date, [=](){ callback(arg); }); +} + #endif