channelArray, trace implemented. Known memory leaks and exceptions fixed.

This commit is contained in:
Marty Kraimer
2013-06-27 10:38:05 -04:00
parent db4e10e393
commit 255f58aeb8
22 changed files with 1979 additions and 692 deletions

View File

@@ -11,7 +11,7 @@
#include <pv/serverContext.h>
#include <pv/channelProviderLocal.h>
#include <pv/channelLocalTraceRecord.h>
#include <pv/traceRecord.h>
namespace epics { namespace pvDatabase {
@@ -71,40 +71,19 @@ ChannelProviderLocalPtr getChannelProviderLocal()
ChannelProviderLocal::ChannelProviderLocal()
: pvDatabase(PVDatabase::getMaster()),
beingDestroyed(false),
channelLocalTrace(new ChannelLocalTrace())
beingDestroyed(false)
{
}
ChannelProviderLocal::~ChannelProviderLocal()
{
// if(channelLocalTrace->getLevel()>0)
{
cout << "~ChannelProviderLocal()" << endl;
}
}
void ChannelProviderLocal::destroy()
{
Lock xx(mutex);
if(channelLocalTrace->getLevel()>0)
{
cout << "ChannelProviderLocal::destroy";
cout << " destroyed " << beingDestroyed << endl;
}
if(beingDestroyed) return;
beingDestroyed = true;
ChannelLocalList::iterator iter;
while(true) {
iter = channelList.begin();
if(iter==channelList.end()) break;
if(channelLocalTrace->getLevel()>0)
{
cout << "ChannelProviderLocal destroying channel " << (*iter).get();
cout << " channelName " << (*iter)->getChannelName() << endl;
}
(*iter)->destroy();
}
pvDatabase->destroy();
}
@@ -118,25 +97,6 @@ ChannelFind::shared_pointer ChannelProviderLocal::channelFind(
ChannelFindRequester::shared_pointer const &channelFindRequester)
{
Lock xx(mutex);
if(channelLocalTrace->getLevel()>2)
{
cout << "ChannelProviderLocal::channelFind" << endl;
}
bool found = false;
ChannelLocalList::iterator iter;
for(iter = channelList.begin(); iter!=channelList.end(); ++iter)
{
if((*iter)->getChannelName().compare(channelName)==0) {
found = true;
break;
}
}
if(found) {
channelFindRequester->channelFindResult(
Status::Ok,
ChannelFind::shared_pointer(),
true);
}
PVRecordPtr pvRecord = pvDatabase->findRecord(channelName);
if(pvRecord.get()!=NULL) {
channelFindRequester->channelFindResult(
@@ -172,17 +132,11 @@ Channel::shared_pointer ChannelProviderLocal::createChannel(
PVRecordPtr pvRecord = pvDatabase->findRecord(channelName);
if(pvRecord.get()!=NULL) {
ChannelLocalPtr channel(new ChannelLocal(
getPtrSelf(),channelRequester,pvRecord,channelLocalTrace));
getPtrSelf(),channelRequester,pvRecord));
channelRequester->channelCreated(
Status::Ok,
channel);
if(channelLocalTrace->getLevel()>1)
{
cout << "ChannelProviderLocal::createChannel " << channel.get();
cout << " channelName " << channelName << endl;
}
pvRecord->addPVRecordClient(channel);
channelList.insert(channel);
return channel;
}
Status notFoundStatus(Status::STATUSTYPE_ERROR,String("pv not found"));
@@ -192,41 +146,4 @@ Channel::shared_pointer ChannelProviderLocal::createChannel(
return Channel::shared_pointer();
}
void ChannelProviderLocal::removeChannel(
Channel::shared_pointer const & channel)
{
Lock xx(mutex);
if(channelLocalTrace->getLevel()>0)
{
cout << "ChannelProviderLocal::removeChannel " << channel.get();
cout << " destroyed " << beingDestroyed << endl;
}
if(beingDestroyed) return;
ChannelLocalList::iterator iter;
for(iter = channelList.begin(); iter!=channelList.end(); ++iter)
{
if((*iter).get()==channel.get()) {
if(channelLocalTrace->getLevel()>1)
{
cout << "ChannelProviderLocal::removeChannel " << (*iter).get();
cout << " channelName " << channel->getChannelName() << endl;
}
channelList.erase(iter);
return;
}
}
}
void ChannelProviderLocal::createChannelLocalTraceRecord(
String const &recordName)
{
ChannelLocalTraceRecordPtr pvRecord
= ChannelLocalTraceRecord::create(channelLocalTrace,recordName);
PVDatabasePtr master = PVDatabase::getMaster();
bool result = master->addRecord(pvRecord);
if(!result) {
cout << "result of addRecord " << recordName << " " << result << endl;
}
}
}}