mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-07-08 21:05:15 -04:00
72 lines
2.6 KiB
C++
72 lines
2.6 KiB
C++
// (C) Copyright 2006
|
|
// Douglas Gregor <doug.gregor -at- gmail.com>
|
|
// Andreas Kloeckner <inform -at- tiker.net>
|
|
|
|
// 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 <boost/python.hpp>
|
|
#include <boost/mpi.hpp>
|
|
|
|
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<boost::python::object> 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
|