This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::TransportRegistry Class Reference

#include "transportRegistry.h"

Classes

class  Reservation
 

Public Types

typedef std::vector< Transport::shared_pointer > transportVector_t
 

Public Member Functions

 POINTER_DEFINITIONS (TransportRegistry)
 
 TransportRegistry ()
 
 ~TransportRegistry ()
 
Transport::shared_pointer get (const osiSockAddr &address, epics::pvData::int16 prio)
 
void install (const Transport::shared_pointer &ptr)
 
Transport::shared_pointer remove (Transport::shared_pointer const &transport)
 
void clear ()
 
size_t size ()
 
void toArray (transportVector_t &transportArray, const osiSockAddr *dest=0)
 

Detailed Description

Definition at line 38 of file transportRegistry.h.

Member Typedef Documentation

typedef std::vector<Transport::shared_pointer> epics::pvAccess::TransportRegistry::transportVector_t

Definition at line 55 of file transportRegistry.h.

Constructor & Destructor Documentation

epics::pvAccess::TransportRegistry::TransportRegistry ( )
inline

Definition at line 68 of file transportRegistry.h.

68 {}
epics::pvAccess::TransportRegistry::~TransportRegistry ( )

Definition at line 71 of file transportRegistry.cpp.

72 {
73  pvd::Lock G(_mutex);
74  if(!transports.empty())
75  LOG(logLevelWarn, "TransportRegistry destroyed while not empty");
76 }
A lock for multithreading.
Definition: lock.h:36
#define LOG(level, format,...)
Definition: logger.h:48

Member Function Documentation

void epics::pvAccess::TransportRegistry::clear ( )

Definition at line 119 of file transportRegistry.cpp.

120 {
121  transports_t temp;
122  {
123  pvd::Lock guard(_mutex);
124  transports.swap(temp);
125  }
126 
127  if(temp.empty())
128  return;
129 
130  LOG(logLevelDebug, "Context still has %zu transport(s) active and closing...", temp.size());
131 
132  for(transports_t::iterator it(temp.begin()), end(temp.end());
133  it != end; ++it)
134  {
135  it->second->close();
136  }
137 
138  for(transports_t::iterator it(temp.begin()), end(temp.end());
139  it != end; ++it)
140  {
141  const Transport::shared_pointer& transport = it->second;
142  transport->waitJoin();
143  LEAK_CHECK(transport, "tcp transport")
144  if(!transport.unique()) {
145  LOG(logLevelError, "Closed transport %s still has use_count=%u",
146  transport->getRemoteName().c_str(),
147  (unsigned)transport.use_count());
148  }
149  }
150 }
A lock for multithreading.
Definition: lock.h:36
#define LOG(level, format,...)
Definition: logger.h:48
#define LEAK_CHECK(PTR, NAME)
if(yy_init)
Definition: scan.c:972
Transport::shared_pointer epics::pvAccess::TransportRegistry::get ( const osiSockAddr address,
epics::pvData::int16  prio 
)

Definition at line 78 of file transportRegistry.cpp.

79 {
80  const Key key(address, prio);
81 
82  pvd::Lock G(_mutex);
83 
84  transports_t::iterator it(transports.find(key));
85  if(it!=transports.end()) {
86  return it->second;
87  }
88  return Transport::shared_pointer();
89 }
A lock for multithreading.
Definition: lock.h:36
void epics::pvAccess::TransportRegistry::install ( const Transport::shared_pointer &  ptr)

Definition at line 91 of file transportRegistry.cpp.

92 {
93  const Key key(ptr->getRemoteAddress(), ptr->getPriority());
94 
95  pvd::Lock G(_mutex);
96 
97  std::pair<transports_t::iterator, bool> itpair(transports.insert(std::make_pair(key, ptr)));
98  if(!itpair.second)
99  THROW_EXCEPTION2(std::logic_error, "Refuse to insert dup");
100 }
#define THROW_EXCEPTION2(TYPE, MSG)
A lock for multithreading.
Definition: lock.h:36
epics::pvAccess::TransportRegistry::POINTER_DEFINITIONS ( TransportRegistry  )
Transport::shared_pointer epics::pvAccess::TransportRegistry::remove ( Transport::shared_pointer const &  transport)

Definition at line 102 of file transportRegistry.cpp.

103 {
104  assert(!!transport);
105  const Key key(transport->getRemoteAddress(), transport->getPriority());
106  Transport::shared_pointer ret;
107 
108  pvd::Lock guard(_mutex);
109  transports_t::iterator it(transports.find(key));
110  if(it!=transports.end()) {
111  ret.swap(it->second);
112  transports.erase(it);
113  }
114  return ret;
115 }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
A lock for multithreading.
Definition: lock.h:36
size_t epics::pvAccess::TransportRegistry::size ( )

Definition at line 152 of file transportRegistry.cpp.

153 {
154  pvd::Lock guard(_mutex);
155  return transports.size();
156 }
A lock for multithreading.
Definition: lock.h:36
void epics::pvAccess::TransportRegistry::toArray ( transportVector_t transportArray,
const osiSockAddr dest = 0 
)

Definition at line 158 of file transportRegistry.cpp.

159 {
160  pvd::Lock guard(_mutex);
161 
162  transportArray.reserve(transportArray.size() + transports.size());
163 
164  for(transports_t::const_iterator it(transports.begin()), end(transports.end());
165  it != end; ++it)
166  {
167  const Key& key = it->first;
168  const Transport::shared_pointer& tr = it->second;
169 
170  if(!dest || sockAddrAreIdentical(dest, &key.addr))
171  transportArray.push_back(tr);
172  }
173 }
A lock for multithreading.
Definition: lock.h:36
int epicsStdCall sockAddrAreIdentical(const osiSockAddr *plhs, const osiSockAddr *prhs)
Definition: osiSock.c:35

The documentation for this class was generated from the following files: