Device: Only allow one disk transaction at a time

Most drivers will not gracefully handle more than one transaction
v0.3.0-dev
Paul Hollinsky 2022-03-03 16:20:51 -05:00
parent 8c774228bc
commit 1118428250
2 changed files with 8 additions and 1 deletions

View File

@ -486,6 +486,8 @@ optional<uint64_t> Device::readLogicalDisk(uint64_t pos, uint8_t* into, uint64_t
return nullopt; return nullopt;
} }
std::lock_guard<std::mutex> lk(diskLock);
// This is needed for certain read drivers which take over the communication stream // This is needed for certain read drivers which take over the communication stream
const auto lifetime = suppressDisconnects(); const auto lifetime = suppressDisconnects();
@ -503,6 +505,7 @@ optional<uint64_t> Device::writeLogicalDisk(uint64_t pos, const uint8_t* from, u
return nullopt; return nullopt;
} }
std::lock_guard<std::mutex> lk(diskLock);
return diskWriteDriver->writeLogicalDisk(*com, report, *diskReadDriver, pos, from, amount, timeout); return diskWriteDriver->writeLogicalDisk(*com, report, *diskReadDriver, pos, from, amount, timeout);
} }
@ -542,11 +545,13 @@ optional<uint64_t> Device::getVSAOffsetInLogicalDisk() {
return nullopt; return nullopt;
} }
std::lock_guard<std::mutex> lk(diskLock);
if (diskReadDriver->getAccess() == Disk::Access::VSA || diskReadDriver->getAccess() == Disk::Access::None) if (diskReadDriver->getAccess() == Disk::Access::VSA || diskReadDriver->getAccess() == Disk::Access::None)
return 0ull; return 0ull;
return Disk::FindVSAInFAT([this](uint64_t pos, uint8_t *into, uint64_t amount) { return Disk::FindVSAInFAT([this](uint64_t pos, uint8_t *into, uint64_t amount) {
return readLogicalDisk(pos, into, amount); return diskReadDriver->readLogicalDisk(*com, report, pos, into, amount);
}); });
} }

View File

@ -418,6 +418,8 @@ private:
neodevice_t data; neodevice_t data;
std::shared_ptr<ResetStatusMessage> latestResetStatus; std::shared_ptr<ResetStatusMessage> latestResetStatus;
std::vector<optional<DeviceAppVersion>> versions; std::vector<optional<DeviceAppVersion>> versions;
mutable std::mutex diskLock;
std::unique_ptr<Disk::ReadDriver> diskReadDriver; std::unique_ptr<Disk::ReadDriver> diskReadDriver;
std::unique_ptr<Disk::WriteDriver> diskWriteDriver; std::unique_ptr<Disk::WriteDriver> diskWriteDriver;