Race Condition with Shared Drive List
This commit is contained in:
179
src/reHDD.cpp
179
src/reHDD.cpp
@ -135,77 +135,77 @@ void reHDD::ThreadUserInput()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
// cout << TUI::readUserInput() << endl;
|
||||
switch (TUI::readUserInput())
|
||||
Drive *tmpSelectedDrive = getSelectedDrive();
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
case TUI::UserInput::DownKey:
|
||||
// cout << "Down" << endl;
|
||||
handleArrowKey(TUI::UserInput::DownKey);
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::UpKey:
|
||||
// cout << "Up" << endl;
|
||||
handleArrowKey(TUI::UserInput::UpKey);
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Undefined:
|
||||
// cout << "Undefined" << endl;
|
||||
break;
|
||||
case TUI::UserInput::Abort:
|
||||
// cout << "Abort" << endl;
|
||||
handleAbort();
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Delete:
|
||||
// cout << "Delete" << endl;
|
||||
|
||||
if (getSelectedDrive() != nullptr)
|
||||
// cout << TUI::readUserInput() << endl;
|
||||
switch (TUI::readUserInput())
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::NONE)
|
||||
case TUI::UserInput::DownKey:
|
||||
// cout << "Down" << endl;
|
||||
handleArrowKey(TUI::UserInput::DownKey);
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::UpKey:
|
||||
// cout << "Up" << endl;
|
||||
handleArrowKey(TUI::UserInput::UpKey);
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Undefined:
|
||||
// cout << "Undefined" << endl;
|
||||
break;
|
||||
case TUI::UserInput::Abort:
|
||||
// cout << "Abort" << endl;
|
||||
handleAbort();
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Delete:
|
||||
// cout << "Delete" << endl;
|
||||
|
||||
if (tmpSelectedDrive != nullptr)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::DELETE_SELECTED;
|
||||
if (tmpSelectedDrive->state == Drive::NONE)
|
||||
{
|
||||
tmpSelectedDrive->state = Drive::DELETE_SELECTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Shred:
|
||||
// cout << "Shred" << endl;
|
||||
|
||||
if (getSelectedDrive() != nullptr)
|
||||
{
|
||||
if (getSelectedDrive()->state == Drive::NONE)
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Shred:
|
||||
// cout << "Shred" << endl;
|
||||
if (tmpSelectedDrive->state == Drive::NONE)
|
||||
{
|
||||
getSelectedDrive()->state = Drive::SHRED_SELECTED;
|
||||
tmpSelectedDrive->state = Drive::SHRED_SELECTED;
|
||||
}
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::ShredAll:
|
||||
// cout << "ShredAll" << endl;
|
||||
startShredAllDrives(&listDrives);
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Enter:
|
||||
// cout << "Enter" << endl;
|
||||
handleEnter();
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::ESC:
|
||||
// cout << "ESC" << endl;
|
||||
handleESC();
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Terminate:
|
||||
// cout << "Terminate" << endl;
|
||||
stopShredAllDrives(&listDrives);
|
||||
ui->terminateTUI();
|
||||
sleep(5); // sleep 5 sec
|
||||
std::exit(1); // Terminates main, doesn't wait for threads
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::ShredAll:
|
||||
// cout << "ShredAll" << endl;
|
||||
startShredAllDrives(&listDrives);
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Enter:
|
||||
// cout << "Enter" << endl;
|
||||
handleEnter();
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::ESC:
|
||||
// cout << "ESC" << endl;
|
||||
handleESC();
|
||||
ui->updateTUI(&listDrives, u8SelectedEntry);
|
||||
break;
|
||||
case TUI::UserInput::Terminate:
|
||||
// cout << "Terminate" << endl;
|
||||
stopShredAllDrives(&listDrives);
|
||||
ui->terminateTUI();
|
||||
sleep(5); // sleep 5 sec
|
||||
std::exit(1); // Terminates main, doesn't wait for threads
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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