#include <type_traits>
#include <xbt/function_types.h>
+#include <xbt/future.hpp>
+
#include <simgrid/simix.h>
XBT_PUBLIC(void) simcall_run_kernel(std::function<void()> const& code);
namespace simgrid {
namespace simix {
-/** Fulfill a promise by executing a given code */
-template<class R, class F>
-void fulfill_promise(std::promise<R>& promise, F&& code)
-{
- try {
- promise.set_value(std::forward<F>(code)());
- }
- catch(...) {
- promise.set_exception(std::current_exception());
- }
-}
-
-/** Fulfill a promise by executing a given code
- *
- * This is a special version for `std::promise<void>` because the default
- * version does not compile in this case.
- */
-template<class F>
-void fulfill_promise(std::promise<void>& promise, F&& code)
-{
- try {
- std::forward<F>(code)();
- promise.set_value();
- }
- catch(...) {
- promise.set_exception(std::current_exception());
- }
-}
-
/** Execute some code in the kernel/maestro
*
* This can be used to enforce mutual exclusion with other simcall.
std::promise<R> promise;
simcall_run_kernel([&]{
xbt_assert(SIMIX_is_maestro(), "Not in maestro");
- fulfill_promise(promise, std::forward<F>(code));
+ simgrid::xbt::fulfillPromise(promise, std::forward<F>(code));
});
return promise.get_future().get();
}
-class args {
-private:
- int argc_ = 0;
- char** argv_ = nullptr;
-public:
-
- // Main constructors
- 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()
- {
- for (int i = 0; i < this->argc_; i++)
- free(this->argv_[i]);
- free(this->argv_);
- this->argc_ = 0;
- this->argv_ = nullptr;
- }
- ~args() { clear(); }
-
- // Copy
- 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_)
- {
- that.argc_ = 0;
- that.argv_ = nullptr;
- }
- args& operator=(args&& that)
- {
- this->argc_ = that.argc_;
- this->argv_ = that.argv_;
- that.argc_ = 0;
- that.argv_ = nullptr;
- return *this;
- }
-
- int argc() const { return argc_; }
- char** argv() { return argv_; }
- const char*const* argv() const { return argv_; }
- char* operator[](std::size_t i) { return argv_[i]; }
-};
-
-inline std::function<void()> wrap_main(
- xbt_main_func_t code, std::shared_ptr<simgrid::simix::args> args)
-{
- if (code) {
- return [=]() {
- code(args->argc(), args->argv());
- };
- }
- else return std::function<void()>();
-}
-
-inline
-std::function<void()> wrap_main(xbt_main_func_t code, simgrid::simix::args args)
-{
- if (code)
- return wrap_main(code, std::unique_ptr<simgrid::simix::args>(
- new simgrid::simix::args(std::move(args))));
- else return std::function<void()>();
-}
-
-inline
-std::function<void()> 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;
--- /dev/null
+/* Copyright (c) 2015-2016. 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. */
+
+#ifndef XBT_FUNCTIONAL_HPP
+#define XBT_FUNCTIONAL_HPP
+
+#include <cstdlib>
+
+#include <exception>
+#include <functional>
+#include <future>
+#include <utility>
+
+#include <xbt/sysdep.h>
+
+namespace simgrid {
+namespace xbt {
+
+class args {
+private:
+ int argc_ = 0;
+ char** argv_ = nullptr;
+public:
+
+ // Main constructors
+ 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()
+ {
+ for (int i = 0; i < this->argc_; i++)
+ std::free(this->argv_[i]);
+ std::free(this->argv_);
+ this->argc_ = 0;
+ this->argv_ = nullptr;
+ }
+ ~args() { clear(); }
+
+ // Copy
+ 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_)
+ {
+ that.argc_ = 0;
+ that.argv_ = nullptr;
+ }
+ args& operator=(args&& that)
+ {
+ this->argc_ = that.argc_;
+ this->argv_ = that.argv_;
+ that.argc_ = 0;
+ that.argv_ = nullptr;
+ return *this;
+ }
+
+ int argc() const { return argc_; }
+ char** argv() { return argv_; }
+ const char*const* argv() const { return argv_; }
+ char* operator[](std::size_t i) { return argv_[i]; }
+};
+
+template<class F> inline
+std::function<void()> wrapMain(F code, std::shared_ptr<simgrid::xbt::args> args)
+{
+ return [=]() {
+ code(args->argc(), args->argv());
+ };
+}
+
+template<class F> inline
+std::function<void()> wrapMain(F code, simgrid::xbt::args args)
+{
+ return wrapMain(std::move(code),
+ std::unique_ptr<simgrid::xbt::args>(new simgrid::xbt::args(std::move(args))));
+}
+
+template<class F> inline
+std::function<void()> wrapMain(F code, int argc, const char*const* argv)
+{
+ return wrapMain(std::move(code), args(argc, argv));
+}
+
+}
+}
+
+#endif
--- /dev/null
+/* Copyright (c) 2015-2016. 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. */
+
+#ifndef XBT_FUTURE_HPP
+#define XBT_FUTURE_HPP
+
+#include <future>
+#include <utility>
+#include <exception>
+
+namespace simgrid {
+namespace xbt {
+
+/** Fulfill a promise by executing a given code */
+template<class R, class F>
+void fulfillPromise(std::promise<R>& promise, F code)
+{
+ try {
+ promise.set_value(code());
+ }
+ catch(...) {
+ promise.set_exception(std::current_exception());
+ }
+}
+
+/** Fulfill a promise by executing a given code
+ *
+ * This is a special version for `std::promise<void>` because the default
+ * version does not compile in this case.
+ */
+template<class F>
+void fulfillPromise(std::promise<void>& promise, F code)
+{
+ try {
+ (code)();
+ promise.set_value();
+ }
+ catch(...) {
+ promise.set_exception(std::current_exception());
+ }
+}
+
+}
+}
+
+#endif
#include "msg_private.h"
#include "xbt/sysdep.h"
#include "xbt/log.h"
+#include "xbt/functional.hpp"
#include "src/simix/smx_process_private.h"
#include "src/simix/smx_private.h"
int argc, char **argv, xbt_dict_t properties)
{
msg_process_t res = MSG_process_create_with_environment(name,
- simgrid::simix::wrap_main(code, argc, argv), data, host,
+ code ? simgrid::xbt::wrapMain(code, argc, argv) : std::function<void()>(),
+ data, host,
properties);
for (int i = 0; i != argc; ++i)
xbt_free(argv[i]);
#include <functional>
+#include <xbt/functional.hpp>
+
#include "src/mc/mc_replay.h"
#include "smx_private.h"
#include "src/mc/mc_forward.hpp"
{
if (name == nullptr)
name = "";
- auto wrapped_code = simgrid::simix::wrap_main(code, argc, argv);
+ auto wrapped_code = simgrid::xbt::wrapMain(code, argc, argv);
for (int i = 0; i != argc; ++i)
xbt_free(argv[i]);
xbt_free(argv);
#include "xbt/str.h"
#include "xbt/dict.h"
#include "xbt/RngStream.h"
+#include <xbt/functional.hpp>
#include <xbt/signal.hpp>
#include "src/surf/HostImpl.hpp"
#include "surf/surf.h"
double kill_time = process->kill_time;
int auto_restart = process->on_failure == SURF_PROCESS_ON_FAILURE_DIE ? 0 : 1;
- std::function<void()> code = simgrid::simix::wrap_main(parse_code, process->argc, process->argv);
+ std::function<void()> code = simgrid::xbt::wrapMain(parse_code, process->argc, process->argv);
smx_process_arg_t arg = NULL;
smx_process_t process_created = NULL;
include/xbt/fifo.h
include/xbt/file.h
include/xbt/function_types.h
+ include/xbt/functional.hpp
+ include/xbt/future.hpp
include/xbt/graph.h
include/xbt/heap.h
include/xbt/lib.h