From f4b245710dd287b7c4b326cf71f279469ac01210 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Sat, 14 Jul 2018 14:17:59 -0700 Subject: [PATCH] sharedstate: Get use pvRequest field selection mask --- src/server/sharedstate_put.cpp | 19 ++++++++++++++++--- src/server/sharedstateimpl.h | 4 ++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/server/sharedstate_put.cpp b/src/server/sharedstate_put.cpp index efa83c0..29db288 100644 --- a/src/server/sharedstate_put.cpp +++ b/src/server/sharedstate_put.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #define epicsExportSharedSymbols #include "sharedstateimpl.h" @@ -124,15 +125,25 @@ void SharedPut::get() pvd::Status sts; pvd::PVStructurePtr current; pvd::BitSetPtr changed; + bool emptyselect = false; { Guard G(channel->owner->mutex); if(channel->owner->current) { - // clone - current = pvd::getPVDataCreate()->createPVStructure(channel->owner->current->getStructure()); - current->copyUnchecked(*channel->owner->current); + const pvd::StructureConstPtr& currentType = channel->owner->current->getStructure(); + current = pvd::getPVDataCreate()->createPVStructure(currentType); + + if(currentType!=lastStruct) { + selectMask = pvd::extractRequestMask(current, pvRequest->getSubField("field")); + emptyselect = selectMask.isEmpty(); + lastStruct = currentType; + } changed.reset(new pvd::BitSet(channel->owner->valid)); + *changed &= selectMask; + + // clone + current->copyUnchecked(*channel->owner->current, *changed); } } @@ -141,6 +152,8 @@ void SharedPut::get() if(!current) { sts = pvd::Status::error("Get not possible, cache disabled"); + } else if(emptyselect) { + sts = pvd::Status::warn("pvRequest with empty field mask"); } req->getDone(sts, shared_from_this(), current, changed); diff --git a/src/server/sharedstateimpl.h b/src/server/sharedstateimpl.h index cf648eb..34126c6 100644 --- a/src/server/sharedstateimpl.h +++ b/src/server/sharedstateimpl.h @@ -73,6 +73,10 @@ struct SharedPut : public pva::ChannelPut, const requester_type::weak_pointer requester; const pvd::PVStructure::const_shared_pointer pvRequest; + // guarded by PV mutex + pvd::StructureConstPtr lastStruct; + pvd::BitSet selectMask; + static size_t num_instances; SharedPut(const std::tr1::shared_ptr& channel,