diff --git a/components/structures/src/new_frame.cpp b/components/structures/src/new_frame.cpp index f969023fc3ea6a4715a74a0b9ee57bb1ebc1faf5..7c8f1081471fa6047ec2ff2a1bb52b69d67ed6f7 100644 --- a/components/structures/src/new_frame.cpp +++ b/components/structures/src/new_frame.cpp @@ -100,14 +100,21 @@ const Frame::ChannelData &Frame::_getData(ftl::codecs::Channel c) const { std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t) { if (status_ != FrameStatus::CREATED) throw FTL_Error("Cannot apply change after store " << static_cast<int>(status_)); - //UNIQUE_LOCK(mutex(), lk); - - auto &d = data_[c]; - if (d.status != ftl::data::ChannelStatus::FLUSHED) { - d.status = ftl::data::ChannelStatus::DISPATCHED; - d.encoded.clear(); + ftl::data::Frame::ChannelData *d; + + if (parent_) { + UNIQUE_LOCK(mutex(), lk); + d = &(data_[c]); touch(c, t); - return d.data; + } else { + d = &(data_[c]); + touch(c, t); + } + + if (d->status != ftl::data::ChannelStatus::FLUSHED) { + d->status = ftl::data::ChannelStatus::DISPATCHED; + d->encoded.clear(); + return d->data; } else { throw FTL_Error("Channel is flushed and read-only: " << static_cast<unsigned int>(c)); } @@ -116,14 +123,21 @@ std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t std::any &Frame::createAnyChange(ftl::codecs::Channel c, ftl::data::ChangeType t, ftl::codecs::Packet &data) { if (status_ != FrameStatus::CREATED) throw FTL_Error("Cannot apply change after store " << static_cast<int>(status_)); - //UNIQUE_LOCK(mutex(), lk); - - auto &d = data_[c]; - if (d.status != ftl::data::ChannelStatus::FLUSHED) { - d.status = ftl::data::ChannelStatus::DISPATCHED; - d.encoded.push_back(data); + ftl::data::Frame::ChannelData *d; + + if (parent_) { + UNIQUE_LOCK(mutex(), lk); + d = &(data_[c]); touch(c, t); - return d.data; + } else { + d = &(data_[c]); + touch(c, t); + } + + if (d->status != ftl::data::ChannelStatus::FLUSHED) { + d->status = ftl::data::ChannelStatus::DISPATCHED; + d->encoded.push_back(data); + return d->data; } else { throw FTL_Error("Channel is flushed and read-only: " << static_cast<unsigned int>(c)); }