diff --git a/p2pApp/chancache.h b/p2pApp/chancache.h index fdbfb5d..29dfee4 100644 --- a/p2pApp/chancache.h +++ b/p2pApp/chancache.h @@ -65,6 +65,7 @@ struct MonitorUser : public epics::pvData::Monitor MonitorCacheEntry::shared_pointer entry; epics::pvData::MonitorRequester::weak_pointer req; + std::tr1::weak_ptr srvchan; // guards queues and member variables epicsMutex queueLock; diff --git a/p2pApp/channel.cpp b/p2pApp/channel.cpp index 442e78e..804359d 100644 --- a/p2pApp/channel.cpp +++ b/p2pApp/channel.cpp @@ -12,9 +12,11 @@ namespace pvd = epics::pvData; size_t GWChannel::num_instances; GWChannel::GWChannel(ChannelCacheEntry::shared_pointer e, - pva::ChannelRequester::shared_pointer r) + pva::ChannelRequester::shared_pointer r, + std::string addr) :entry(e) ,requester(r) + ,address(addr) { epicsAtomicIncrSizeT(&num_instances); } @@ -195,6 +197,7 @@ GWChannel::createMonitor( mon.reset(new MonitorUser(ment)); ment->interested.insert(mon); mon->weakref = mon; + mon->srvchan = shared_pointer(weakref); mon->req = monitorRequester; typedesc = ment->typedesc; diff --git a/p2pApp/channel.h b/p2pApp/channel.h index 8f8aeed..d28d099 100644 --- a/p2pApp/channel.h +++ b/p2pApp/channel.h @@ -11,11 +11,13 @@ struct GWChannel : public epics::pvAccess::Channel static size_t num_instances; weak_pointer weakref; - ChannelCacheEntry::shared_pointer entry; - epics::pvAccess::ChannelRequester::shared_pointer requester; + const ChannelCacheEntry::shared_pointer entry; + const epics::pvAccess::ChannelRequester::shared_pointer requester; + const std::string address; // address of client on GW server side GWChannel(ChannelCacheEntry::shared_pointer e, - epics::pvAccess::ChannelRequester::shared_pointer); + epics::pvAccess::ChannelRequester::shared_pointer, + std::string addr); virtual ~GWChannel(); diff --git a/p2pApp/server.cpp b/p2pApp/server.cpp index ba6ae4f..9de1e1c 100644 --- a/p2pApp/server.cpp +++ b/p2pApp/server.cpp @@ -143,7 +143,7 @@ struct GWServerChannelProvider : public if(it!=cache.entries.end() && it->second->channel && it->second->channel->isConnected()) { - ret.reset(new GWChannel(it->second, channelRequester)); + ret.reset(new GWChannel(it->second, channelRequester, address)); it->second->interested.insert(ret); ret->weakref = ret; } @@ -383,6 +383,7 @@ void statusServer(int lvl, const char *chanexpr) MonitorUser& MU = **it3; size_t nempty, nfilled, nused, total; + std::string remote; bool isrunning; { Guard G(MU.queueLock); @@ -391,10 +392,18 @@ void statusServer(int lvl, const char *chanexpr) nfilled = MU.filled.size(); nused = MU.inuse.size(); isrunning = MU.running; + + GWChannel::shared_pointer srvchan(MU.srvchan.lock()); + if(srvchan) + remote = srvchan->address; + else + remote = ""; } total = nempty + nfilled + nused; - std::cout<<" Server monitor"<<(isrunning?"":" Paused") + std::cout<<" Server monitor from " + <