From 83ee2942fcbfd95b99cbbf864729225b5f1ba8c5 Mon Sep 17 00:00:00 2001 From: DH Date: Sun, 1 Sep 2024 18:02:43 +0300 Subject: [PATCH] ipmi: use cv to wait async responses --- orbis-kernel/include/orbis/ipmi.hpp | 1 + orbis-kernel/src/ipmi.cpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/orbis-kernel/include/orbis/ipmi.hpp b/orbis-kernel/include/orbis/ipmi.hpp index a7d828f36..be60f5bc1 100644 --- a/orbis-kernel/include/orbis/ipmi.hpp +++ b/orbis-kernel/include/orbis/ipmi.hpp @@ -71,6 +71,7 @@ struct IpmiClient : RcBase { Ref session; shared_mutex mutex; shared_cv sessionCv; + shared_cv asyncResponseCv; Process *process; kdeque messageQueues; kdeque eventFlags; diff --git a/orbis-kernel/src/ipmi.cpp b/orbis-kernel/src/ipmi.cpp index a0fbe6faa..705bfbc77 100644 --- a/orbis-kernel/src/ipmi.cpp +++ b/orbis-kernel/src/ipmi.cpp @@ -504,13 +504,16 @@ orbis::SysResult orbis::sysImpiSessionRespondAsync(Thread *thread, ORBIS_RET_ON_ERROR(ureadRaw(elem.data(), data.data, data.size)); } - std::lock_guard clientLock(client->mutex); - client->asyncResponses.push_back({ - .methodId = _params.method, - .errorCode = _params.result, - .data = std::move(outData), - }); + { + std::lock_guard clientLock(client->mutex); + client->asyncResponses.push_back({ + .methodId = _params.method, + .errorCode = _params.result, + .data = std::move(outData), + }); + } + client->asyncResponseCv.notify_all(client->mutex); return uwrite(result, 0u); } @@ -591,7 +594,7 @@ orbis::SysResult orbis::sysIpmiClientTryGetResult(Thread *thread, } } - std::this_thread::sleep_for(std::chrono::microseconds(200)); + client->asyncResponseCv.wait(client->mutex); } // return uwrite(result, 0x80020000 + static_cast(ErrorCode::AGAIN));