/// \brief Return the unique identifier of the component type this /// factory is responsible for /// /// \param locality [in] The id of the locality this factory /// is responsible for. /// \param agas_client [in] The AGAS client to use for component id /// registration (if needed). /// /// \return Returns the unique identifier of the component type this /// factory instance is responsible for. This function throws /// on any error. component_type get_component_type(naming::gid_type const& locality, naming::resolver_client& agas_client) { typedef typename Component::type_holder type_holder; if (component_invalid == components::get_component_type<type_holder>()) { // First call to get_component_type, ask AGAS for a unique id. if (isenabled_) { component_type const ctype = agas_client.register_factory(locality, get_component_name()); if (component_invalid == ctype) { HPX_THROW_EXCEPTION(duplicate_component_id, "component_factory::get_component_type", "the component name " + get_component_name() + " is already in use"); } components::set_component_type<type_holder>(ctype); } else { component_type const ctype = agas_client.get_component_id(get_component_name()); components::set_component_type<type_holder>(ctype); } } return components::get_component_type<type_holder>(); }
/// \brief Return the unique identifier of the component type this /// factory is responsible for /// /// \param locality [in] The id of the locality this factory /// is responsible for. /// \param agas_client [in] The AGAS client to use for component id /// registration (if needed). /// /// \return Returns the unique identifier of the component type this /// factory instance is responsible for. This function throws /// on any error. component_type get_component_type(naming::gid_type const& locality, naming::resolver_client& agas_client) { typedef typename Component::type_holder type_holder; if (component_invalid == components::get_component_type<type_holder>()) { typedef typename Component::base_type_holder base_type_holder; component_type base_type = components::get_component_type<base_type_holder>(); if (component_invalid == base_type) { // First call to get_component_type, ask AGAS for a unique id. // NOTE: This assumes that the derived component is loaded. base_type = agas_client.get_component_id( unique_component_name<derived_component_factory, base_name>::call()); } component_type this_type; if (isenabled_) { this_type = agas_client.register_factory( locality, unique_component_name<derived_component_factory> ::call()); if (component_invalid == this_type) { HPX_THROW_EXCEPTION(duplicate_component_id, "component_factory::get_component_type", "the component name " + get_component_name() + " is already in use"); } } else { this_type = agas_client.get_component_id( unique_component_name<derived_component_factory>::call()); } components::set_component_type<type_holder>( derived_component_type(this_type, base_type)); } return components::get_component_type<type_holder>(); }