Merge pull request #15654 from AndrewMeadows/fix-crash-bugz420

BUGZ-420: guard MyAvatar::_scriptEngine with mutex
This commit is contained in:
Shannon Romano 2019-05-31 12:18:38 -07:00 committed by GitHub
commit fa8d2ffe65
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 11 deletions

View file

@ -325,8 +325,8 @@ MyAvatar::MyAvatar(QThread* thread) :
MyAvatar::~MyAvatar() {
_lookAtTargetAvatar.reset();
delete _myScriptEngine;
_myScriptEngine = nullptr;
delete _scriptEngine;
_scriptEngine = nullptr;
}
QString MyAvatar::getDominantHand() const {
@ -1598,7 +1598,8 @@ void MyAvatar::handleChangedAvatarEntityData() {
blobFailed = true; // blob doesn't exist
return;
}
if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) {
std::lock_guard<std::mutex> guard(_scriptEngineLock);
if (!EntityItemProperties::blobToProperties(*_scriptEngine, itr.value(), properties)) {
blobFailed = true; // blob is corrupt
}
});
@ -1630,7 +1631,8 @@ void MyAvatar::handleChangedAvatarEntityData() {
skip = true;
return;
}
if (!EntityItemProperties::blobToProperties(*_myScriptEngine, itr.value(), properties)) {
std::lock_guard<std::mutex> guard(_scriptEngineLock);
if (!EntityItemProperties::blobToProperties(*_scriptEngine, itr.value(), properties)) {
skip = true;
}
});
@ -1737,7 +1739,10 @@ bool MyAvatar::updateStaleAvatarEntityBlobs() const {
if (found) {
++numFound;
QByteArray blob;
EntityItemProperties::propertiesToBlob(*_myScriptEngine, getID(), properties, blob);
{
std::lock_guard<std::mutex> guard(_scriptEngineLock);
EntityItemProperties::propertiesToBlob(*_scriptEngine, getID(), properties, blob);
}
_avatarEntitiesLock.withWriteLock([&] {
_cachedAvatarEntityBlobs[id] = blob;
});
@ -1883,8 +1888,8 @@ void MyAvatar::avatarEntityDataToJson(QJsonObject& root) const {
}
void MyAvatar::loadData() {
if (!_myScriptEngine) {
_myScriptEngine = new QScriptEngine();
if (!_scriptEngine) {
_scriptEngine = new QScriptEngine();
}
getHead()->setBasePitch(_headPitchSetting.get());
@ -2476,14 +2481,18 @@ QVariantList MyAvatar::getAvatarEntitiesVariant() {
if (!entity) {
continue;
}
QVariantMap avatarEntityData;
EncodeBitstreamParams params;
auto desiredProperties = entity->getEntityProperties(params);
desiredProperties += PROP_LOCAL_POSITION;
desiredProperties += PROP_LOCAL_ROTATION;
EntityItemProperties entityProperties = entity->getProperties(desiredProperties);
QScriptValue scriptProperties = EntityItemPropertiesToScriptValue(_myScriptEngine, entityProperties);
QVariantMap avatarEntityData;
avatarEntityData["id"] = entityID;
EntityItemProperties entityProperties = entity->getProperties(desiredProperties);
QScriptValue scriptProperties;
{
std::lock_guard<std::mutex> guard(_scriptEngineLock);
scriptProperties = EntityItemPropertiesToScriptValue(_scriptEngine, entityProperties);
}
avatarEntityData["properties"] = scriptProperties.toVariant();
avatarEntitiesData.append(QVariant(avatarEntityData));
}

View file

@ -2741,7 +2741,8 @@ private:
mutable std::set<QUuid> _staleCachedAvatarEntityBlobs;
//
// keep a ScriptEngine around so we don't have to instantiate on the fly (these are very slow to create/delete)
QScriptEngine* _myScriptEngine { nullptr };
mutable std::mutex _scriptEngineLock;
QScriptEngine* _scriptEngine { nullptr };
bool _needToSaveAvatarEntitySettings { false };
};