merge with epics-base

This commit is contained in:
mrkraimer
2018-09-10 13:46:50 -04:00
7 changed files with 59 additions and 15 deletions
+18 -5
View File
@@ -62,20 +62,24 @@ void CAChannel::connected()
if(DEBUG_LEVEL>0) {
cout<< "CAChannel::connected " << channelName << endl;
}
bool callChannelConnected = false;
bool callChannelCreated = false;
{
Lock lock(requestsMutex);
if(!channelCreated) {
channelCreated = true;
callChannelConnected = true;
callChannelCreated = true;
}
}
if(callChannelConnected) {
if(callChannelCreated) {
CAChannelProviderPtr provider(channelProvider.lock());
if(provider) provider->addChannel(shared_from_this());
ChannelRequester::shared_pointer req(channelRequester.lock());
if(req) EXCEPTION_GUARD(req->channelCreated(Status::Ok, shared_from_this()));
}
while(!getFieldQueue.empty()) {
getFieldQueue.front()->activate();
getFieldQueue.pop();
}
while(!putQueue.empty()) {
putQueue.front()->activate();
putQueue.pop();
@@ -239,7 +243,8 @@ void CAChannel::getField(GetFieldRequester::shared_pointer const & requester,
if(DEBUG_LEVEL>0) {
cout << "CAChannel::getField " << channelName << endl;
}
CAChannelGetFieldPtr getField(new CAChannelGetField(requester,subField));
CAChannelGetFieldPtr getField(
new CAChannelGetField(shared_from_this(),requester,subField));
{
Lock lock(requestsMutex);
if(getConnectionState()!=Channel::CONNECTED) {
@@ -353,8 +358,10 @@ void CAChannel::printInfo(std::ostream& out)
CAChannelGetField::CAChannelGetField(
CAChannelPtr const &channel,
GetFieldRequester::shared_pointer const & requester,std::string const & subField)
: getFieldRequester(requester),
: channel(channel),
getFieldRequester(requester),
subField(subField)
{
if(DEBUG_LEVEL>0) {
@@ -362,6 +369,12 @@ CAChannelGetField::CAChannelGetField(
}
}
void CAChannelGetField::activate()
{
CAChannelPtr chan(channel.lock());
if(chan) callRequester(chan);
}
CAChannelGetField::~CAChannelGetField()
{
if(DEBUG_LEVEL>0) {
+6 -1
View File
@@ -63,10 +63,15 @@ class CAChannelGetField :
{
public:
POINTER_DEFINITIONS(CAChannelGetField);
CAChannelGetField(GetFieldRequester::shared_pointer const & requester,std::string const & subField);
CAChannelGetField(
CAChannelPtr const &channel,
GetFieldRequester::shared_pointer const & requester,
std::string const & subField);
~CAChannelGetField();
void callRequester(CAChannelPtr const & caChannel);
void activate();
private:
CAChannelWPtr channel;
GetFieldRequester::weak_pointer getFieldRequester;
std::string subField;
};
+3
View File
@@ -141,6 +141,9 @@ struct RPCer : public pva::ChannelRPCRequester,
event.message.clear();
}
event.value = pvResponse;
pvd::BitSetPtr valid(new pvd::BitSet(1));
valid->set(0);
event.valid = valid;
callEvent(G, status.isSuccess()? pvac::GetEvent::Success : pvac::GetEvent::Fail);
}
+8
View File
@@ -216,6 +216,14 @@ struct Get2PutProxy : public ChannelGet
return req ? req->getRequesterName() : "";
}
virtual void message(const std::string &message, MessageType messageType) OVERRIDE FINAL {
ChannelGetRequester::shared_pointer req(requester.lock());
if(req)
req->message(message, messageType);
else
ChannelPutRequester::message(message, messageType);
}
virtual void channelDisconnect(bool destroy) OVERRIDE FINAL {
ChannelGetRequester::shared_pointer req(requester.lock());
if(req)
+3 -2
View File
@@ -121,6 +121,7 @@ public:
private:
typedef std::map<std::string, std::tr1::shared_ptr<ChannelBuilder> > builders_t;
public:
typedef builders_t::const_iterator const_iterator;
//! Build a new, empty, provider.
//! @param name Provider Name. Only relevant if registerAsServer() is called, then must be unique in this process.
@@ -144,8 +145,8 @@ public:
std::tr1::shared_ptr<epics::pvAccess::ChannelProvider> provider() const;
// iterate through currently add()'d PVs. Iteraters are invalidated by concurrent add() or remove()
builders_t::const_iterator begin() const;
builders_t::const_iterator end() const;
const_iterator begin() const;
const_iterator end() const;
};
/** @brief A Provider which has no pre-configured list of names.
+2 -2
View File
@@ -26,9 +26,9 @@
namespace {
struct MailboxHandler : public pvas::SharedPV::Handler {
virtual ~MailboxHandler() {}
virtual void onPut(pvas::SharedPV& self, pvas::Operation& op)
virtual void onPut(const pvas::SharedPV::shared_pointer& self, pvas::Operation& op) OVERRIDE FINAL
{
self.post(op.value(), op.changed());
self->post(op.value(), op.changed());
op.info("Set!");
op.complete();
}