/*ChannelAccessFactory.cpp*/ #include #include #include #include #include #include #include using namespace epics::pvData; namespace epics { namespace pvAccess { static ChannelAccess::shared_pointer channelAccess; static Mutex channelProviderMutex; typedef std::map ChannelProviderMap; static ChannelProviderMap channelProviders; class ChannelAccessImpl : public ChannelAccess { public: ChannelProvider::shared_pointer getProvider(String providerName) { Lock guard(channelProviderMutex); return channelProviders[providerName]; } std::auto_ptr getProviderNames() { Lock guard(channelProviderMutex); std::auto_ptr providers(new stringVector_t()); for (ChannelProviderMap::const_iterator i = channelProviders.begin(); i != channelProviders.end(); i++) providers->push_back(i->first); return providers; } }; ChannelAccess::shared_pointer getChannelAccess() { static Mutex mutex; Lock guard(mutex); if(channelAccess.get()==0){ channelAccess.reset(new ChannelAccessImpl()); } return channelAccess; } void registerChannelProvider(ChannelProvider::shared_pointer const & channelProvider) { Lock guard(channelProviderMutex); channelProviders[channelProvider->getProviderName()] = channelProvider; } void unregisterChannelProvider(ChannelProvider::shared_pointer const & channelProvider) { Lock guard(channelProviderMutex); channelProviders.erase(channelProvider->getProviderName()); } }}