// (C) Copyright 2006 // Douglas Gregor // Andreas Kloeckner // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Authors: Douglas Gregor, Andreas Kloeckner #ifndef BOOST_MPI_PYTHON_REQUEST_WITH_VALUE_HPP #define BOOST_MPI_PYTHON_REQUEST_WITH_VALUE_HPP #include #include namespace boost { namespace mpi { namespace python { /** This wrapper adds a @c boost::python::object value to the @c * boost::mpi::request structure, for the benefit of @c irecv() requests. * * In order to be able to return the value of his requests to the user, we * need a handle that we can update to contain the transmitted value once the * request completes. Since we're passing the address on to irecv to fill at * any time in the future, this address may not change over time. * * There are two possible cases: * - plain irecv() * - skeleton-content irecv() * * In the first case, we need to own the storage from this object, the * m_internal_value is used for this. In the second case, the updated * python::object is part of a boost::mpi::python::content object: the * m_external_value field handles this case. Furthermore, in the latter case, * we now have a lifetime dependency on that content object; this can be * handled with the BPL's with_custodian_and_ward facility. * * Since requests and request_with_value are supposed to be copyconstructible, * we can't put the handle immediately inside this instance. Moreover, since * we need to be able to put request_with_value inside request_vectors, any * values we own must be held in a shared_ptr instance. */ class request_with_value : public request { private: boost::shared_ptr m_internal_value; boost::python::object *m_external_value; public: request_with_value() : m_external_value(0) { } request_with_value(const request &req) : request(req), m_external_value(0) { } const boost::python::object get_value() const; const boost::python::object get_value_or_none() const; const boost::python::object wrap_wait(); const boost::python::object wrap_test(); friend request_with_value communicator_irecv(const communicator &, int, int); friend request_with_value communicator_irecv_content( const communicator&, int, int, content&); }; } } } #endif