X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/be686e8a6c146134765b35b45bab6a731cc43b74..09fcf6b32a677469632d6a2aad754ab4e431c530:/src/bindings/python/simgrid_python.cpp diff --git a/src/bindings/python/simgrid_python.cpp b/src/bindings/python/simgrid_python.cpp index a8e9ce79da..97fa4d3302 100644 --- a/src/bindings/python/simgrid_python.cpp +++ b/src/bindings/python/simgrid_python.cpp @@ -76,15 +76,6 @@ std::string get_simgrid_version() sg_version_get(&major, &minor, &patch); return simgrid::xbt::string_printf("%i.%i.%i", major, minor, patch); } - -/** @brief Wrap for mailbox::get_async */ -class PyGetAsync { - std::unique_ptr data = std::make_unique(); - -public: - PyObject** get() const { return data.get(); } -}; - } // namespace PYBIND11_DECLARE_HOLDER_TYPE(T, boost::intrusive_ptr) @@ -245,10 +236,17 @@ PYBIND11_MODULE(simgrid, m) .def_static("create_empty_zone", &simgrid::s4u::create_empty_zone, "Creates a zone of type Empty") .def_static("create_wifi_zone", &simgrid::s4u::create_wifi_zone, "Creates a zone of type Wi-Fi") .def("add_route", - py::overload_cast&, bool>(&simgrid::s4u::NetZone::add_route), - "Add a route between 2 netpoints") + [](simgrid::s4u::NetZone* self, simgrid::kernel::routing::NetPoint* src, + simgrid::kernel::routing::NetPoint* dst, simgrid::kernel::routing::NetPoint* gw_src, + simgrid::kernel::routing::NetPoint* gw_dst, const std::vector& links, + bool symmetrical) { + PyErr_WarnEx(PyExc_DeprecationWarning, // XBT_ATTRIB_DEPRECATED_v335. Once removed, uncomment the + // deprecation of the AddRoute function in C++ + "Please call add_route either from Host to Host or NetZone to NetZone. This call will be " + "removed after SimGrid v3.35.", + 1); + self->add_route(src, dst, gw_src, gw_dst, links, symmetrical); + }) .def("add_route", py::overload_cast&, bool>(&simgrid::s4u::NetZone::add_route), @@ -634,26 +632,14 @@ PYBIND11_MODULE(simgrid, m) "get", [](Mailbox* self) { return py::reinterpret_steal(self->get()); }, py::call_guard(), "Blocking data reception") .def( - "get_async", - [](Mailbox* self) -> std::tuple { - PyGetAsync wrap; - auto comm = self->get_async(wrap.get()); - return std::make_tuple(std::move(comm), std::move(wrap)); - }, + "get_async", [](Mailbox* self) -> CommPtr { return self->get_async(); }, py::call_guard(), "Non-blocking data reception. Use data.get() to get the python object after the communication has finished") .def("set_receiver", &Mailbox::set_receiver, py::call_guard(), "Sets the actor as permanent receiver"); - /* Class PyGetAsync */ - py::class_(m, "PyGetAsync", "Wrapper for async get communications") - .def(py::init<>()) - .def( - "get", [](const PyGetAsync* self) { return py::reinterpret_steal(*(self->get())); }, - "Get python object after async communication in receiver side"); - /* class Activity */ - py::class_(m, "Activityy", "Activity. See the C++ documentation for details."); + py::class_(m, "Activity", "Activity. See the C++ documentation for details."); /* Class Comm */ py::class_(m, "Comm", "Communication. See the C++ documentation for details.") @@ -693,6 +679,11 @@ PYBIND11_MODULE(simgrid, m) "Block until the completion of that communication, or raises TimeoutException after the specified timeout.") .def("wait_until", &Comm::wait_until, py::call_guard(), py::arg("time_limit"), "Block until the completion of that communication, or raises TimeoutException after the specified time.") + .def( + "get_payload", + [](const Comm* self) { return py::reinterpret_steal((PyObject*)self->get_payload()); }, + py::call_guard(), + "Retrieve the message's payload of a get_async. You cannot call this until after the comm termination.") .def("detach", py::overload_cast<>(&Comm::detach), py::return_value_policy::reference_internal, py::call_guard(), "Start the comm, and ignore its result. It can be completely forgotten after that.") @@ -705,22 +696,7 @@ PYBIND11_MODULE(simgrid, m) py::arg("to"), py::arg("simulated_size_in_bytes"), "Do a blocking communication between two arbitrary hosts.\n\nThis initializes a communication that " "completely bypass the mailbox and actors mechanism. There is really no limit on the hosts involved. " - "In particular, the actor does not have to be on one of the involved hosts.") - .def_static("test_any", &Comm::test_any, py::call_guard(), py::arg("comms"), - "take a vector s4u::CommPtr and return the rank of the first finished one (or -1 if none is done)") - .def_static("wait_all", &Comm::wait_all, py::call_guard(), py::arg("comms"), - "Block until the completion of all communications in the list.") - .def_static("wait_all_for", &Comm::wait_all_for, py::call_guard(), py::arg("comms"), - py::arg("timeout"), - "Block until the completion of all communications in the list, or raises TimeoutException after " - "the specified timeout.") - .def_static("wait_any", &Comm::wait_any, py::call_guard(), py::arg("comms"), - "Block until the completion of any communication in the list and return the index of the " - "terminated one.") - .def_static("wait_any_for", &Comm::wait_any_for, py::call_guard(), py::arg("comms"), - py::arg("timeout"), - "Block until the completion of any communication in the list and return the index of the terminated " - "one, or -1 if a timeout occurred."); + "In particular, the actor does not have to be on one of the involved hosts."); /* Class Io */ py::class_(m, "Io", @@ -728,12 +704,7 @@ PYBIND11_MODULE(simgrid, m) .def("test", &simgrid::s4u::Io::test, py::call_guard(), "Test whether the I/O is terminated.") .def("wait", &simgrid::s4u::Io::wait, py::call_guard(), - "Block until the completion of that I/O operation") - .def_static( - "wait_any_for", &simgrid::s4u::Io::wait_any_for, py::call_guard(), - "Block until the completion of any I/O in the list (or timeout) and return the index of the terminated one.") - .def_static("wait_any", &simgrid::s4u::Io::wait_any, py::call_guard(), - "Block until the completion of any I/O in the list and return the index of the terminated one."); + "Block until the completion of that I/O operation"); /* Class Exec */ py::class_(m, "Exec", @@ -786,7 +757,8 @@ PYBIND11_MODULE(simgrid, m) py::class_(m, "Mutex", "A classical mutex, but blocking in the simulation world." "See the C++ documentation for details.") - .def(py::init<>(&Mutex::create), py::call_guard(), "Mutex constructor.") + .def(py::init<>(&Mutex::create), py::call_guard(), + "Mutex constructor (pass True as a parameter to get a recursive Mutex).", py::arg("recursive") = false) .def("lock", &Mutex::lock, py::call_guard(), "Block until the mutex is acquired.") .def("try_lock", &Mutex::try_lock, py::call_guard(), "Try to acquire the mutex. Return true if the mutex was acquired, false otherwise.") @@ -897,9 +869,14 @@ PYBIND11_MODULE(simgrid, m) }, "Add a callback called when each task ends.") .def_property_readonly("name", &Task::get_name, "The name of this task (read-only).") - .def_property_readonly("count", &Task::get_count, "The execution count of this task (read-only).") .def_property_readonly("successors", &Task::get_successors, "The successors of this task (read-only).") .def_property("amount", &Task::get_amount, &Task::set_amount, "The amount of work to do for this task.") + .def( + "get_count", [](const TaskPtr t) { return t->get_count("instance_0"); }, + "The execution count of this task instance_0.") + .def( + "get_count", [](const TaskPtr t, const std::string& instance) { return t->get_count(instance); }, + "The execution count of this task instance.") .def("enqueue_firings", py::overload_cast(&Task::enqueue_firings), py::call_guard(), py::arg("n"), "Enqueue firings for this task.") .def("add_successor", py::overload_cast(&Task::add_successor), py::call_guard(),