offer_service
offer_service函数,查找本地服务中是否有这个服务,有判断主版本号和次版本号,没有则创建服务。然后判断这个服务和实例是否是事件,如果是事件,把这个实例下的所有时间主版本号设置成_major
bool routing_manager_base::offer_service(client_t _client,
service_t _service, instance_t _instance,
major_version_t _major, minor_version_t _minor) {
(void)_client;
// Remote route (incoming only)
auto its_info = find_service(_service, _instance);
if (its_info) {
if (!its_info->is_local()) {
return false;
} else if (its_info->get_major() == _major
&& its_info->get_minor() == _minor) {
its_info->set_ttl(DEFAULT_TTL);
} else {
VSOMEIP_ERROR << "rm_base::offer_service service property mismatch ("
<< std::hex << std::setfill('0')
<< std::setw(4) << _client << "): ["
<< std::setw(4) << _service << "."
<< std::setw(4) << _instance << ":"
<< std::dec
<< static_cast<std::uint32_t>(its_info->get_major()) << ":"
<< its_info->get_minor() << "] passed: "
<< static_cast<std::uint32_t>(_major) << ":"
<< _minor;
return false;
}
} else {
its_info = create_service_info(_service, _instance, _major, _minor,
DEFAULT_TTL, true);
}
{
std::lock_guard<std::mutex> its_lock(events_mutex_);
// Set major version for all registered events of this service and instance
const auto found_service = events_.find(_service);
if (found_service != events_.end()) {
const auto found_instance = found_service->second.find(_instance);
if (found_instance != found_service->second.end()) {
for (const auto &j : found_instance->second) {
j.second->set_version(_major);
}
}
}
}
return true;
}
通过find_service函数查找services_容器中是否有服务,
std::shared_ptr<serviceinfo> routing_manager_base::find_service(
service_t _service, instance_t _instance) const {
std::shared_ptr<serviceinfo> its_info;
std::lock_guard<std::mutex> its_lock(services_mutex_);
auto found_service = services_.find(_service);
if (found_service != services_.end()) {
auto found_instance = found_service->second.find(_instance);
if (found_instance != found_service->second.end()) {
its_info = found_instance->second;
}
}
return its_info;
}
构造service_info结构体,服务放到 service_容器中,如果是远程服务同时存放到service_remote,并返回 std::shared_ptr<serviceinfo> its_info 指针
// ********************************* PROTECTED **************************************
std::shared_ptr<serviceinfo> routing_manager_base::create_service_info(
service_t _service, instance_t _instance, major_version_t _major,
minor_version_t _minor, ttl_t _ttl, bool _is_local_service) {
std::shared_ptr<serviceinfo> its_info =
std::make_shared<serviceinfo>(_service, _instance,
_major, _minor, _ttl, _is_local_service);
{
std::lock_guard<std::mutex> its_lock(services_mutex_);
services_[_service][_instance] = its_info;
}
if (!_is_local_service) {
std::lock_guard<std::mutex> its_lock(services_remote_mutex_);
services_remote_[_service][_instance] = its_info;
}
return its_info;
}
stop_offer_service
void routing_manager_base::stop_offer_service(client_t _client,
service_t _service, instance_t _instance,
major_version_t _major, minor_version_t _minor) {
(void)_client;
(void)_major;
(void)_minor;
std::map<event_t, std::shared_ptr<event> > events;
{
std::lock_guard<std::mutex> its_lock(events_mutex_);
auto its_events_service = events_.find(_service);
if (its_events_service != events_.end()) {
auto its_events_instance = its_events_service->second.find(_instance);
if (its_events_instance != its_events_service->second.end()) {
for (auto &e : its_events_instance->second)
events[e.first] = e.second;
}
}
}
for (auto &e : events) {
e.second->unset_payload();
e.second->clear_subscribers();
}
}
request_service
查找是否有这个服务如果有判断版本信息,然后将客户端号添加到services_info中的requesters_客户端信息
void routing_manager_base::request_service(client_t _client,
service_t _service, instance_t _instance,
major_version_t _major, minor_version_t _minor) {
auto its_info = find_service(_service, _instance);
if (its_info) {
if ((_major == its_info->get_major()