AccountManager destructor waits for any RSA key thread

This commit is contained in:
Simon Walton 2018-05-29 17:04:37 -07:00
parent 545ada0abb
commit 66d39667e1
2 changed files with 22 additions and 1 deletions

View file

@ -93,6 +93,13 @@ AccountManager::AccountManager(UserAgentGetter userAgentGetter) :
const QString DOUBLE_SLASH_SUBSTITUTE = "slashslash";
const QString ACCOUNT_MANAGER_REQUESTED_SCOPE = "owner";
AccountManager::~AccountManager() {
QMutexLocker lock(&_rsaKeygenLock);
while (_rsaKeygenThread) {
_rsaKeygenWait.wait(&_rsaKeygenLock);
}
}
void AccountManager::logout() {
// a logout means we want to delete the DataServerAccountInfo we currently have for this URL, in-memory and in file
_accountInfo = DataServerAccountInfo();
@ -761,8 +768,9 @@ void AccountManager::generateNewKeypair(bool isUserKeypair, const QUuid& domainI
this, &AccountManager::handleKeypairGenerationError);
connect(keypairGenerator, &QObject::destroyed, generateThread, &QThread::quit);
connect(this, &QObject::destroyed, generateThread, &QThread::quit);
connect(generateThread, &QThread::finished, this, &AccountManager::rsaKeygenThreadFinished);
connect(generateThread, &QThread::finished, generateThread, &QThread::deleteLater);
_rsaKeygenThread = generateThread;
keypairGenerator->moveToThread(generateThread);
@ -870,3 +878,9 @@ void AccountManager::handleKeypairGenerationError() {
sender()->deleteLater();
}
void AccountManager::rsaKeygenThreadFinished() {
QMutexLocker lock(&_rsaKeygenLock);
_rsaKeygenThread = nullptr;
_rsaKeygenWait.wakeAll();
}

View file

@ -15,6 +15,8 @@
#include <QtCore/QByteArray>
#include <QtCore/QObject>
#include <QtCore/QUrl>
#include <QtCore/QMutex>
#include <QtCore/QWaitCondition>
#include <QtNetwork/QNetworkReply>
#include <QUrlQuery>
@ -63,6 +65,7 @@ class AccountManager : public QObject, public Dependency {
Q_OBJECT
public:
AccountManager(UserAgentGetter userAgentGetter = DEFAULT_USER_AGENT_GETTER);
~AccountManager();
Q_INVOKABLE void sendRequest(const QString& path,
AccountManagerAuth::Type authType,
@ -131,6 +134,7 @@ private slots:
void publicKeyUploadSucceeded(QNetworkReply& reply);
void publicKeyUploadFailed(QNetworkReply& reply);
void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid());
void rsaKeygenThreadFinished();
private:
AccountManager(AccountManager const& other) = delete;
@ -156,6 +160,9 @@ private:
QByteArray _pendingPrivateKey;
QUuid _sessionID { QUuid::createUuid() };
QMutex _rsaKeygenLock;
QWaitCondition _rsaKeygenWait;
QThread* _rsaKeygenThread { nullptr };
};
#endif // hifi_AccountManager_h