diff options
Diffstat (limited to 'implementation/utility/src/utility.cpp')
-rw-r--r-- | implementation/utility/src/utility.cpp | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/implementation/utility/src/utility.cpp b/implementation/utility/src/utility.cpp index 8fc48db..f4f4449 100644 --- a/implementation/utility/src/utility.cpp +++ b/implementation/utility/src/utility.cpp @@ -7,6 +7,7 @@ #include <iostream> #else #include <dlfcn.h> + #include <signal.h> #include <sys/mman.h> #include <thread> #include <sstream> @@ -306,8 +307,6 @@ bool utility::auto_configuration_init(const std::shared_ptr<configuration> &_con the_configuration_data__->routing_manager_host_ = 0x0000; std::string its_name = _config->get_routing_host(); - if (its_name == "") - the_configuration_data__->routing_manager_host_ = the_configuration_data__->client_base_; its_configuration_refs__++; @@ -340,7 +339,6 @@ bool utility::auto_configuration_init(const std::shared_ptr<configuration> &_con VSOMEIP_ERROR << "utility::auto_configuration_init: " "ftruncate failed: " << std::strerror(errno); } else { - void *its_segment = mmap(0, sizeof(configuration_data_t), PROT_READ | PROT_WRITE, MAP_SHARED, its_descriptor, 0); @@ -460,6 +458,43 @@ bool utility::is_used_client_id(client_t _client) { return false; } +std::set<client_t> utility::get_used_client_ids() { + std::set<client_t> clients; + + std::unique_lock<CriticalSection> its_lock(its_local_configuration_mutex__); + + if (the_configuration_data__ != nullptr) { +#ifdef _WIN32 + DWORD waitResult = WaitForSingleObject(configuration_data_mutex, INFINITE); + assert(waitResult == WAIT_OBJECT_0); + (void)waitResult; +#else + if (EOWNERDEAD == pthread_mutex_lock(&the_configuration_data__->mutex_)) { + VSOMEIP_WARNING << "utility::request_client_id EOWNERDEAD"; + check_client_id_consistency(); + if (0 != pthread_mutex_consistent(&the_configuration_data__->mutex_)) { + VSOMEIP_ERROR << "pthread_mutex_consistent() failed "; + } + } +#endif + for (int i = 0; + i < the_configuration_data__->max_used_client_ids_index_; + i++) { + clients.insert(the_configuration_data__->used_client_ids_[i]); + } + +#ifdef _WIN32 + BOOL releaseResult = ReleaseMutex(configuration_data_mutex); + assert(releaseResult); + (void)releaseResult; +#else + pthread_mutex_unlock(&the_configuration_data__->mutex_); +#endif + } + + return clients; +} + client_t utility::request_client_id(const std::shared_ptr<configuration> &_config, const std::string &_name, client_t _client) { std::unique_lock<CriticalSection> its_lock(its_local_configuration_mutex__); @@ -476,7 +511,18 @@ client_t utility::request_client_id(const std::shared_ptr<configuration> &_confi VSOMEIP_ERROR << "pthread_mutex_consistent() failed "; } } + + pid_t pid = getpid(); + if (the_configuration_data__->pid_ != 0) { + if (pid != the_configuration_data__->pid_) { + if (kill(the_configuration_data__->pid_, 0) == -1) { + VSOMEIP_WARNING << "Routing Manager seems to be inactive. Taking over..."; + the_configuration_data__->routing_manager_host_ = 0x0000; + } + } + } #endif + const std::string its_name = _config->get_routing_host(); bool set_client_as_manager_host(false); if (its_name != "" && its_name == _name) { @@ -572,6 +618,9 @@ client_t utility::request_client_id(const std::shared_ptr<configuration> &_confi if (set_client_as_manager_host) { the_configuration_data__->routing_manager_host_ = _client; +#ifndef _WIN32 + the_configuration_data__->pid_ = pid; +#endif } the_configuration_data__->used_client_ids_[ |