winusb: DriverHost_PX4: チューナーオープン処理のバグを修正

同じチューナーを何度も開こうとして無限ループに陥ることのあるバグを修正

https://mevius.5ch.net/test/read.cgi/avi/1629554684/129
https://mevius.5ch.net/test/read.cgi/avi/1629554684/131
This commit is contained in:
nns779
2021-09-09 20:13:46 +09:00
parent 9e3483d1eb
commit cfe0712251
3 changed files with 16 additions and 19 deletions

View File

@@ -62,25 +62,12 @@ void CtrlServer::CtrlConnection::Worker() noexcept
}
px4::command::CtrlOpenCmd *open = reinterpret_cast<px4::command::CtrlOpenCmd *>(buf.get());
std::uint32_t data_id;
while (true) {
receiver = receiver_manager_.Search(open->receiver_info, info);
if (!receiver)
break;
if (receiver->Open())
continue;
std::uint32_t data_id;
if (!receiver_manager_.GenerateDataId(receiver, data_id)) {
receiver->Close();
continue;
}
receiver = receiver_manager_.SearchAndOpen(open->receiver_info, info, data_id);
if (receiver) {
open->receiver_info = info;
open->receiver_info.data_id = data_id;
break;
}
open->status = (receiver) ? px4::command::CtrlStatusCode::SUCCEEDED : px4::command::CtrlStatusCode::FAILED;

View File

@@ -30,7 +30,7 @@ bool ReceiverManager::Unregister(px4::ReceiverBase *receiver)
static GUID empty_guid = { 0 };
px4::ReceiverBase* ReceiverManager::Search(px4::command::ReceiverInfo &key, px4::command::ReceiverInfo &info)
px4::ReceiverBase* ReceiverManager::SearchAndOpen(px4::command::ReceiverInfo &key, px4::command::ReceiverInfo &info, std::uint32_t &data_id)
{
std::shared_lock<std::shared_mutex> lock(mtx_);
@@ -58,9 +58,19 @@ px4::ReceiverBase* ReceiverManager::Search(px4::command::ReceiverInfo &key, px4:
if ((key.index >= 0) && (key.index != k.index))
continue;
px4::ReceiverBase *r = it->first;
if (r->Open())
continue;
if (!GenerateDataId(r, data_id)) {
r->Close();
continue;
}
info = k;
return it->first;
return r;
}
return nullptr;

View File

@@ -25,7 +25,7 @@ public:
bool Register(px4::command::ReceiverInfo &info, px4::ReceiverBase *receiver);
bool Unregister(px4::ReceiverBase *receiver);
px4::ReceiverBase* Search(px4::command::ReceiverInfo &key, px4::command::ReceiverInfo &info);
px4::ReceiverBase* SearchAndOpen(px4::command::ReceiverInfo &key, px4::command::ReceiverInfo &info, std::uint32_t &data_id);
px4::ReceiverBase* SearchByDataId(std::uint32_t data_id);
bool GenerateDataId(px4::ReceiverBase *receiver, std::uint32_t &data_id);
void ClearDataId(px4::ReceiverBase *receiver);