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));