/home/users/khuck/src/hpx-lsu/hpx/runtime/trigger_lco.hpp

Line% of fetchesSource
1  
//  Copyright (c) 2007-2016 Hartmut Kaiser
2  
//
3  
//  Distributed under the Boost Software License, Version 1.0. (See accompanying
4  
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5  
6  
/// \file hpx/runtime/trigger_lco.hpp
7  
8  
#if !defined(HPX_RUNTIME_TRIGGER_LCO_JUN_22_2015_0618PM)
9  
#define HPX_RUNTIME_TRIGGER_LCO_JUN_22_2015_0618PM
10  
11  
#include <hpx/config.hpp>
12  
#include <hpx/lcos_fwd.hpp>
13  
#include <hpx/runtime/actions/continuation_fwd.hpp>
14  
#include <hpx/runtime/actions/action_priority.hpp>
15  
#include <hpx/runtime/applier/detail/apply_implementations_fwd.hpp>
16  
#include <hpx/runtime/naming/address.hpp>
17  
#include <hpx/runtime/naming/name.hpp>
18  
#include <hpx/util/decay.hpp>
19  
20  
#include <boost/exception_ptr.hpp>
21  
22  
#include <type_traits>
23  
#include <utility>
24  
25  
namespace hpx
26  
{
27  
    ///////////////////////////////////////////////////////////////////////////
28  
    /// \brief Trigger the LCO referenced by the given id
29  
    ///
30  
    /// \param id [in] This represents the id of the LCO which should be
31  
    ///                triggered.
32  
    /// \param addr [in] This represents the addr of the LCO which should be
33  
    ///                triggered.
34  
    /// \param move_credits [in] If this is set to \a true then it is ok to
35  
    ///                     send all credits in \a id along with the generated
36  
    ///                     message. The default value is \a true.
37  
    HPX_API_EXPORT void trigger_lco_event(naming::id_type const& id,
38  
        naming::address && addr, bool move_credits = true);
39  
40  
    ///////////////////////////////////////////////////////////////////////////
41  
    /// \brief Trigger the LCO referenced by the given id
42  
    ///
43  
    /// \param id [in] This represents the id of the LCO which should be
44  
    ///                triggered.
45  
    /// \param move_credits [in] If this is set to \a true then it is ok to
46  
    ///                     send all credits in \a id along with the generated
47  
    ///                     message. The default value is \a true.
48  
    inline void trigger_lco_event(naming::id_type const& id,
49  
        bool move_credits = true)
50  
    {
51  
        trigger_lco_event(id, naming::address(), move_credits);
52  
    }
53  
54  
    /// \brief Trigger the LCO referenced by the given id
55  
    ///
56  
    /// \param id   [in] This represents the id of the LCO which should be
57  
    ///                  triggered.
58  
    /// \param addr [in] This represents the addr of the LCO which should be
59  
    ///                triggered.
60  
    /// \param cont [in] This represents the LCO to trigger after completion.
61  
    /// \param move_credits [in] If this is set to \a true then it is ok to
62  
    ///                     send all credits in \a id along with the generated
63  
    ///                     message. The default value is \a true.
64  
    HPX_API_EXPORT void trigger_lco_event(naming::id_type const& id,
65  
        naming::address && addr, naming::id_type const& cont,
66  
        bool move_credits = true);
67  
68  
    /// \brief Trigger the LCO referenced by the given id
69  
    ///
70  
    /// \param id   [in] This represents the id of the LCO which should be
71  
    ///                  triggered.
72  
    /// \param cont [in] This represents the LCO to trigger after completion.
73  
    /// \param move_credits [in] If this is set to \a true then it is ok to
74  
    ///                     send all credits in \a id along with the generated
75  
    ///                     message. The default value is \a true.
76  
    inline void trigger_lco_event(naming::id_type const& id,
77  
        naming::id_type const& cont, bool move_credits = true)
78  
    {
79  
        trigger_lco_event(id, naming::address(), cont, move_credits);
80  
    }
81  
82  
    /// \brief Set the result value for the LCO referenced by the given id
83  
    ///
84  
    /// \param id [in] This represents the id of the LCO which should
85  
    ///                receive the given value.
86  
    /// \param addr [in] This represents the addr of the LCO which should be
87  
    ///                triggered.
88  
    /// \param t  [in] This is the value which should be sent to the LCO.
89  
    /// \param move_credits [in] If this is set to \a true then it is ok to
90  
    ///                     send all credits in \a id along with the generated
91  
    ///                     message. The default value is \a true.
92  
    template <typename Result>
93  
    void set_lco_value(naming::id_type const& id,
94  
        naming::address && addr, Result && t, bool move_credits = true);
95  
96  
    /// \brief Set the result value for the LCO referenced by the given id
97  
    ///
98  
    /// \param id [in] This represents the id of the LCO which should
99  
    ///                receive the given value.
100  
    /// \param t  [in] This is the value which should be sent to the LCO.
101  
    /// \param move_credits [in] If this is set to \a true then it is ok to
102  
    ///                     send all credits in \a id along with the generated
103  
    ///                     message. The default value is \a true.
104  
    template <typename Result>
105  
    typename std::enable_if<
106  
        !std::is_same<typename util::decay<Result>::type, naming::address>::value
107  
    >::type
108  
    set_lco_value(naming::id_type const& id, Result && t, bool move_credits = true)
109  
    {
110  
        set_lco_value(id, naming::address(), std::forward<Result>(t), move_credits);
111  
    }
112  
113  
    /// \brief Set the result value for the LCO referenced by the given id
114  
    ///
115  
    /// \param id   [in] This represents the id of the LCO which should
116  
    ///                  receive the given value.
117  
    /// \param addr [in] This represents the addr of the LCO which should be
118  
    ///                triggered.
119  
    /// \param t    [in] This is the value which should be sent to the LCO.
120  
    /// \param cont [in] This represents the LCO to trigger after completion.
121  
    /// \param move_credits [in] If this is set to \a true then it is ok to
122  
    ///                     send all credits in \a id along with the generated
123  
    ///                     message. The default value is \a true.
124  
    template <typename Result>
125  
    void set_lco_value(naming::id_type const& id,
126  
        naming::address && addr, Result && t, naming::id_type const& cont,
127  
        bool move_credits = true);
128  
129  
    /// \brief Set the result value for the LCO referenced by the given id
130  
    ///
131  
    /// \param id   [in] This represents the id of the LCO which should
132  
    ///                  receive the given value.
133  
    /// \param t    [in] This is the value which should be sent to the LCO.
134  
    /// \param cont [in] This represents the LCO to trigger after completion.
135  
    /// \param move_credits [in] If this is set to \a true then it is ok to
136  
    ///                     send all credits in \a id along with the generated
137  
    ///                     message. The default value is \a true.
138  
    template <typename Result>
139  
    typename std::enable_if<
140  
        !std::is_same<typename util::decay<Result>::type, naming::address>::value
141  
    >::type
142  
    set_lco_value(naming::id_type const& id, Result && t,
143  
        naming::id_type const& cont, bool move_credits = true)
144  
    {
145  
        set_lco_value(id, naming::address(), std::forward<Result>(t), cont,
146  
            move_credits);
147  
    }
148  
149  
    /// \brief Set the error state for the LCO referenced by the given id
150  
    ///
151  
    /// \param id [in] This represents the id of the LCO which should
152  
    ///                receive the error value.
153  
    /// \param addr [in] This represents the addr of the LCO which should be
154  
    ///                triggered.
155  
    /// \param e  [in] This is the error value which should be sent to
156  
    ///                the LCO.
157  
    /// \param move_credits [in] If this is set to \a true then it is ok to
158  
    ///                     send all credits in \a id along with the generated
159  
    ///                     message. The default value is \a true.
160  
    HPX_API_EXPORT void set_lco_error(naming::id_type const& id,
161  
        naming::address && addr, boost::exception_ptr const& e,
162  
        bool move_credits = true);
163  
164  
    /// \brief Set the error state for the LCO referenced by the given id
165  
    ///
166  
    /// \param id [in] This represents the id of the LCO which should
167  
    ///                receive the error value.
168  
    /// \param addr [in] This represents the addr of the LCO which should be
169  
    ///                triggered.
170  
    /// \param e  [in] This is the error value which should be sent to
171  
    ///                the LCO.
172  
    /// \param move_credits [in] If this is set to \a true then it is ok to
173  
    ///                     send all credits in \a id along with the generated
174  
    ///                     message. The default value is \a true.
175  
    HPX_API_EXPORT void set_lco_error(naming::id_type const& id,
176  
        naming::address && addr, boost::exception_ptr && e,
177  
        bool move_credits = true);
178  
179  
    /// \brief Set the error state for the LCO referenced by the given id
180  
    ///
181  
    /// \param id [in] This represents the id of the LCO which should
182  
    ///                receive the error value.
183  
    /// \param e  [in] This is the error value which should be sent to
184  
    ///                the LCO.
185  
    /// \param move_credits [in] If this is set to \a true then it is ok to
186  
    ///                     send all credits in \a id along with the generated
187  
    ///                     message. The default value is \a true.
188  
    inline void set_lco_error(naming::id_type const& id,
189  
        boost::exception_ptr const& e, bool move_credits = true)
190  
    {
191  
        set_lco_error(id, naming::address(), e, move_credits);
192  
    }
193  
194  
    /// \brief Set the error state for the LCO referenced by the given id
195  
    ///
196  
    /// \param id [in] This represents the id of the LCO which should
197  
    ///                receive the error value.
198  
    /// \param e  [in] This is the error value which should be sent to
199  
    ///                the LCO.
200  
    /// \param move_credits [in] If this is set to \a true then it is ok to
201  
    ///                     send all credits in \a id along with the generated
202  
    ///                     message. The default value is \a true.
203  
    inline void set_lco_error(naming::id_type const& id,
204  
        boost::exception_ptr && e, bool move_credits = true)
205  
    {
206  
        set_lco_error(id, naming::address(), std::move(e), move_credits);
207  
    }
208  
209  
    /// \brief Set the error state for the LCO referenced by the given id
210  
    ///
211  
    /// \param id   [in] This represents the id of the LCO which should
212  
    ///                  receive the error value.
213  
    /// \param addr [in] This represents the addr of the LCO which should be
214  
    ///                triggered.
215  
    /// \param e    [in] This is the error value which should be sent to
216  
    ///                  the LCO.
217  
    /// \param cont [in] This represents the LCO to trigger after completion.
218  
    /// \param move_credits [in] If this is set to \a true then it is ok to
219  
    ///                     send all credits in \a id along with the generated
220  
    ///                     message. The default value is \a true.
221  
    HPX_API_EXPORT void set_lco_error(naming::id_type const& id,
222  
        naming::address && addr, boost::exception_ptr const& e,
223  
        naming::id_type const& cont, bool move_credits = true);
224  
225  
    /// \brief Set the error state for the LCO referenced by the given id
226  
    ///
227  
    /// \param id   [in] This represents the id of the LCO which should
228  
    ///                  receive the error value.
229  
    /// \param addr [in] This represents the addr of the LCO which should be
230  
    ///                triggered.
231  
    /// \param e    [in] This is the error value which should be sent to
232  
    ///                  the LCO.
233  
    /// \param cont [in] This represents the LCO to trigger after completion.
234  
    /// \param move_credits [in] If this is set to \a true then it is ok to
235  
    ///                     send all credits in \a id along with the generated
236  
    ///                     message. The default value is \a true.
237  
    HPX_API_EXPORT void set_lco_error(naming::id_type const& id,
238  
        naming::address && addr, boost::exception_ptr && e,
239  
        naming::id_type const& cont, bool move_credits = true);
240  
241  
    /// \brief Set the error state for the LCO referenced by the given id
242  
    ///
243  
    /// \param id   [in] This represents the id of the LCO which should
244  
    ///                  receive the error value.
245  
    /// \param e    [in] This is the error value which should be sent to
246  
    ///                  the LCO.
247  
    /// \param cont [in] This represents the LCO to trigger after completion.
248  
    /// \param move_credits [in] If this is set to \a true then it is ok to
249  
    ///                     send all credits in \a id along with the generated
250  
    ///                     message. The default value is \a true.
251  
    inline void set_lco_error(naming::id_type const& id,
252  
        boost::exception_ptr const& e, naming::id_type const& cont,
253  
        bool move_credits = true)
254  
    {
255  
        set_lco_error(id, naming::address(), e, cont, move_credits);
256  
    }
257  
258  
    /// \brief Set the error state for the LCO referenced by the given id
259  
    ///
260  
    /// \param id   [in] This represents the id of the LCO which should
261  
    ///                  receive the error value.
262  
    /// \param e    [in] This is the error value which should be sent to
263  
    ///                  the LCO.
264  
    /// \param cont [in] This represents the LCO to trigger after completion.
265  
    /// \param move_credits [in] If this is set to \a true then it is ok to
266  
    ///                     send all credits in \a id along with the generated
267  
    ///                     message. The default value is \a true.
268  
    inline void set_lco_error(naming::id_type const& id,
269  
        boost::exception_ptr && e, naming::id_type const& cont,
270  
        bool move_credits = true)
271  
    {
272  
        set_lco_error(id, naming::address(), std::move(e), cont, move_credits);
273  
    }
274  
275  
    //////////////////////////////////////////////////////////////////////////
276  
    // forward declare the required overload of apply.
277  
    template <typename Action, typename ...Ts>
278  
    bool apply(naming::id_type const& gid, Ts&&... vs);
279  
280  
    template <
281  
        typename Component, typename Signature, typename Derived,
282  
        typename Cont, typename ...Ts>
283  
    bool apply_continue(
284  
        hpx::actions::basic_action<Component, Signature, Derived>,
285  
        Cont&& cont, naming::id_type const& gid, Ts&&... vs);
286  
287  
    template <typename Component, typename Signature, typename Derived,
288  
        typename ...Ts>
289  
    inline bool
290  
    apply_c(hpx::actions::basic_action<Component, Signature, Derived>,
291  
        naming::id_type const& contgid, naming::id_type const& gid,
292  
        Ts&&... vs);
293  
294  
    //////////////////////////////////////////////////////////////////////////
295  
    // handling special case of triggering an LCO
296  
    ///////////////////////////////////////////////////////////////////////////
297  
    namespace detail
298  
    {
299  
        template <typename T>
300  
        struct make_rvalue_impl
301  
        {
302  
            typedef T && type;
303  
304  
            template <typename U>
305  
            HPX_FORCEINLINE static T && call(U& u)
306  
            {
307  
                return std::move(u);
308  
            }
309  
        };
310  
311  
        template <typename T>
312  
        struct make_rvalue_impl<T const>
313  
        {
314  
            typedef T type;
315  
316  
            template <typename U>
317  
            HPX_FORCEINLINE static T call(U const& u)
318  
            {
319  
                return u;
320  
            }
321  
        };
322  
323  
        template <typename T>
324  
        struct make_rvalue_impl<T&>
325  
        {
326  
            typedef T type;
327  
328  
            HPX_FORCEINLINE static T call(T& u)
329  
            {
330  
                return u;
331  
            }
332  
        };
333  
334  
        template <typename T>
335  
        struct make_rvalue_impl<T const&>
336  
        {
337  
            typedef T type;
338  
339  
            HPX_FORCEINLINE static T call(T const& u)
340  
            {
341  
                return u;
342  
            }
343  
        };
344  
345  
        template <typename T>
346  
        HPX_FORCEINLINE typename detail::make_rvalue_impl<T>::type
347  
        make_rvalue(typename std::remove_reference<T>::type& v)
348  
        {
349  
            return detail::make_rvalue_impl<T>::call(v);
350  
        }
351  
352  
        template <typename T>
353  
        HPX_FORCEINLINE typename detail::make_rvalue_impl<T>::type
354  
        make_rvalue(typename std::remove_reference<T>::type&& v)
355  
        {
356  
            return detail::make_rvalue_impl<T>::call(v);
357  
        }
358  
    }
359  
360  
    template <typename Result>
361  
    void set_lco_value(naming::id_type const& id, naming::address && addr,
362  
        Result && t, bool move_credits)
363  
    {
364  
        typedef typename util::decay<Result>::type remote_result_type;
365  
        typedef typename traits::promise_local_result<
366  
                remote_result_type
367  
            >::type local_result_type;
368  
        typedef typename lcos::base_lco_with_value<
369  
                local_result_type, remote_result_type
370  
            >::set_value_action set_value_action;
371  
372  
        if (move_credits &&
373  
            id.get_management_type() != naming::id_type::unmanaged)
374  
        {
375  
            naming::id_type target(id.get_gid(),
376  
                naming::id_type::managed_move_credit);
377  
            id.make_unmanaged();
378  
379  
            detail::apply_impl<set_value_action>(target, std::move(addr),
380  
                actions::action_priority<set_value_action>(),
381  
                detail::make_rvalue<Result>(t));
382  
        }
383  
        else
384  
        {
385  
            detail::apply_impl<set_value_action>(id, std::move(addr),
386  
                actions::action_priority<set_value_action>(),
387  
                detail::make_rvalue<Result>(t));
388  
        }
389  
    }
390  
391  
    template <typename Result>
392  
    void set_lco_value(naming::id_type const& id, naming::address && addr,
393  
        Result && t, naming::id_type const& cont, bool move_credits)
394  
    {
395  
        typedef typename util::decay<Result>::type remote_result_type;
396  
        typedef typename traits::promise_local_result<
397  
                remote_result_type
398  
            >::type local_result_type;
399  
        typedef typename lcos::base_lco_with_value<
400  
                local_result_type, remote_result_type
401  
            >::set_value_action set_value_action;
402  
403  
        if (move_credits &&
404  
            id.get_management_type() != naming::id_type::unmanaged)
405  
        {
406  
            naming::id_type target(id.get_gid(),
407  
                naming::id_type::managed_move_credit);
408  
            id.make_unmanaged();
409  
410  
            detail::apply_impl<set_value_action>(
411  
                actions::typed_continuation<
412  
                    local_result_type, remote_result_type>(cont),
413  
                target, std::move(addr),
414  
                detail::make_rvalue<Result>(t));
415  
        }
416  
        else
417  
        {
418  
            detail::apply_impl<set_value_action>(
419  
                actions::typed_continuation<
420  
                    local_result_type, remote_result_type>(cont),
421  
                id, std::move(addr),
422  
                detail::make_rvalue<Result>(t));
423  
        }
424  
    }
425  
}
426  
427  
#endif
428  

Copyright (c) 2006-2012 Rogue Wave Software, Inc. All Rights Reserved.
Patents pending.