diff --git a/device/device.cpp b/device/device.cpp index 22b8965..96a4e9b 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -486,6 +486,8 @@ optional Device::readLogicalDisk(uint64_t pos, uint8_t* into, uint64_t return nullopt; } + std::lock_guard lk(diskLock); + // This is needed for certain read drivers which take over the communication stream const auto lifetime = suppressDisconnects(); @@ -503,6 +505,7 @@ optional Device::writeLogicalDisk(uint64_t pos, const uint8_t* from, u return nullopt; } + std::lock_guard lk(diskLock); return diskWriteDriver->writeLogicalDisk(*com, report, *diskReadDriver, pos, from, amount, timeout); } @@ -542,11 +545,13 @@ optional Device::getVSAOffsetInLogicalDisk() { return nullopt; } + std::lock_guard lk(diskLock); + if (diskReadDriver->getAccess() == Disk::Access::VSA || diskReadDriver->getAccess() == Disk::Access::None) return 0ull; 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); }); } diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index e61332d..8c9199f 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -418,6 +418,8 @@ private: neodevice_t data; std::shared_ptr latestResetStatus; std::vector> versions; + + mutable std::mutex diskLock; std::unique_ptr diskReadDriver; std::unique_ptr diskWriteDriver;