diff --git a/p2pApp/chancache.cpp b/p2pApp/chancache.cpp index 447d785..fda56ab 100644 --- a/p2pApp/chancache.cpp +++ b/p2pApp/chancache.cpp @@ -149,27 +149,3 @@ ChannelCache::~ChannelCache() timerQueue->release(); delete cleaner; } - -// caller must host cacheLock -ChannelCacheEntry::shared_pointer -ChannelCache::get(const std::string& name) -{ - entries_t::const_iterator it=entries.find(name); - if(it!=entries.end()) { - it->second->dropPoke = true; - return it->second; - } - - ChannelCacheEntry::shared_pointer ent(new ChannelCacheEntry(this, name)); - - std::cout<<"Create client channel for '"<channel = provider->createChannel(name, req); - if(!ent->channel) - THROW_EXCEPTION2(std::runtime_error, "Failed to createChannel"); - assert(ent->channel->getChannelRequester().get()==req.get()); - - entries[name] = ent; - assert(entries.size()>0); - return ent; -} diff --git a/p2pApp/chancache.h b/p2pApp/chancache.h index 98ac0eb..0f4612c 100644 --- a/p2pApp/chancache.h +++ b/p2pApp/chancache.h @@ -154,10 +154,6 @@ struct ChannelCache ChannelCache(); ~ChannelCache(); - - // caller must host cacheLock - ChannelCacheEntry::shared_pointer get(const std::string& name); - }; #endif // CHANCACHE_H diff --git a/p2pApp/server.cpp b/p2pApp/server.cpp index c8e1b6a..00feeba 100644 --- a/p2pApp/server.cpp +++ b/p2pApp/server.cpp @@ -68,11 +68,24 @@ struct GWServerChannelProvider : public if(it==cache.entries.end()) { // first request, create ChannelCacheEntry //TODO: async lookup - cache.get(newName); - assert(cache.entries.size()>0); + ChannelCacheEntry::shared_pointer ent(new ChannelCacheEntry(&cache, newName)); - } else if(it->second->channel->isConnected()) { + cache.entries[newName] = ent; + + pva::Channel::shared_pointer M; + { + // unlock to call createChannel() + epicsGuardRelease U(G); + + pva::ChannelRequester::shared_pointer req(new ChannelCacheEntry::CRequester(ent)); + M = cache.provider->createChannel(newName, req); + if(!M) + THROW_EXCEPTION2(std::runtime_error, "Failed to createChannel"); + } + ent->channel = M; + + } else if(it->second->channel && it->second->channel->isConnected()) { // another request, and hey we're connected this time ret=this->shared_from_this(); @@ -127,7 +140,8 @@ struct GWServerChannelProvider : public Guard G(cache.cacheLock); ChannelCache::entries_t::const_iterator it = cache.entries.find(newName); - if(it!=cache.entries.end() && it->second->channel->isConnected()) + if(it!=cache.entries.end() && it->second->channel + && it->second->channel->isConnected()) { ret.reset(new GWChannel(it->second, channelRequester)); it->second->interested.insert(ret);