diff --git a/documentation/Doxyfile b/documentation/Doxyfile index bd90873..9678158 100644 --- a/documentation/Doxyfile +++ b/documentation/Doxyfile @@ -767,6 +767,9 @@ WARN_LOGFILE = INPUT = ../src/client/pv \ ../src/client/pva \ + ../src/server/pv \ + ../src/rpcClient/pv \ + ../src/rpcService/pv \ ../src/utils/pv \ ../src/pva/pv \ . diff --git a/documentation/release_notes.h b/documentation/release_notes.h index 80a2e6a..bb47f7a 100644 --- a/documentation/release_notes.h +++ b/documentation/release_notes.h @@ -1,20 +1,63 @@ /** @page pvarelease_notes Release Notes -Release 6.x.x -============= +Release 6.0.0 (UNRELEASED) +========================== - Incompatible changes + - Requires pvDataCPP >=7.0.0 due to headers moved from pvDataCPP into this module: requester.h, destoryable.h, and monitor.h - Major changes to shared_ptr ownership rules for epics::pvAccess::ChannelProvider and associated classes. See - @ref providers - @ref providers_changes - Add new library pvAccessIOC for use with PVAClientRegister.dbd and PVAServerRegister.dbd. Necessary to avoid having pvAccess library depend on all IOC core libraries. + - Added new library pvAccessCA with "ca" provider. Main pvAccess library no longer depends on libca. + Applications needing the "ca" provider must link against pvAccessCA and pvAccess. + See examples/Makefile in the source tree. + The headers associated with this library are: caChannel.h, caProvider.h, and caStatus.h + - A number of headers which were previously installed, but considered "private", are no longer installed. + - epics::pvAccess::ChannelProviderRegistry may no longer be sub-classed. + - Removed access to singleton registry via getChannelProviderRegistry() and registerChannelProviderFactory() + in favor of epics::pvAccess::ChannelProviderRegistry::clients() and epics::pvAccess::ChannelProviderRegistry::servers(). + The "pva" and "ca" providers are registered with the clients() singleton. + epics::pvAccess::ServerContext() looks up names with the servers() singleton. + - Removed deprecated epics::pvAccess::Properties - Simplifications - use of the epics::pvAccess::ChannelRequester interface is optional and may be omitted when calling createChannel(). Channel state change notifications are deliviered to individual operations via epics::pvAccess::ChannelBaseRequester::channelDisconnect() + - Default implementions added for the following methods + - epics::pvAccess::Lockable::lock() and epics::pvAccess::Lockable::unlock() which do nothing. + - epics::pvAccess::Channel::getConnectionState() returns CONNECTED + - epics::pvAccess::Channel::isConnected() uses getConnectionState() + - epics::pvAccess::Channel::getField() which errors + - epics::pvAccess::Channel::getAccessRights() which returns rw + - Added epics::pvAccess::SimpleChannelProviderFactory template and + epics::pvAccess::ChannelProviderRegistry::add() avoids need for custom + factory. + - Added epics::pvAccess::MonitorElement::Ref iterator/smart-pointer + to ensure proper handling of calls Monitor::poll() and Monitor::release(). + - epics::pvAccess::PipelineMonitor "internal" is collapsed into epics::pvAccess::Monitor. + PipelineMonitor becomes a typedef for Monitor. + - epics::pvAccess::RPCService is now a sub-class of epics::pvAccess::RPCServiceAsync +- Additions + - pv/pvAccess.h now provides macros OVERRIDE and FINAL which conditionally expand to the c++11 keywords override and final. + - Deliver disconnect notifications to individual Operations (get/put/rpc/monitor/...) via + new epics::pvAccess::ChannelBaseRequester::channelDisconnect() + - New API for server creation via epics::pvAccess::ServerContext::create() allows direct specification + of configuration and ChannelProvider(s). + - Add epics::pvAccess::ServerContext::getCurrentConfig() to get actual configuration, eg. for use with a client. + - Classes from moved headers requester.h, destoryable.h, and monitor.h added to epics::pvAccess namespace. + Typedefs provided in epics::pvData namespace. + - Added Client API based on pvac::ClientProvider + - pv/pvaVersion.h defines VERSION_INT and PVACCESS_VERSION_INT + - epics::pvAccess::RPCClient may be directly constructed. + - epics::pvAccess::RPCServer allows epics::pvAccess::Configuration to be specified and access to ServerContext. + - Added epics::pvAccess::Configuration::keys() to iterate configuration parameters (excluding environment variables). + - Added epics::pvAccess::Destoryable::cleaner +- Deprecations + - epics::pvAccess::GUID in favor of epics::pvAccess::ServerGUID due to win32 name conflict. Release 5.0.0 (July 2016) ========================= @@ -123,7 +166,7 @@ It was thus (sometimes) necessary to explicitly call a destory() method to fully dispose of an Operation. Failure to do this resulted in a slow resource leak. -Beginning with 6.0.0 an Operation may not rely on user code to call a destory() method. +Beginning with 6.0.0 an Operation must not rely on user code to call a destory() method. @subsection providers_changes_store_port Porting diff --git a/examples/Makefile b/examples/Makefile index ad03187..5961f13 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -2,7 +2,7 @@ TOP=.. include $(TOP)/configure/CONFIG -PROD_LIBS += pvAccessCA pvAccess pvData ca Com +PROD_LIBS += pvAccessCA ca pvAccess pvData Com TESTPROD_HOST += getme TESTPROD_HOST += putme diff --git a/src/client/pv/monitor.h b/src/client/pv/monitor.h index 4e10bc8..2f6a2d5 100644 --- a/src/client/pv/monitor.h +++ b/src/client/pv/monitor.h @@ -61,35 +61,6 @@ public: InUse //!< data valid. Owned by MonitorRequester. Waiting for Monitor::release() } state; - /** A smart pointer to extract a MonitorElement from a Monitor queue - * - * To fetch a single element - @code - epics::pvAccess::Monitor::shared_pointer mon(....); - epics::pvAccess::MonitorElement::Ref elem(mon); - if(elem) { - // do something with element - assert(elem->pvStructurePtr->getSubField("foo")); - } else { - // queue was empty - } - @endcode - * To fetch all available elements (c++11) - @code - epics::pvAccess::Monitor::shared_pointer mon(....); - for(auto& elem : *mon) { - assert(elem.pvStructurePtr->getSubField("foo")); - } - @endcode - * To fetch all available elements (c++98) - @code - epics::pvAccess::Monitor::shared_pointer mon(....); - for(epics::pvAccess::MonitorElement::Ref it(mon); it; ++it) { - MonitorElement& elem(*it); - assert(elem.pvStructurePtr->getSubField("foo")); - } - @endcode - */ class Ref; }; @@ -145,6 +116,35 @@ class epicsShareClass Monitor : public virtual Destroyable{ virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements) {} }; +/** A smart pointer to extract a MonitorElement from a Monitor queue + * + * To fetch a single element + @code + epics::pvAccess::Monitor::shared_pointer mon(....); + epics::pvAccess::MonitorElement::Ref elem(mon); + if(elem) { + // do something with element + assert(elem->pvStructurePtr->getSubField("foo")); + } else { + // queue was empty + } + @endcode + * To fetch all available elements (c++11) + @code + epics::pvAccess::Monitor::shared_pointer mon(....); + for(auto& elem : *mon) { + assert(elem.pvStructurePtr->getSubField("foo")); + } + @endcode + * To fetch all available elements (c++98) + @code + epics::pvAccess::Monitor::shared_pointer mon(....); + for(epics::pvAccess::MonitorElement::Ref it(mon); it; ++it) { + MonitorElement& elem(*it); + assert(elem.pvStructurePtr->getSubField("foo")); + } + @endcode + */ class MonitorElement::Ref { Monitor* mon; diff --git a/src/rpcService/pv/rpcServer.h b/src/rpcService/pv/rpcServer.h index 6f520fa..46f24e1 100644 --- a/src/rpcService/pv/rpcServer.h +++ b/src/rpcService/pv/rpcServer.h @@ -31,6 +31,7 @@ namespace pvAccess { class ServerContext; class RPCChannelProvider; +//! Serves (only) RPCServiceAsync and RPCService instances. class epicsShareClass RPCServer : public std::tr1::enable_shared_from_this { diff --git a/src/server/pv/serverContext.h b/src/server/pv/serverContext.h index a8d0184..6f7ea1d 100644 --- a/src/server/pv/serverContext.h +++ b/src/server/pv/serverContext.h @@ -102,14 +102,18 @@ public: */ virtual void setBeaconServerStatusProvider(BeaconServerStatusProvider::shared_pointer const & beaconServerStatusProvider) = 0; + //! Options for a server insatnce class Config { friend class ServerContext; Configuration::const_shared_pointer _conf; std::vector _providers; public: Config() {} + //! Use specific configuration. Default is process environment Config& config(const Configuration::const_shared_pointer& c) { _conf = c; return *this; } + //! Attach many providers. Config& providers(const std::vector& p) { _providers = p; return *this; } + //! short hand for providers() with a length 1 vector. Config& provider(const ChannelProvider::shared_pointer& p) { _providers.push_back(p); return *this; } }; diff --git a/src/utils/pv/destroyable.h b/src/utils/pv/destroyable.h index 274a737..f9afc47 100644 --- a/src/utils/pv/destroyable.h +++ b/src/utils/pv/destroyable.h @@ -20,8 +20,6 @@ namespace epics { namespace pvAccess { /** * @brief Instance declaring destroy method. - * - * @author mse */ class epicsShareClass Destroyable { public: @@ -32,10 +30,7 @@ namespace epics { namespace pvAccess { virtual void destroy() = 0; protected: - /** - * Do not allow delete on this instance and derived classes, destroy() must be used instead. - */ - virtual ~Destroyable() {}; + virtual ~Destroyable() {} public: /** for use with shared_ptr<> when wrapping @@ -44,6 +39,10 @@ namespace epics { namespace pvAccess { shared_ptr inner(new foo), outer(inner.get, Destroyable::cleaner(inner)); @endcode + + @warning Do not use this trick in combination with enable_shared_from_this + as it is _undefined_ whether the hidden weak_ptr will be the original + or wrapped reference. */ class cleaner { Destroyable::shared_pointer ptr;