Race Condition with Shared Drive List
This commit is contained in:
@ -135,6 +135,10 @@ void reHDD::ThreadUserInput()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Drive *tmpSelectedDrive = getSelectedDrive();
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
|
||||
// cout << TUI::readUserInput() << endl;
|
||||
switch (TUI::readUserInput())
|
||||
{
|
||||
@ -159,11 +163,11 @@ void reHDD::ThreadUserInput()
|
||||
case TUI::UserInput::Delete:
|
||||
// cout << "Delete" << endl;
|
||||
|
||||
if (getSelectedDrive() != nullptr)
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::NONE)
|
||||
if (tmpSelectedDrive->state == Drive::NONE)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::DELETE_SELECTED;
|
||||
tmpSelectedDrive->state = Drive::DELETE_SELECTED;
|
||||
}
|
||||
}
|
||||
|
||||
@ -171,15 +175,10 @@ void reHDD::ThreadUserInput()
|
||||
break;
|
||||
case TUI::UserInput::Shred:
|
||||
// cout << "Shred" << endl;
|
||||
|
||||
if (getSelectedDrive() != nullptr)
|
||||
if (tmpSelectedDrive->state == Drive::NONE)
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::NONE)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::SHRED_SELECTED;
|
||||
tmpSelectedDrive->state = Drive::SHRED_SELECTED;
|
||||
}
|
||||
}
|
||||
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::ShredAll:
|
||||
@ -208,6 +207,7 @@ void reHDD::ThreadUserInput()
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void reHDD::ThreadShred(Drive *const pDrive)
|
||||
@ -224,13 +224,14 @@ void reHDD::ThreadShred(Drive *const pDrive)
|
||||
|
||||
void reHDD::ThreadDelete()
|
||||
{
|
||||
if (getSelectedDrive() != nullptr)
|
||||
Drive *tmpSelectedDrive = getSelectedDrive();
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
getSelectedDrive()->setActionStartTimestamp(); // save timestamp at start of deleting
|
||||
Delete::deleteDrive(getSelectedDrive()); // blocking, no thread
|
||||
getSelectedDrive()->state = Drive::TaskState::NONE; // delete finished
|
||||
getSelectedDrive()->bWasDeleted = true;
|
||||
Logger::logThis()->info("Finished delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
|
||||
tmpSelectedDrive->setActionStartTimestamp(); // save timestamp at start of deleting
|
||||
Delete::deleteDrive(tmpSelectedDrive); // blocking, no thread
|
||||
tmpSelectedDrive->state = Drive::TaskState::NONE; // delete finished
|
||||
tmpSelectedDrive->bWasDeleted = true;
|
||||
Logger::logThis()->info("Finished delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial());
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
}
|
||||
}
|
||||
@ -313,7 +314,6 @@ void reHDD::searchDrives(std::list<Drive> *plistDrives)
|
||||
if (!fp)
|
||||
{
|
||||
Logger::logThis()->error("Unable to execute lsblk to scan drives");
|
||||
pclose(fp);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@ -620,22 +620,21 @@ void reHDD::handleArrowKey(TUI::UserInput userInput)
|
||||
|
||||
void reHDD::handleEnter()
|
||||
{
|
||||
|
||||
if (getSelectedDrive() != nullptr)
|
||||
Drive *tmpSelectedDrive = getSelectedDrive();
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED)
|
||||
if (tmpSelectedDrive->state == Drive::TaskState::SHRED_SELECTED)
|
||||
{
|
||||
Logger::logThis()->info("Started shred/check for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
|
||||
getSelectedDrive()->state = Drive::TaskState::SHRED_ACTIVE;
|
||||
// task for drive is running --> don't show more task options
|
||||
Drive *pTmpDrive = getSelectedDrive();
|
||||
thread(ThreadShred, pTmpDrive).detach();
|
||||
Logger::logThis()->info("Started shred/check for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial());
|
||||
tmpSelectedDrive->state = Drive::TaskState::SHRED_ACTIVE;
|
||||
// task for drive is running --> don't show more task option
|
||||
thread(ThreadShred, tmpSelectedDrive).detach();
|
||||
}
|
||||
|
||||
if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED)
|
||||
if (tmpSelectedDrive->state == Drive::TaskState::DELETE_SELECTED)
|
||||
{
|
||||
Logger::logThis()->info("Started delete for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
|
||||
getSelectedDrive()->state = Drive::TaskState::DELETE_ACTIVE;
|
||||
Logger::logThis()->info("Started delete for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial());
|
||||
tmpSelectedDrive->state = Drive::TaskState::DELETE_ACTIVE;
|
||||
// task for drive is running --> don't show more task options
|
||||
thread(ThreadDelete).detach();
|
||||
}
|
||||
@ -644,17 +643,18 @@ void reHDD::handleEnter()
|
||||
|
||||
void reHDD::handleESC()
|
||||
{
|
||||
if (getSelectedDrive() != nullptr)
|
||||
Drive *tmpSelectedDrive = getSelectedDrive();
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::TaskState::SHRED_SELECTED)
|
||||
if (tmpSelectedDrive->state == Drive::TaskState::SHRED_SELECTED)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::TaskState::NONE;
|
||||
tmpSelectedDrive->state = Drive::TaskState::NONE;
|
||||
// task for drive is selected --> remove selection
|
||||
}
|
||||
|
||||
if (getSelectedDrive()->state == Drive::TaskState::DELETE_SELECTED)
|
||||
if (tmpSelectedDrive->state == Drive::TaskState::DELETE_SELECTED)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::TaskState::NONE;
|
||||
tmpSelectedDrive->state = Drive::TaskState::NONE;
|
||||
// task for drive is selected --> remove selection
|
||||
}
|
||||
}
|
||||
@ -662,12 +662,13 @@ void reHDD::handleESC()
|
||||
|
||||
void reHDD::handleAbort()
|
||||
{
|
||||
if (getSelectedDrive() != nullptr)
|
||||
Drive *tmpSelectedDrive = getSelectedDrive();
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::SHRED_ACTIVE || getSelectedDrive()->state == Drive::DELETE_ACTIVE)
|
||||
if (tmpSelectedDrive->state == Drive::SHRED_ACTIVE || tmpSelectedDrive->state == Drive::DELETE_ACTIVE)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::NONE;
|
||||
Logger::logThis()->info("Abort-Shred-Signal for: " + getSelectedDrive()->getModelName() + "-" + getSelectedDrive()->getSerial());
|
||||
tmpSelectedDrive->state = Drive::NONE;
|
||||
Logger::logThis()->info("Abort-Shred-Signal for: " + tmpSelectedDrive->getModelName() + "-" + tmpSelectedDrive->getSerial());
|
||||
// task for drive is running --> remove selection
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user