| 80 | } |
| 81 | |
| 82 | bool swapData(Monitor &monitor, |
| 83 | SharedRegionRegister &shared_register, |
| 84 | const std::map<std::string, RegionHandle> &handles, |
| 85 | int max_wait) |
| 86 | { |
| 87 | std::vector<RegionHandle> old_handles; |
| 88 | |
| 89 | { // Lock for write access shared region mutex |
| 90 | boost::interprocess::scoped_lock<Monitor::mutex_type> lock(monitor.get_mutex(), |
| 91 | boost::interprocess::defer_lock); |
| 92 | |
| 93 | if (max_wait >= 0) |
| 94 | { |
| 95 | auto deadline = std::chrono::steady_clock::now() + std::chrono::seconds(max_wait); |
| 96 | while (!lock.try_lock()) |
| 97 | { |
| 98 | if (std::chrono::steady_clock::now() >= deadline) |
| 99 | { |
| 100 | util::Log(logERROR) << "Could not acquire current region lock after " |
| 101 | << max_wait << " seconds. Data update failed."; |
| 102 | |
| 103 | for (auto &pair : handles) |
| 104 | { |
| 105 | Remove(pair.second.proj_id); |
| 106 | } |
| 107 | return false; |
| 108 | } |
| 109 | std::this_thread::sleep_for(std::chrono::milliseconds(10)); |
| 110 | } |
| 111 | } |
| 112 | else |
| 113 | { |
| 114 | lock.lock(); |
| 115 | } |
| 116 | |
| 117 | for (auto &pair : handles) |
| 118 | { |
| 119 | auto region_id = shared_register.Find(pair.first); |
| 120 | if (region_id == SharedRegionRegister::INVALID_REGION_ID) |
| 121 | { |
| 122 | region_id = shared_register.Register(pair.first, pair.second.proj_id); |
| 123 | } |
| 124 | else |
| 125 | { |
| 126 | auto &shared_region = shared_register.GetRegion(region_id); |
| 127 | |
| 128 | old_handles.push_back(RegionHandle{ |
| 129 | makeSharedMemory(shared_region.proj_id), nullptr, shared_region.proj_id}); |
| 130 | |
| 131 | shared_region.proj_id = pair.second.proj_id; |
| 132 | shared_region.timestamp++; |
| 133 | } |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | util::Log() << "All data loaded. Notify all clients about new data in:"; |
| 138 | for (const auto &pair : handles) |
| 139 | { |
no test coverage detected