00001 #include <map> 00002 00003 #include <boost/thread.hpp> 00004 #include <boost/shared_ptr.hpp> 00005 #include <boost/weak_ptr.hpp> 00006 00007 #include "GeneratorInterface/ThePEGInterface/interface/Proxy.h" 00008 00009 using namespace ThePEG; 00010 00011 static boost::mutex mutex; 00012 00013 typedef std::map<ProxyBase::ProxyID, boost::weak_ptr<ProxyBase> > ProxyMap; 00014 00015 static ProxyMap *getProxyMapInstance() 00016 { 00017 static struct Sentinel { 00018 Sentinel() : instance(new ProxyMap) {} 00019 ~Sentinel() { delete instance; instance = 0; } 00020 00021 ProxyMap *instance; 00022 } sentinel; 00023 00024 return sentinel.instance; 00025 } 00026 00027 ProxyBase::ProxyBase(ProxyID id) : 00028 id(id) 00029 { 00030 } 00031 00032 ProxyBase::~ProxyBase() 00033 { 00034 boost::mutex::scoped_lock scoped_lock(mutex); 00035 00036 ProxyMap *map = getProxyMapInstance(); 00037 if (map) 00038 map->erase(id); 00039 } 00040 00041 boost::shared_ptr<ProxyBase> ProxyBase::create(ctor_t ctor) 00042 { 00043 static ProxyBase::ProxyID nextProxyID = 0; 00044 00045 boost::mutex::scoped_lock scoped_lock(mutex); 00046 00047 boost::shared_ptr<ProxyBase> proxy(ctor(++nextProxyID)); 00048 00049 ProxyMap *map = getProxyMapInstance(); 00050 if (map) 00051 map->insert(ProxyMap::value_type(proxy->getID(), proxy)); 00052 00053 return proxy; 00054 } 00055 00056 boost::shared_ptr<ProxyBase> ProxyBase::find(ProxyID id) 00057 { 00058 boost::mutex::scoped_lock scoped_lock(mutex); 00059 00060 ProxyMap *map = getProxyMapInstance(); 00061 if (!map) 00062 return boost::shared_ptr<ProxyBase>(); 00063 00064 ProxyMap::const_iterator pos = map->find(id); 00065 if (pos == map->end()) 00066 return boost::shared_ptr<ProxyBase>(); 00067 00068 return boost::shared_ptr<ProxyBase>(pos->second); 00069 }