mirror of
https://github.com/intrepidcs/libicsneo.git
synced 2026-08-05 01:18:36 +02:00
Device: Only allow one disk transaction at a time
Most drivers will not gracefully handle more than one transaction
This commit is contained in:
+6
-1
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user