ChannelAccessFactory implemented and tested

This commit is contained in:
Matej Sekoranja
2010-11-03 16:07:20 +01:00
parent 9edc459254
commit 620f0f0681
6 changed files with 566 additions and 398 deletions

View File

@@ -1,24 +1,61 @@
/*ChannelAccessFactory.cpp*/
#include <lock.h>
#include <noDefaultMethods.h>
#include "pvAccess.h"
#include "pvData.h"
#include "factory.h"
#include <map>
#include <vector>
namespace epics { namespace pvAccess {
static ChannelAccess* channelAccess = 0;
static Mutex channelProviderMutex = Mutex();
ChannelAccess * getChannelAccess() {
static Mutex mutex = Mutex();
Lock guard(&mutex);
typedef std::map<String, ChannelProvider*> ChannelProviderMap;
static ChannelProviderMap channelProviders;
if(channelAccess==0){
//channelAccess = new ChannelAccessImpl();
}
return channelAccess;
}
class ChannelAccessImpl : public ChannelAccess, public NoDefaultMethods {
public:
ChannelProvider* getProvider(String providerName) {
Lock guard(&channelProviderMutex);
return channelProviders[providerName];
}
std::vector<String>* getProviderNames() {
Lock guard(&channelProviderMutex);
std::vector<String>* providers = new std::vector<String>();
for (ChannelProviderMap::const_iterator i = channelProviders.begin();
i != channelProviders.end(); i++)
providers->push_back(i->first);
return providers;
}
};
ChannelAccess * getChannelAccess() {
static Mutex mutex = Mutex();
Lock guard(&mutex);
if(channelAccess==0){
channelAccess = new ChannelAccessImpl();
}
return channelAccess;
}
void registerChannelProvider(ChannelProvider *channelProvider) {
Lock guard(&channelProviderMutex);
channelProviders[channelProvider->getProviderName()] = channelProvider;
}
void unregisterChannelProvider(ChannelProvider *channelProvider) {
Lock guard(&channelProviderMutex);
channelProviders.erase(channelProvider->getProviderName());
}
}}