/home/users/khuck/src/hpx-lsu/src/runtime/agas/primary_namespace.cpp

Line% of fetchesSource
1  
////////////////////////////////////////////////////////////////////////////////
2  
//  Copyright (c) 2016 Thomas Heller
3  
//
4  
//  Distributed under the Boost Software License, Version 1.0. (See accompanying
5  
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
////////////////////////////////////////////////////////////////////////////////
7  
8  
#include <hpx/config.hpp>
9  
#include <hpx/apply.hpp>
10  
#include <hpx/throw_exception.hpp>
11  
#include <hpx/lcos/base_lco_with_value.hpp>
12  
#include <hpx/runtime/actions/continuation.hpp>
13  
#include <hpx/runtime/agas/primary_namespace.hpp>
14  
#include <hpx/runtime/agas/server/primary_namespace.hpp>
15  
#include <hpx/runtime/applier/apply_callback.hpp>
16  
#include <hpx/runtime/components/component_factory.hpp>
17  
#include <hpx/runtime/serialization/vector.hpp>
18  
19  
#include <boost/format.hpp>
20  
21  
#include <cstdint>
22  
#include <string>
23  
#include <utility>
24  
25  
using hpx::components::component_agas_primary_namespace;
26  
27  
using hpx::agas::server::primary_namespace;
28  
29  
HPX_REGISTER_COMPONENT(
30  
    hpx::components::fixed_component<primary_namespace>,
31  
    primary_namespace, hpx::components::factory_enabled)
32  
HPX_DEFINE_GET_COMPONENT_TYPE_STATIC(
33  
    primary_namespace, component_agas_primary_namespace)
34  
35  
HPX_REGISTER_ACTION_ID(
36  
    primary_namespace::allocate_action,
37  
    primary_namespace_allocate_action,
38  
    hpx::actions::primary_namespace_allocate_action_id)
39  
40  
HPX_REGISTER_ACTION_ID(
41  
    primary_namespace::bind_gid_action,
42  
    primary_namespace_bind_gid_action,
43  
    hpx::actions::primary_namespace_bind_gid_action_id)
44  
45  
HPX_REGISTER_ACTION_ID(
46  
    primary_namespace::begin_migration_action,
47  
    primary_namespace_begin_migration_action,
48  
    hpx::actions::primary_namespace_begin_migration_action_id)
49  
50  
HPX_REGISTER_ACTION_ID(
51  
    primary_namespace::end_migration_action,
52  
    primary_namespace_end_migration_action,
53  
    hpx::actions::primary_namespace_end_migration_action_id)
54  
55  
HPX_REGISTER_ACTION_ID(
56  
    primary_namespace::decrement_credit_action,
57  
    primary_namespace_decrement_credit_action,
58  
    hpx::actions::primary_namespace_decrement_credit_action_id)
59  
60  
HPX_REGISTER_ACTION_ID(
61  
    primary_namespace::increment_credit_action,
62  
    primary_namespace_increment_credit_action,
63  
    hpx::actions::primary_namespace_increment_credit_action_id)
64  
65  
HPX_REGISTER_ACTION_ID(
66  
    primary_namespace::resolve_gid_action,
67  
    primary_namespace_resolve_gid_action,
68  
    hpx::actions::primary_namespace_resolve_gid_action_id)
69  
70  
HPX_REGISTER_ACTION_ID(
71  
    primary_namespace::colocate_action,
72  
    primary_namespace_colocate_action,
73  
    hpx::actions::primary_namespace_colocate_action_id)
74  
75  
HPX_REGISTER_ACTION_ID(
76  
    primary_namespace::unbind_gid_action,
77  
    primary_namespace_unbind_gid_action,
78  
    hpx::actions::primary_namespace_unbind_gid_action_id)
79  
80  
HPX_REGISTER_ACTION_ID(
81  
    primary_namespace::route_action,
82  
    primary_namespace_route_action,
83  
    hpx::actions::primary_namespace_route_action_id)
84  
85  
HPX_REGISTER_ACTION_ID(
86  
    primary_namespace::statistics_counter_action,
87  
    primary_namespace_statistics_counter_action,
88  
    hpx::actions::primary_namespace_statistics_counter_action_id)
