diff --git a/pvAccessApp/ca/caChannel.cpp b/pvAccessApp/ca/caChannel.cpp index bba7c38..d7c6220 100644 --- a/pvAccessApp/ca/caChannel.cpp +++ b/pvAccessApp/ca/caChannel.cpp @@ -343,7 +343,7 @@ ChannelPutGet::shared_pointer CAChannel::createChannelPutGet( Status errorStatus(Status::STATUSTYPE_ERROR, "not supported"); ChannelPutGet::shared_pointer nullChannelPutGet; EXCEPTION_GUARD(channelPutGetRequester->channelPutGetConnect(errorStatus, nullChannelPutGet, - PVStructure::shared_pointer(), PVStructure::shared_pointer())); + Structure::const_shared_pointer(), Structure::const_shared_pointer())); return nullChannelPutGet; } @@ -374,7 +374,7 @@ ChannelArray::shared_pointer CAChannel::createChannelArray( Status errorStatus(Status::STATUSTYPE_ERROR, "not supported"); ChannelArray::shared_pointer nullChannelArray; EXCEPTION_GUARD(channelArrayRequester->channelArrayConnect(errorStatus, nullChannelArray, - PVArray::shared_pointer())); + Array::const_shared_pointer())); return nullChannelArray; } @@ -527,7 +527,7 @@ CAChannelGet::CAChannelGet(CAChannel::shared_pointer const & _channel, void CAChannelGet::activate() { EXCEPTION_GUARD(channelGetRequester->channelGetConnect(Status::Ok, shared_from_this(), - pvStructure, bitSet)); + pvStructure->getStructure())); } @@ -852,17 +852,17 @@ void CAChannelGet::getDone(struct event_handler_args &args) std::cout << "no copy func implemented" << std::endl; } - EXCEPTION_GUARD(channelGetRequester->getDone(Status::Ok)); + EXCEPTION_GUARD(channelGetRequester->getDone(Status::Ok, shared_from_this(), pvStructure, bitSet)); } else { Status errorStatus(Status::STATUSTYPE_ERROR, String(ca_message(args.status))); - EXCEPTION_GUARD(channelGetRequester->getDone(errorStatus)); + EXCEPTION_GUARD(channelGetRequester->getDone(errorStatus, shared_from_this(), PVStructure::shared_pointer(), BitSet::shared_pointer())); } } -void CAChannelGet::get(bool lastRequest) +void CAChannelGet::get() { int result = ca_array_get_callback(getType, channel->getElementCount(), channel->getChannelID(), ca_get_handler, this); @@ -873,10 +873,10 @@ void CAChannelGet::get(bool lastRequest) else { Status errorStatus(Status::STATUSTYPE_ERROR, String(ca_message(result))); - EXCEPTION_GUARD(channelGetRequester->getDone(errorStatus)); + EXCEPTION_GUARD(channelGetRequester->getDone(errorStatus, shared_from_this(), PVStructure::shared_pointer(), BitSet::shared_pointer())); } - if (lastRequest) + if (lastRequestFlag) destroy(); } @@ -888,6 +888,12 @@ void CAChannelGet::cancel() // noop } +void CAChannelGet::lastRequest() +{ + // TODO sync !!! + lastRequestFlag = true; +} + /* --------------- epics::pvData::Destroyable --------------- */ @@ -955,7 +961,7 @@ CAChannelPut::CAChannelPut(CAChannel::shared_pointer const & _channel, void CAChannelPut::activate() { EXCEPTION_GUARD(channelPutRequester->channelPutConnect(Status::Ok, shared_from_this(), - pvStructure, bitSet)); + pvStructure->getStructure())); } @@ -1110,26 +1116,28 @@ void CAChannelPut::putDone(struct event_handler_args &args) { if (args.status == ECA_NORMAL) { - EXCEPTION_GUARD(channelPutRequester->putDone(Status::Ok)); + EXCEPTION_GUARD(channelPutRequester->putDone(Status::Ok, shared_from_this())); } else { Status errorStatus(Status::STATUSTYPE_ERROR, String(ca_message(args.status))); - EXCEPTION_GUARD(channelPutRequester->putDone(errorStatus)); + EXCEPTION_GUARD(channelPutRequester->putDone(errorStatus, shared_from_this())); } } -void CAChannelPut::put(bool lastRequest) +void CAChannelPut::put(PVStructure::shared_pointer const & pvPutStructure, + BitSet::shared_pointer const & /*putBitSet*/) { doPut putFunc = doPutFuncTable[channel->getNativeType()]; if (putFunc) { - int result = putFunc(channel, this, pvStructure); + // TODO now we always put all + int result = putFunc(channel, this, pvPutStructure); if (result != ECA_NORMAL) { Status errorStatus(Status::STATUSTYPE_ERROR, String(ca_message(result))); - EXCEPTION_GUARD(channelPutRequester->getDone(errorStatus)); + EXCEPTION_GUARD(channelPutRequester->putDone(errorStatus, shared_from_this())); } } else @@ -1139,7 +1147,7 @@ void CAChannelPut::put(bool lastRequest) } // TODO here???!!! - if (lastRequest) + if (lastRequestFlag) destroy(); } @@ -1157,13 +1165,18 @@ void CAChannelPut::getDone(struct event_handler_args &args) std::cout << "no copy func implemented" << std::endl; } - EXCEPTION_GUARD(channelPutRequester->getDone(Status::Ok)); + EXCEPTION_GUARD(channelPutRequester->getDone(Status::Ok, shared_from_this(), pvStructure, bitSet)); } else { Status errorStatus(Status::STATUSTYPE_ERROR, String(ca_message(args.status))); - EXCEPTION_GUARD(channelPutRequester->getDone(errorStatus)); + EXCEPTION_GUARD(channelPutRequester->getDone(errorStatus, shared_from_this(), + PVStructure::shared_pointer(), BitSet::shared_pointer())); } + + // TODO here???!!! + if (lastRequestFlag) + destroy(); } @@ -1178,7 +1191,8 @@ void CAChannelPut::get() else { Status errorStatus(Status::STATUSTYPE_ERROR, String(ca_message(result))); - EXCEPTION_GUARD(channelPutRequester->getDone(errorStatus)); + EXCEPTION_GUARD(channelPutRequester->getDone(errorStatus, shared_from_this(), + PVStructure::shared_pointer(), BitSet::shared_pointer())); } } @@ -1191,6 +1205,12 @@ void CAChannelPut::cancel() // noop } +void CAChannelPut::lastRequest() +{ + // TODO sync !!! + lastRequestFlag = true; +} + /* --------------- epics::pvData::Destroyable --------------- */ diff --git a/pvAccessApp/ca/caChannel.h b/pvAccessApp/ca/caChannel.h index ee8b845..511da8f 100644 --- a/pvAccessApp/ca/caChannel.h +++ b/pvAccessApp/ca/caChannel.h @@ -142,11 +142,12 @@ public: /* --------------- epics::pvAccess::ChannelGet --------------- */ - virtual void get(bool lastRequest); + virtual void get(); /* --------------- epics::pvData::ChannelRequest --------------- */ virtual void cancel(); + virtual void lastRequest(); /* --------------- epics::pvData::Destroyable --------------- */ @@ -170,6 +171,9 @@ private: epics::pvData::PVStructure::shared_pointer pvStructure; epics::pvData::BitSet::shared_pointer bitSet; + + // TODO AtomicBoolean !!! + bool lastRequestFlag; }; @@ -193,12 +197,16 @@ public: /* --------------- epics::pvAccess::ChannelPut --------------- */ - virtual void put(bool lastRequest); + virtual void put( + epics::pvData::PVStructure::shared_pointer const & pvPutStructure, + epics::pvData::BitSet::shared_pointer const & putBitSet + ); virtual void get(); /* --------------- epics::pvData::ChannelRequest --------------- */ virtual void cancel(); + virtual void lastRequest(); /* --------------- epics::pvData::Destroyable --------------- */ @@ -222,6 +230,9 @@ private: epics::pvData::PVStructure::shared_pointer pvStructure; epics::pvData::BitSet::shared_pointer bitSet; + + // TODO AtomicBoolean !!! + bool lastRequestFlag; };