update release notes
This commit is contained in:
@ -767,6 +767,9 @@ WARN_LOGFILE =
|
|||||||
|
|
||||||
INPUT = ../src/client/pv \
|
INPUT = ../src/client/pv \
|
||||||
../src/client/pva \
|
../src/client/pva \
|
||||||
|
../src/server/pv \
|
||||||
|
../src/rpcClient/pv \
|
||||||
|
../src/rpcService/pv \
|
||||||
../src/utils/pv \
|
../src/utils/pv \
|
||||||
../src/pva/pv \
|
../src/pva/pv \
|
||||||
.
|
.
|
||||||
|
@ -1,20 +1,63 @@
|
|||||||
/** @page pvarelease_notes Release Notes
|
/** @page pvarelease_notes Release Notes
|
||||||
|
|
||||||
Release 6.x.x
|
Release 6.0.0 (UNRELEASED)
|
||||||
=============
|
==========================
|
||||||
|
|
||||||
- Incompatible changes
|
- 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
|
- Major changes to shared_ptr ownership rules for epics::pvAccess::ChannelProvider and
|
||||||
associated classes. See
|
associated classes. See
|
||||||
- @ref providers
|
- @ref providers
|
||||||
- @ref providers_changes
|
- @ref providers_changes
|
||||||
- Add new library pvAccessIOC for use with PVAClientRegister.dbd and PVAServerRegister.dbd.
|
- Add new library pvAccessIOC for use with PVAClientRegister.dbd and PVAServerRegister.dbd.
|
||||||
Necessary to avoid having pvAccess library depend on all IOC core libraries.
|
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
|
- Simplifications
|
||||||
- use of the epics::pvAccess::ChannelRequester interface is optional
|
- use of the epics::pvAccess::ChannelRequester interface is optional
|
||||||
and may be omitted when calling createChannel().
|
and may be omitted when calling createChannel().
|
||||||
Channel state change notifications are deliviered
|
Channel state change notifications are deliviered
|
||||||
to individual operations via epics::pvAccess::ChannelBaseRequester::channelDisconnect()
|
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)
|
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.
|
to fully dispose of an Operation.
|
||||||
Failure to do this resulted in a slow resource leak.
|
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
|
@subsection providers_changes_store_port Porting
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ TOP=..
|
|||||||
|
|
||||||
include $(TOP)/configure/CONFIG
|
include $(TOP)/configure/CONFIG
|
||||||
|
|
||||||
PROD_LIBS += pvAccessCA pvAccess pvData ca Com
|
PROD_LIBS += pvAccessCA ca pvAccess pvData Com
|
||||||
|
|
||||||
TESTPROD_HOST += getme
|
TESTPROD_HOST += getme
|
||||||
TESTPROD_HOST += putme
|
TESTPROD_HOST += putme
|
||||||
|
@ -61,35 +61,6 @@ public:
|
|||||||
InUse //!< data valid. Owned by MonitorRequester. Waiting for Monitor::release()
|
InUse //!< data valid. Owned by MonitorRequester. Waiting for Monitor::release()
|
||||||
} state;
|
} 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;
|
class Ref;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -145,6 +116,35 @@ class epicsShareClass Monitor : public virtual Destroyable{
|
|||||||
virtual void reportRemoteQueueStatus(epics::pvData::int32 freeElements) {}
|
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
|
class MonitorElement::Ref
|
||||||
{
|
{
|
||||||
Monitor* mon;
|
Monitor* mon;
|
||||||
|
@ -31,6 +31,7 @@ namespace pvAccess {
|
|||||||
class ServerContext;
|
class ServerContext;
|
||||||
class RPCChannelProvider;
|
class RPCChannelProvider;
|
||||||
|
|
||||||
|
//! Serves (only) RPCServiceAsync and RPCService instances.
|
||||||
class epicsShareClass RPCServer :
|
class epicsShareClass RPCServer :
|
||||||
public std::tr1::enable_shared_from_this<RPCServer>
|
public std::tr1::enable_shared_from_this<RPCServer>
|
||||||
{
|
{
|
||||||
|
@ -102,14 +102,18 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void setBeaconServerStatusProvider(BeaconServerStatusProvider::shared_pointer const & beaconServerStatusProvider) = 0;
|
virtual void setBeaconServerStatusProvider(BeaconServerStatusProvider::shared_pointer const & beaconServerStatusProvider) = 0;
|
||||||
|
|
||||||
|
//! Options for a server insatnce
|
||||||
class Config {
|
class Config {
|
||||||
friend class ServerContext;
|
friend class ServerContext;
|
||||||
Configuration::const_shared_pointer _conf;
|
Configuration::const_shared_pointer _conf;
|
||||||
std::vector<ChannelProvider::shared_pointer> _providers;
|
std::vector<ChannelProvider::shared_pointer> _providers;
|
||||||
public:
|
public:
|
||||||
Config() {}
|
Config() {}
|
||||||
|
//! Use specific configuration. Default is process environment
|
||||||
Config& config(const Configuration::const_shared_pointer& c) { _conf = c; return *this; }
|
Config& config(const Configuration::const_shared_pointer& c) { _conf = c; return *this; }
|
||||||
|
//! Attach many providers.
|
||||||
Config& providers(const std::vector<ChannelProvider::shared_pointer>& p) { _providers = p; return *this; }
|
Config& providers(const std::vector<ChannelProvider::shared_pointer>& 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; }
|
Config& provider(const ChannelProvider::shared_pointer& p) { _providers.push_back(p); return *this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,8 +20,6 @@ namespace epics { namespace pvAccess {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Instance declaring destroy method.
|
* @brief Instance declaring destroy method.
|
||||||
*
|
|
||||||
* @author mse
|
|
||||||
*/
|
*/
|
||||||
class epicsShareClass Destroyable {
|
class epicsShareClass Destroyable {
|
||||||
public:
|
public:
|
||||||
@ -32,10 +30,7 @@ namespace epics { namespace pvAccess {
|
|||||||
virtual void destroy() = 0;
|
virtual void destroy() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
virtual ~Destroyable() {}
|
||||||
* Do not allow delete on this instance and derived classes, destroy() must be used instead.
|
|
||||||
*/
|
|
||||||
virtual ~Destroyable() {};
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** for use with shared_ptr<> when wrapping
|
/** for use with shared_ptr<> when wrapping
|
||||||
@ -44,6 +39,10 @@ namespace epics { namespace pvAccess {
|
|||||||
shared_ptr<foo> inner(new foo),
|
shared_ptr<foo> inner(new foo),
|
||||||
outer(inner.get, Destroyable::cleaner(inner));
|
outer(inner.get, Destroyable::cleaner(inner));
|
||||||
@endcode
|
@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 {
|
class cleaner {
|
||||||
Destroyable::shared_pointer ptr;
|
Destroyable::shared_pointer ptr;
|
||||||
|
Reference in New Issue
Block a user