89  
90  
namespace hpx { namespace agas {
91  
92  
    naming::gid_type primary_namespace::get_service_instance(
93  
        std::uint32_t service_locality_id)
94  
    {
95  
        naming::gid_type service(HPX_AGAS_PRIMARY_NS_MSB, HPX_AGAS_PRIMARY_NS_LSB);
96  
        return naming::replace_locality_id(service, service_locality_id);
97  
    }
98  
99  
    naming::gid_type primary_namespace::get_service_instance(naming::gid_type const& dest,
100  
        error_code& ec)
101  
    {
102  
        std::uint32_t service_locality_id = naming::get_locality_id_from_gid(dest);
103  
        if (service_locality_id == naming::invalid_locality_id)
104  
        {
105  
            HPX_THROWS_IF(ec, bad_parameter,
106  
                "primary_namespace::get_service_instance",
107  
                boost::str(boost::format(
108  
                        "can't retrieve a valid locality id from global address (%1%): "
109  
                    ) % dest));
110  
            return naming::gid_type();
111  
        }
112  
        return get_service_instance(service_locality_id);
113  
    }
114  
115  
    bool primary_namespace::is_service_instance(naming::gid_type const& gid)
116  
    {
117  
        return gid.get_lsb() == HPX_AGAS_PRIMARY_NS_LSB &&
118  
            (gid.get_msb() & ~naming::gid_type::locality_id_mask)
119  
            == HPX_AGAS_PRIMARY_NS_MSB;
120  
    }
121  
122  
    primary_namespace::primary_namespace()
123  
      : server_(new server::primary_namespace())
124  
    {}
125  
126  
    primary_namespace::~primary_namespace()
127  
    {}
128  
129  
    naming::address::address_type primary_namespace::ptr() const
130  
    {
131  
        return reinterpret_cast<naming::address::address_type>(server_.get());
132  
    }
133  
134  
    naming::address primary_namespace::addr() const
135  
    {
136  
        return naming::address(
137  
            hpx::get_locality(),
138  
            server::primary_namespace::get_component_type(),
139  
            this->ptr()
140  
        );
141  
    }
142  
143  
    naming::id_type primary_namespace::gid() const
144  
    {
145  
        return naming::id_type(
146  
            get_service_instance(hpx::get_locality()),
147  
            naming::id_type::unmanaged);
148  
    }
149  
150  
    future<std::pair<naming::id_type, naming::address>>
151  
    primary_namespace::begin_migration(naming::gid_type id)
152  
    {
153  
        naming::id_type dest = naming::id_type(get_service_instance(id),
154  
            naming::id_type::unmanaged);
155  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
156  
        {
157  
            return hpx::make_ready_future(server_->begin_migration(id));
158  
        }
159  
        server::primary_namespace::begin_migration_action action;
160  
        return hpx::async(action, std::move(dest), id);
161  
    }
162  
    future<bool> primary_namespace::end_migration(naming::gid_type id)
163  
    {
164  
        naming::id_type dest = naming::id_type(get_service_instance(id),
165  
            naming::id_type::unmanaged);
166  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
167  
        {
168  
            return hpx::make_ready_future(server_->end_migration(id));
169  
        }
170  
        server::primary_namespace::end_migration_action action;
171  
        return hpx::async(action, std::move(dest), id);
172  
    }
173  
174  
    bool primary_namespace::bind_gid(
175  
        gva g, naming::gid_type id, naming::gid_type locality)
176  
    {
177  
        return server_->bind_gid(g, id, locality);
178  
    }
179  
180  
    future<bool> primary_namespace::bind_gid_async(
181  
        gva g, naming::gid_type id, naming::gid_type locality)
182  
    {
183  
        naming::id_type dest = naming::id_type(get_service_instance(id),
184  
            naming::id_type::unmanaged);
185  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
186  
        {
187  
            return hpx::make_ready_future(server_->bind_gid(g, id, locality));
188  
        }
189  
        server::primary_namespace::bind_gid_action action;
190  
        return hpx::async(action, std::move(dest), g, id, locality);
191  
    }
192  
193  
    void primary_namespace::route(parcelset::parcel && p,
194  
        util::function_nonser<void(boost::system::error_code const&,
195  
        parcelset::parcel const&)> && f)
196  
    {
197  
        // compose request
198  
        naming::gid_type const& id = p.destination();
199  
        naming::id_type dest = naming::id_type(get_service_instance(id),
200  
            naming::id_type::unmanaged);
201  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
202  
        {
203  
            hpx::apply(
204  
                &server::primary_namespace::route,
205  
                server_.get(),
206  
                std::move(p)
207  
            );
208  
            f(boost::system::error_code(), parcelset::parcel());
209  
            return;
210  
        }
211  
212  
        server::primary_namespace::route_action action;
213  
        hpx::apply_cb(action, std::move(dest), std::move(f), std::move(p));
214  
    }
215  
216  
    primary_namespace::resolved_type
217  
    primary_namespace::resolve_gid(naming::gid_type id)
218  
    {
219  
        return server_->resolve_gid(id);
220  
    }
221  
222  
    future<primary_namespace::resolved_type>
223  
    primary_namespace::resolve_full(naming::gid_type id)
224  
    {
225  
        naming::id_type dest = naming::id_type(get_service_instance(id),
226  
            naming::id_type::unmanaged);
227  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
228  
        {
229  
            return hpx::make_ready_future(server_->resolve_gid(id));
230  
        }
231  
        server::primary_namespace::resolve_gid_action action;
232  
        return hpx::async(action, std::move(dest), id);
233  
    }
234  
235  
    hpx::future<id_type> primary_namespace::colocate(naming::gid_type id)
236  
    {
237  
        naming::id_type dest = naming::id_type(get_service_instance(id),
238  
            naming::id_type::unmanaged);
239  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
240  
        {
241  
            return hpx::make_ready_future(server_->colocate(id));
242  
        }
243  
        server::primary_namespace::colocate_action action;
244  
        return hpx::async(action, std::move(dest), id);
245  
    }
246  
247  
    future<naming::address>
248  
    primary_namespace::unbind_gid_async(std::uint64_t count, naming::gid_type id)
249  
    {
250  
        naming::id_type dest = naming::id_type(get_service_instance(id),
251  
            naming::id_type::unmanaged);
252  
        naming::gid_type stripped_id = naming::detail::get_stripped_gid(id);
253  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
254  
        {
255  
            return hpx::make_ready_future(server_->unbind_gid(count, stripped_id));
256  
        }
257  
        server::primary_namespace::unbind_gid_action action;
258  
        return hpx::async(action, std::move(dest), count, stripped_id);
259  
    }
260  
261  
    naming::address
262  
    primary_namespace::unbind_gid(std::uint64_t count, naming::gid_type id)
263  
    {
264  
        naming::id_type dest = naming::id_type(get_service_instance(id),
265  
            naming::id_type::unmanaged);
266  
        naming::gid_type stripped_id = naming::detail::get_stripped_gid(id);
267  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
268  
        {
269  
            return server_->unbind_gid(count, stripped_id);
270  
        }
271  
        server::primary_namespace::unbind_gid_action action;
272  
        return action(std::move(dest), count, stripped_id);
273  
    }
274  
275  
    future<std::int64_t> primary_namespace::increment_credit(
276  
        std::int64_t credits
277  
      , naming::gid_type lower
278  
      , naming::gid_type upper
279  
        )
280  
    {
281  
        naming::id_type dest = naming::id_type(get_service_instance(lower),
282  
            naming::id_type::unmanaged);
283  
        if (naming::get_locality_from_gid(dest.get_gid()) == hpx::get_locality())
284  
        {
285  
            return hpx::make_ready_future(
286  
                server_->increment_credit(credits, lower, upper));
287  
        }
288  
        server::primary_namespace::increment_credit_action action;
289  
        return hpx::async(action, std::move(dest), credits, lower, upper);
290  
    }
291  
292  
    std::pair<naming::gid_type, naming::gid_type>
293  
    primary_namespace::allocate(std::uint64_t count)
294  
    {
295  
        return server_->allocate(count);
296  
    }
297  
298  
    void primary_namespace::set_local_locality(naming::gid_type const& g)
299  
    {
300  
        server_->set_local_locality(g);
301  
    }
302  
303  
    void primary_namespace::register_counter_types()
304  
    {
305  
        server::primary_namespace::register_counter_types();
306  
        server::primary_namespace::register_global_counter_types();
307  
    }
308  
309  
    void primary_namespace::register_server_instance(std::uint32_t locality_id)
310  
    {
311  
        std::string str("locality#" +
312  
            std::to_string(locality_id) + "/");
313  
        server_->register_server_instance(str.c_str(), locality_id);
314  
    }
315  
316  
    void primary_namespace::unregister_server_instance(error_code& ec)
317  
    {
318  
        server_->unregister_server_instance(ec);
319  
    }
320  
}}
321  

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