a bit more thread safety

This commit is contained in:
Robin Müller 2023-04-07 17:15:40 +02:00
parent 353b9bd322
commit 9960fc8ce7
No known key found for this signature in database
GPG Key ID: 11D4952C8CCEF814
2 changed files with 4 additions and 4 deletions

View File

@ -49,14 +49,13 @@ ReturnValue_t RwPollingTask::performOperation(uint8_t operationCode) {
} }
acs::SimpleSensorMode currentMode; acs::SimpleSensorMode currentMode;
rws::SpecialRwRequest specialRequest; rws::SpecialRwRequest specialRequest;
bool doSetSpeed;
for (unsigned idx = 0; idx < rwCookies.size(); idx++) { for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
{ {
MutexGuard mg(ipcLock); MutexGuard mg(ipcLock);
currentMode = rwRequests[idx].mode; currentMode = rwRequests[idx].mode;
specialRequest = rwRequests[idx].specialRequest; specialRequest = rwRequests[idx].specialRequest;
doSetSpeed = rwRequests[idx].setSpeed; skipSetSpeedReply[idx] = rwRequests[idx].setSpeed;
} }
if (currentMode == acs::SimpleSensorMode::OFF) { if (currentMode == acs::SimpleSensorMode::OFF) {
skipCommandingForRw[idx] = true; skipCommandingForRw[idx] = true;
@ -65,7 +64,7 @@ ReturnValue_t RwPollingTask::performOperation(uint8_t operationCode) {
// No point in commanding that specific RW for the cycle. // No point in commanding that specific RW for the cycle.
skipCommandingForRw[idx] = true; skipCommandingForRw[idx] = true;
writeOneRwCmd(idx, fd); writeOneRwCmd(idx, fd);
} else if (doSetSpeed) { } else if (skipSetSpeedReply[idx]) {
prepareSetSpeedCmd(idx); prepareSetSpeedCmd(idx);
if (writeOneRwCmd(idx, fd) != returnvalue::OK) { if (writeOneRwCmd(idx, fd) != returnvalue::OK) {
continue; continue;
@ -329,7 +328,7 @@ ReturnValue_t RwPollingTask::writeOneRwCmd(uint8_t rwIdx, int fd) {
ReturnValue_t RwPollingTask::readAllRws(DeviceCommandId_t id) { ReturnValue_t RwPollingTask::readAllRws(DeviceCommandId_t id) {
// SPI dev will be opened in readNextReply on demand. // SPI dev will be opened in readNextReply on demand.
for (unsigned idx = 0; idx < rwCookies.size(); idx++) { for (unsigned idx = 0; idx < rwCookies.size(); idx++) {
if (((id == rws::SET_SPEED) and !rwRequests[idx].setSpeed) or skipCommandingForRw[idx]) { if (((id == rws::SET_SPEED) and !skipSetSpeedReply[idx]) or skipCommandingForRw[idx]) {
continue; continue;
} }
uint8_t* replyBuf; uint8_t* replyBuf;

View File

@ -47,6 +47,7 @@ class RwPollingTask : public SystemObject, public ExecutableObjectIF, public Dev
const char* spiDev; const char* spiDev;
GpioIF& gpioIF; GpioIF& gpioIF;
std::array<bool, 4> skipCommandingForRw; std::array<bool, 4> skipCommandingForRw;
std::array<bool, 4> skipSetSpeedReply;
std::array<DeviceCommandId_t, 4> specialRequestIds; std::array<DeviceCommandId_t, 4> specialRequestIds;
std::array<RwCookie*, 4> rwCookies; std::array<RwCookie*, 4> rwCookies;
std::array<rws::RwRequest, 4> rwRequests{}; std::array<rws::RwRequest, 4> rwRequests{};