Albert S
47874b3706
Crashes were observed, faulting in libQtNetwork. Those were rather rare. We also have no traces. Probably depends on some order signal/slots were processed. Remove shared states between connections, such as the IPCPreviewWorker and socket instance in IPCServer.
59 خطوط
1.5 KiB
C++
59 خطوط
1.5 KiB
C++
#include <QtConcurrent>
|
|
#include "ipcpreviewworker.h"
|
|
#include "previewgeneratormapfunctor.h"
|
|
IPCPreviewWorker::IPCPreviewWorker(QLocalSocket *peer)
|
|
{
|
|
this->peer = peer;
|
|
this->connect(&previewWorkerWatcher, &QFutureWatcher<QByteArray>::resultReadyAt, this,
|
|
[this](int index)
|
|
{
|
|
if(this->peer != nullptr)
|
|
{
|
|
QDataStream stream{this->peer};
|
|
stream << previewWorkerWatcher.resultAt(index);
|
|
this->peer->flush();
|
|
}
|
|
});
|
|
connect(&previewWorkerWatcher, &QFutureWatcher<QByteArray>::finished, this, &IPCPreviewWorker::shutdownSocket);
|
|
connect(this->peer, &QLocalSocket::disconnected, this, &IPCPreviewWorker::shutdownSocket);
|
|
}
|
|
|
|
void IPCPreviewWorker::shutdownSocket()
|
|
{
|
|
if(cleaned)
|
|
{
|
|
return;
|
|
}
|
|
cleaned = true;
|
|
if(this->peer != nullptr)
|
|
{
|
|
if(this->peer->state() == QLocalSocket::ConnectedState)
|
|
{
|
|
this->peer->flush();
|
|
this->peer->waitForBytesWritten();
|
|
this->peer->disconnectFromServer();
|
|
if(this->peer->state() != QLocalSocket::UnconnectedState)
|
|
{
|
|
this->peer->waitForDisconnected();
|
|
}
|
|
}
|
|
delete this->peer;
|
|
this->peer = nullptr;
|
|
}
|
|
emit finished();
|
|
}
|
|
|
|
void IPCPreviewWorker::start(RenderConfig config, const QVector<RenderTarget> &targets)
|
|
{
|
|
auto mapFunctor = PreviewGeneratorMapFunctor();
|
|
mapFunctor.setRenderConfig(config);
|
|
|
|
previewWorkerWatcher.setFuture(QtConcurrent::mapped(targets, mapFunctor));
|
|
}
|
|
|
|
void IPCPreviewWorker::stop()
|
|
{
|
|
previewWorkerWatcher.cancel();
|
|
previewWorkerWatcher.waitForFinished();
|
|
}
|