From ff07e476266cd5038982dde7f6f1dff1612808b4 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Mon, 14 Mar 2016 17:49:37 -0700 Subject: [PATCH 1/2] Make procedural dirty marker atomic --- libraries/procedural/src/procedural/Procedural.cpp | 8 ++++---- libraries/procedural/src/procedural/Procedural.h | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libraries/procedural/src/procedural/Procedural.cpp b/libraries/procedural/src/procedural/Procedural.cpp index 9b8d0fe294..071b07b48a 100644 --- a/libraries/procedural/src/procedural/Procedural.cpp +++ b/libraries/procedural/src/procedural/Procedural.cpp @@ -62,13 +62,13 @@ QJsonValue Procedural::getProceduralData(const QString& proceduralJson) { return doc.object()[PROCEDURAL_USER_DATA_KEY]; } -Procedural::Procedural() { - _state = std::make_shared(); +Procedural::Procedural() : _state { std::make_shared() } { + _proceduralDataDirty = false; } -Procedural::Procedural(const QString& userDataJson) { +Procedural::Procedural(const QString& userDataJson) : Procedural() { parse(userDataJson); - _state = std::make_shared(); + _proceduralDataDirty = true; } void Procedural::parse(const QString& userDataJson) { diff --git a/libraries/procedural/src/procedural/Procedural.h b/libraries/procedural/src/procedural/Procedural.h index 0e55f52f5a..f928d0e594 100644 --- a/libraries/procedural/src/procedural/Procedural.h +++ b/libraries/procedural/src/procedural/Procedural.h @@ -10,6 +10,8 @@ #ifndef hifi_RenderableProcedrualItem_h #define hifi_RenderableProcedrualItem_h +#include + #include #include #include @@ -74,7 +76,7 @@ protected: NetworkShaderPointer _networkShader; QJsonObject _parsedUniforms; QJsonArray _parsedChannels; - bool _proceduralDataDirty { true }; + std::atomic_bool _proceduralDataDirty; bool _shaderDirty { true }; bool _uniformsDirty { true }; bool _channelsDirty { true }; From 1a8cca3dcca0f4e59b5d25429b9b9a03962b1c30 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 15 Mar 2016 10:51:55 -0700 Subject: [PATCH 2/2] Clarify use of procedural's dirty atomic flag --- libraries/procedural/src/procedural/Procedural.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/procedural/src/procedural/Procedural.cpp b/libraries/procedural/src/procedural/Procedural.cpp index 071b07b48a..d3aed38198 100644 --- a/libraries/procedural/src/procedural/Procedural.cpp +++ b/libraries/procedural/src/procedural/Procedural.cpp @@ -77,6 +77,9 @@ void Procedural::parse(const QString& userDataJson) { // This will be called by Procedural::ready std::lock_guard lock(_proceduralDataMutex); _proceduralData = proceduralData.toObject(); + + // Mark as dirty after modifying _proceduralData, but before releasing lock + // to avoid setting it after parsing has begun _proceduralDataDirty = true; } @@ -166,9 +169,13 @@ void Procedural::parse(const QJsonObject& proceduralData) { bool Procedural::ready() { // Load any changes to the procedural + // Check for changes atomically, in case they are currently being made if (_proceduralDataDirty) { std::lock_guard lock(_proceduralDataMutex); parse(_proceduralData); + + // Reset dirty flag after reading _proceduralData, but before releasing lock + // to avoid resetting it after more data is set _proceduralDataDirty = false; }