X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/db5adf7439201fb67d1d697b86806d58ace9fe85..HEAD:/doc/doxygen/uhood.doc diff --git a/doc/doxygen/uhood.doc b/doc/doxygen/uhood.doc index 6c5e0ff01e..1d2d163398 100644 --- a/doc/doxygen/uhood.doc +++ b/doc/doxygen/uhood.doc @@ -86,116 +86,6 @@ using ActorPtr = Actor::Ptr; It uses the `simgrid::simix::Process` as an opaque pimple: -~~~ -class Process { -private: - std::atomic_int_fast32_t refcount_ { 1 }; - // The lifetime of the s4u::Actor is bound to the lifetime of the Process: - simgrid::s4u::Actor actor_; -public: - Process() : actor_(this) {} - - // Reference count: - friend void intrusive_ptr_add_ref(Process* process) - { - // Atomic operation! Do not split in two instructions! - auto previous = (process->refcount_)++; - xbt_assert(previous != 0); - (void) previous; - } - friend void intrusive_ptr_release(Process* process) - { - // Atomic operation! Do not split in two instructions! - auto count = --(process->refcount_); - if (count == 0) - delete process; - } - - // [...] -}; - -smx_process_t SIMIX_process_ref(smx_process_t process) -{ - if (process != nullptr) - intrusive_ptr_add_ref(process); - return process; -} - -/** Decrease the refcount for this process */ -void SIMIX_process_unref(smx_process_t process) -{ - if (process != nullptr) - intrusive_ptr_release(process); -} -~~~ - -@section simgrid_uhood_async Asynchronous operations - -@subsection simgrid_uhood_futures Futures - -The `simgrid::kernel::Future` class has been added to SimGrid as an abstraction -to represent asynchronous operations in the SimGrid maestro. Its API is based -on `std::experimental::future` from the [C++ Extensions for Concurrency Technical -Specification](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0159r0.html): - - - `simgrid::kernel::Future` represents the result an asynchronous operations - in the simulation inside the SimGrid maestro/kernel; - - - `simgrid::kernel::Promise` can be used to set the value of an assocaiated - `simgrid::kernel::Future`. - -The expected way to work with `simgrid::kernel::Future` is to add a -completion handler/continuation: - -~~~ -// This code is executed in the maestro context, we cannot block for the result -// to be ready: -simgrid::kernel::Future> result = simgrid::kernel::readFile(file); - -// Add a completion handler: -result.then([file](simgrid::kernel::Future> result) { - // At this point, the operation is complete and we can safely call .get(): - xbt_assert(result.is_ready()); - try { - std::vector data = result.get(); - XBT_DEBUG("Finished reading file %s: length %zu", file.c_str(), data.size()); - } - // If the operation failed, .get() throws an exception: - catch (std::runtime_error& e) { - XBT_ERROR("Could not read file %s", file.c_str()); - } -}); -~~~ - -The SimGrid kernel cannot block so calling `.get()` or `.wait()` on a -`simgrid::kernel::Future` which is not ready will deadlock. In practice, the -simulator detects this and aborts after reporting an error. - -In order to generate your own future, you might need to use a -`simgrid::kernel::Promise`. The promise is a one-way channel which can be -used to set the result of an associated `simgrid::kernel::Future` -(with either `.set_value()` or `.set_exception()`): - -~~~ -simgrid::kernel::Future kernel_wait_until(double date) -{ - auto promise = std::make_shared>(); - auto future = promise->get_future(); - simgrid::simix::Timer::set(date, [promise] { promise->set_value(); }); - return future; -} -~~~ - -Like the experimental futures, we support chaining `.then()` methods with -automatic future unwrapping. -You might want to look at some [tutorial on C++ futures](https://www.youtube.com/watch?v=mPxIegd9J3w&list=PLHTh1InhhwT75gykhs7pqcR_uSiG601oh&index=43) -for more details and examples. Some operations of the proposed experimental -futures are currently not implemented in our futures however such as -`.wait_for()`, `.wait_until()`, -[`shared_future`](http://en.cppreference.com/w/cpp/thread/shared_future), -[`when_any()`](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0159r0.html#futures.when_any). - -@subsection simgrid_uhood_timer Timers @section simgrid_uhood_mc Model Checker