11 #include <unordered_map>
22 const std::unordered_map<std::string, cras::priority_mux::LockConfig>& lockConfigs,
25 cras::
HasLogger(log), topicConfigs(topicConfigs), lockConfigs(lockConfigs), setTimer(setTimerFn),
26 noneTopic(noneTopic), nonePriority(nonePriority)
32 CRAS_DEBUG(
"Starting with no selected topic for output topic %s.", outAndSelectedTopic.first.c_str());
34 for (
const auto& nameAndLockConfig : this->lockConfigs)
36 const auto& name = nameAndLockConfig.first;
37 const auto& config = nameAndLockConfig.second;
39 this->
setTimer(name, config.timeout);
48 CRAS_ERROR(
"Priority mux called with topic %s which is not configured.", inTopic.c_str());
52 const auto& topicConfig = it->second;
53 const auto& priority = topicConfig.priority;
54 const auto key = std::make_pair(priority, inTopic);
60 const auto remainingTimeout = topicConfig.timeout + (stamp - now);
64 this->
setTimer(inTopic, remainingTimeout);
70 const auto& disabledStamp = disableIt->second;
71 if (now < disabledStamp + topicConfig.timeout)
84 CRAS_ERROR(
"Priority mux called with topic %s which is not configured.", inTopic.c_str());
88 const auto& topicConfig = it->second;
89 const auto& priority = topicConfig.priority;
90 const auto key = std::make_pair(priority, inTopic);
102 const auto remainingTimeout = topicConfig.timeout + (stamp - now);
106 this->
setTimer(
"__disable_" + inTopic, remainingTimeout);
115 CRAS_ERROR(
"Priority mux called with lock topic %s which is not configured.", topic.c_str());
119 const auto& lockConfig = it->second;
120 const auto& priority = lockConfig.priority;
121 const auto& timeout = lockConfig.timeout;
123 const auto key = std::make_pair(priority, topic);
130 const auto remainingTimeout = timeout + (stamp - now);
142 for (
auto it = this->
lastReceiveStamps.crbegin(); it != this->lastReceiveStamps.crend(); ++it)
144 const auto& itPriority = it->first.first;
145 const auto& itTopic = it->first.second;
147 const auto& itStamp = it->second;
148 if (now < itStamp + itConfig.timeout)
154 const auto& disabledStamp = disableIt->second;
155 if (now < disabledStamp + itConfig.timeout)
160 topicsPriority = itPriority;
176 if (topicsPriority >= lockedPriority)
180 const auto& config = topicAndConfig.second;
181 if (config.priority != topicsPriority)
183 this->lastSelectedTopics[config.outTopic] = topicAndConfig.first;
187 for (
const auto& outAndSelectedTopic : this->lastSelectedTopics)
189 if (lastTopics[outAndSelectedTopic.first] != outAndSelectedTopic.second)
190 CRAS_DEBUG(
"Choosing topic %s instead of %s for output topic %s.", outAndSelectedTopic.second.c_str(),
191 lastTopics[outAndSelectedTopic.first].c_str(), outAndSelectedTopic.first.c_str());
198 for (
auto it = this->
lastLockStamps.crbegin(); it != this->lastLockStamps.crend(); ++it)
200 const auto& itPriority = it->first.first;
201 const auto& itTopic = it->first.second;
202 const auto& itStamp = it->second;
204 const auto& itTimeout = itConfig.timeout;
205 const auto key = std::make_pair(itPriority, itTopic);
208 highestLockedPriority = itPriority;
212 return highestLockedPriority;
238 for (
const auto& topicAndLockConfig : this->
lockConfigs)
240 const auto key = std::make_pair(topicAndLockConfig.second.priority, topicAndLockConfig.first);
255 CRAS_ERROR(
"Priority mux called with topic %s which is not configured.", inTopic.c_str());
259 const auto& config = it->second;
261 const auto disableIt = this->
disabledStamps.find(std::make_pair(config.priority, it->first));
264 const auto& disabledStamp = disableIt->second;
265 return now >= disabledStamp + config.timeout;