/*ChannelAccessFactory.cpp*/ #include #include #include "pvAccess.h" #include "pvData.h" #include "factory.h" #include #include namespace epics { namespace pvAccess { static ChannelAccess* channelAccess = 0; static Mutex channelProviderMutex = Mutex(); typedef std::map ChannelProviderMap; static ChannelProviderMap channelProviders; class ChannelAccessImpl : public ChannelAccess, public NoDefaultMethods { public: ChannelProvider* getProvider(String providerName) { Lock guard(&channelProviderMutex); return channelProviders[providerName]; } std::vector* getProviderNames() { Lock guard(&channelProviderMutex); std::vector* providers = new std::vector(); 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()); } }}