address issue #33

This commit is contained in:
mrkraimer
2018-05-19 10:11:48 -04:00
parent bbb5fa2c64
commit 87ccf78a9b
4 changed files with 9 additions and 84 deletions

View File

@ -39,60 +39,18 @@
#include <pv/pvDatabase.h>
namespace epics { namespace pvDatabase {
class MonitorFactory;
typedef std::tr1::shared_ptr<MonitorFactory> MonitorFactoryPtr;
class MonitorLocal;
typedef std::tr1::shared_ptr<MonitorLocal> MonitorLocalPtr;
class ChannelProviderLocal;
typedef std::tr1::shared_ptr<ChannelProviderLocal> ChannelProviderLocalPtr;
class ChannelLocal;
typedef std::tr1::shared_ptr<ChannelLocal> ChannelLocalPtr;
epicsShareFunc MonitorFactoryPtr getMonitorFactory();
/**
* @brief MonitorFactory
*
* This class provides a static method to create a monitor for a PVRecord
*/
class epicsShareClass MonitorFactory
{
public:
POINTER_DEFINITIONS(MonitorFactory);
/**
* @brief Destructor
*/
virtual ~MonitorFactory();
/**
* @brief Create a monitor on a record.
*
* This is called by the local channel provider.
* @param pvRecord The record to monitor.
* @param monitorRequester The client callback.
* @param pvRequest Options specified by the client.
* This includes the subset of the fields in the record to monitor.
* @return A shared pointer to the newly created monitor.
* If the monitor can not be created a null monitor is returned.
* This means the pvRequest specified options that could not be satisfied.
*/
epics::pvData::MonitorPtr createMonitor(
PVRecordPtr const & pvRecord,
epics::pvData::MonitorRequester::shared_pointer const & monitorRequester,
epics::pvData::PVStructurePtr const & pvRequest);
private:
MonitorFactory();
friend class MonitorLocal;
friend epicsShareFunc MonitorFactoryPtr getMonitorFactory();
epics::pvData::Mutex mutex;
};
epicsShareFunc epics::pvData::MonitorPtr createMonitorLocal(
PVRecordPtr const & pvRecord,
epics::pvData::MonitorRequester::shared_pointer const & monitorRequester,
epics::pvData::PVStructurePtr const & pvRequest);
epicsShareFunc ChannelProviderLocalPtr getChannelProviderLocal();
@ -208,7 +166,6 @@ public:
private:
friend epicsShareFunc ChannelProviderLocalPtr getChannelProviderLocal();
PVDatabasePtr pvDatabase;
epics::pvData::Mutex mutex;
int traceLevel;
friend class ChannelProviderLocalRun;
};

View File

@ -1371,8 +1371,7 @@ Monitor::shared_pointer ChannelLocal::createMonitor(
<< endl;
}
MonitorPtr monitor =
getMonitorFactory()->createMonitor(
MonitorPtr monitor = createMonitorLocal(
pvRecord,
monitorRequester,
pvRequest);

View File

@ -103,7 +103,6 @@ ChannelFind::shared_pointer ChannelProviderLocal::channelFind(
if(traceLevel>1) {
cout << "ChannelProviderLocal::channelFind " << "channelName" << endl;
}
Lock xx(mutex);
PVRecordPtr pvRecord = pvDatabase->findRecord(channelName);
if(pvRecord) {
channelFindRequester->channelFindResult(
@ -127,12 +126,7 @@ ChannelFind::shared_pointer ChannelProviderLocal::channelList(
if(traceLevel>1) {
cout << "ChannelProviderLocal::channelList\n";
}
PVStringArrayPtr records;
{
Lock guard(mutex);
records = pvDatabase->getRecordNames();
}
PVStringArrayPtr records(pvDatabase->getRecordNames());
channelListRequester->channelListResult(Status::Ok, shared_from_this(), records->view(), false);
return shared_from_this();
}
@ -145,7 +139,6 @@ Channel::shared_pointer ChannelProviderLocal::createChannel(
if(traceLevel>1) {
cout << "ChannelProviderLocal::createChannel " << "channelName" << endl;
}
Lock xx(mutex);
PVRecordPtr pvRecord = pvDatabase->findRecord(channelName);
if(pvRecord) {
ChannelLocalPtr channel(new ChannelLocal(

View File

@ -29,6 +29,8 @@ using std::string;
namespace epics { namespace pvDatabase {
class MonitorLocal;
typedef std::tr1::shared_ptr<MonitorLocal> MonitorLocalPtr;
static MonitorPtr nullMonitor;
static MonitorElementPtr NULLMonitorElement;
@ -445,22 +447,11 @@ bool MonitorLocal::init(PVStructurePtr const & pvRequest)
return true;
}
MonitorFactory::MonitorFactory()
{
}
MonitorFactory::~MonitorFactory()
{
}
MonitorPtr MonitorFactory::createMonitor(
MonitorPtr createMonitorLocal(
PVRecordPtr const & pvRecord,
MonitorRequester::shared_pointer const & monitorRequester,
PVStructurePtr const & pvRequest)
{
Lock xx(mutex);
MonitorLocalPtr monitor(new MonitorLocal(
monitorRequester,pvRecord));
bool result = monitor->init(pvRequest);
@ -478,19 +469,4 @@ MonitorPtr MonitorFactory::createMonitor(
return monitor;
}
MonitorFactoryPtr getMonitorFactory()
{
static MonitorFactoryPtr monitorFactoryPtr;
static Mutex mutex;
Lock xx(mutex);
if(!monitorFactoryPtr) {
monitorFactoryPtr = MonitorFactoryPtr(
new MonitorFactory());
}
return monitorFactoryPtr;
}
}}