Fix missing object locks

This commit is contained in:
Michael Friedrich 2018-07-04 16:44:44 +02:00
parent 413e351805
commit 3ce8f5599e

View File

@ -127,18 +127,26 @@ static void CollectScalarVars(Value haystack, std::vector<Value>& path, std::map
const Object::Ptr& obj = haystack.Get<Object::Ptr>(); const Object::Ptr& obj = haystack.Get<Object::Ptr>();
Dictionary::Ptr dict = dynamic_pointer_cast<Dictionary>(obj); Dictionary::Ptr dict = dynamic_pointer_cast<Dictionary>(obj);
if (dict) { if (dict) {
ObjectLock olock(dict);
for (auto& kv : dict) { for (auto& kv : dict) {
path.emplace_back(kv.first); path.emplace_back(kv.first);
CollectScalarVars(kv.second, path, needles); CollectScalarVars(kv.second, path, needles);
path.pop_back(); path.pop_back();
} }
break; break;
} }
Array::Ptr arr = dynamic_pointer_cast<Array>(obj); Array::Ptr arr = dynamic_pointer_cast<Array>(obj);
if (arr) { if (arr) {
double index = 0.0; double index = 0.0;
ObjectLock xlock(arr);
for (auto& v : arr) { for (auto& v : arr) {
path.emplace_back(index); path.emplace_back(index);
CollectScalarVars(v, path, needles); CollectScalarVars(v, path, needles);
@ -146,6 +154,7 @@ static void CollectScalarVars(Value haystack, std::vector<Value>& path, std::map
index += 1.0; index += 1.0;
} }
break; break;
} }
} }
@ -227,6 +236,8 @@ Dictionary::Ptr RedisWriter::SerializeVars(const CustomVarObject::Ptr& object)
auto env (GetEnvironment()); auto env (GetEnvironment());
auto envChecksum (SHA1(env)); auto envChecksum (SHA1(env));
ObjectLock olock(vars);
for (auto& kv : vars) { for (auto& kv : vars) {
Dictionary::Ptr flatVars = new Dictionary(); Dictionary::Ptr flatVars = new Dictionary();