mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2026-06-29 01:54:20 +03:00
fix use-afrer-free crash caused by QtConcurrent
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
parent
808b09c403
commit
9cd199a49e
5 changed files with 42 additions and 43 deletions
|
|
@ -25,14 +25,14 @@ namespace MMCZip {
|
|||
|
||||
void ExtractZipTask::executeTask()
|
||||
{
|
||||
m_zip_future = QtConcurrent::run(QThreadPool::globalInstance(), [this]() { return extractZip(); });
|
||||
connect(&m_zip_watcher, &QFutureWatcher<ZipResult>::finished, this, &ExtractZipTask::finish);
|
||||
m_zip_watcher.setFuture(m_zip_future);
|
||||
m_zipFuture = QtConcurrent::run(QThreadPool::globalInstance(), [this]() { return extractZip(); });
|
||||
connect(&m_zipWatcher, &QFutureWatcher<ZipResult>::finished, this, &ExtractZipTask::finish);
|
||||
m_zipWatcher.setFuture(m_zipFuture);
|
||||
}
|
||||
|
||||
auto ExtractZipTask::extractZip() -> ZipResult
|
||||
{
|
||||
auto target = m_output_dir.absolutePath();
|
||||
auto target = m_outputDir.absolutePath();
|
||||
auto target_top_dir = QUrl::fromLocalFile(target);
|
||||
|
||||
QStringList extracted;
|
||||
|
|
@ -52,8 +52,9 @@ auto ExtractZipTask::extractZip() -> ZipResult
|
|||
setStatus("Extracting files...");
|
||||
setProgress(0, m_input.getFiles().count());
|
||||
ZipResult result;
|
||||
auto fileName = m_input.getZipName();
|
||||
if (!m_input.parse([this, &result, &target, &target_top_dir, ext, &extracted](ArchiveReader::File* f) {
|
||||
if (m_zip_future.isCanceled())
|
||||
if (m_zipFuture.isCanceled())
|
||||
return false;
|
||||
setProgress(m_progress + 1, m_progressTotal);
|
||||
QString file_name = f->filename();
|
||||
|
|
@ -104,17 +105,16 @@ auto ExtractZipTask::extractZip() -> ZipResult
|
|||
return true;
|
||||
})) {
|
||||
FS::removeFiles(extracted);
|
||||
return result.has_value() || m_zip_future.isCanceled() ? result
|
||||
: ZipResult(tr("Failed to parse file %1").arg(m_input.getZipName()));
|
||||
return result.has_value() ? result : ZipResult(tr("Failed to parse file %1").arg(fileName));
|
||||
}
|
||||
return ZipResult();
|
||||
}
|
||||
|
||||
void ExtractZipTask::finish()
|
||||
{
|
||||
if (m_zip_future.isCanceled()) {
|
||||
if (m_zipFuture.isCanceled()) {
|
||||
emitAborted();
|
||||
} else if (auto result = m_zip_future.result(); result.has_value()) {
|
||||
} else if (auto result = m_zipFuture.result(); result.has_value()) {
|
||||
emitFailed(result.value());
|
||||
} else {
|
||||
emitSucceeded();
|
||||
|
|
@ -123,8 +123,8 @@ void ExtractZipTask::finish()
|
|||
|
||||
bool ExtractZipTask::abort()
|
||||
{
|
||||
if (m_zip_future.isRunning()) {
|
||||
m_zip_future.cancel();
|
||||
if (m_zipFuture.isRunning()) {
|
||||
m_zipFuture.cancel();
|
||||
// NOTE: Here we don't do `emitAborted()` because it will be done when `m_build_zip_future` actually cancels, which may not occur
|
||||
// immediately.
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue