mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-23 01:21:42 +00:00
Fixes rpc timeouts and blocking call list error (#95)
This commit is contained in:
committed by
Peter Johnson
parent
1635cba827
commit
d6e8de21ef
@@ -1415,24 +1415,22 @@ bool Storage::GetRpcResult(bool blocking, unsigned int call_uid,
|
||||
bool Storage::GetRpcResult(bool blocking, unsigned int call_uid, double time_out,
|
||||
std::string* result) {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
// only allow one blocking call per rpc call uid
|
||||
if (!m_rpc_blocking_calls.insert(call_uid).second) return false;
|
||||
for (;;) {
|
||||
auto i =
|
||||
m_rpc_results.find(std::make_pair(call_uid >> 16, call_uid & 0xffff));
|
||||
if (i == m_rpc_results.end()) {
|
||||
if (!blocking || m_terminating) return false;
|
||||
// only allow one blocking call per rpc call uid
|
||||
if (!m_rpc_blocking_calls.insert(call_uid).second) return false;
|
||||
if (time_out < 0) {
|
||||
m_rpc_results_cond.wait(lock);
|
||||
} else {
|
||||
auto timeout_time = std::chrono::steady_clock::now() +
|
||||
std::chrono::duration<double>(time_out);
|
||||
while (!m_terminating) {
|
||||
auto timed_out = m_rpc_results_cond.wait_until(lock, timeout_time);
|
||||
if (timed_out == std::cv_status::timeout) {
|
||||
m_rpc_blocking_calls.erase(call_uid);
|
||||
return false;
|
||||
}
|
||||
auto timed_out = m_rpc_results_cond.wait_until(lock, timeout_time);
|
||||
if (timed_out == std::cv_status::timeout) {
|
||||
m_rpc_blocking_calls.erase(call_uid);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (m_terminating) {
|
||||
|
||||
Reference in New Issue
Block a user