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

#include "serverContextImpl.h"

+ Inheritance diagram for epics::pvAccess::ServerContextImpl:
+ Collaboration diagram for epics::pvAccess::ServerContextImpl:

Public Types

typedef std::tr1::shared_ptr< ServerContextImplshared_pointer
 
typedef std::tr1::shared_ptr< const ServerContextImplconst_shared_pointer
 
typedef std::map< std::string, std::tr1::weak_ptr< ChannelProvider > > s_channelNameToProvider_t
 

Public Member Functions

 ServerContextImpl ()
 
virtual ~ServerContextImpl ()
 
const ServerGUIDgetGUID () OVERRIDE FINAL
 
const VersiongetVersion () OVERRIDE FINAL
 
void initialize ()
 
void run (epics::pvData::uint32 seconds) OVERRIDE FINAL
 
void shutdown () OVERRIDE FINAL
 
void printInfo (std::ostream &str, int lvl) OVERRIDE FINAL
 
void setBeaconServerStatusProvider (BeaconServerStatusProvider::shared_pointer const &beaconServerStatusProvider) OVERRIDE FINAL
 
epics::pvData::Timer::shared_pointer getTimer () OVERRIDE FINAL
 
Channel::shared_pointer getChannel (pvAccessID id) OVERRIDE FINAL
 
Transport::shared_pointer getSearchTransport () OVERRIDE FINAL
 
Configuration::const_shared_pointer getConfiguration () OVERRIDE FINAL
 
TransportRegistrygetTransportRegistry () OVERRIDE FINAL
 
virtual void newServerDetected () OVERRIDE FINAL
 
epicsTimeStampgetStartTime () OVERRIDE FINAL
 
virtual Configuration::shared_pointer getCurrentConfig () OVERRIDE FINAL
 
float getBeaconPeriod ()
 
epics::pvData::int32 getReceiveBufferSize ()
 
epics::pvData::int32 getServerPort () OVERRIDE FINAL
 
epics::pvData::int32 getBroadcastPort () OVERRIDE FINAL
 
BeaconServerStatusProvider::shared_pointer getBeaconServerStatusProvider ()
 
const osiSockAddrgetServerInetAddress ()
 
const BlockingUDPTransport::shared_pointer & getBroadcastTransport ()
 
virtual const std::vector< ChannelProvider::shared_pointer > & getChannelProviders () OVERRIDE FINAL
 
bool isChannelProviderNamePreconfigured ()
 
- Public Member Functions inherited from epics::pvAccess::ServerContext
 POINTER_DEFINITIONS (ServerContext)
 
virtual ~ServerContext ()
 
void printInfo (int lvl=0)
 
- Public Member Functions inherited from epics::pvAccess::Context
 POINTER_DEFINITIONS (Context)
 
virtual ~Context ()
 

Public Attributes

s_channelNameToProvider_t s_channelNameToProvider
 
epics::pvData::Mutex _mutex
 

Static Public Attributes

static size_t num_instances
 
static const Version VERSION
 

Friends

class ServerContext
 

Additional Inherited Members

- Static Public Member Functions inherited from epics::pvAccess::ServerContext
static ServerContext::shared_pointer create (const Config &conf=Config())
 

Detailed Description

Definition at line 25 of file serverContextImpl.h.

Member Typedef Documentation

Definition at line 33 of file serverContextImpl.h.

typedef std::map<std::string, std::tr1::weak_ptr<ChannelProvider> > epics::pvAccess::ServerContextImpl::s_channelNameToProvider_t

Definition at line 122 of file serverContextImpl.h.

Definition at line 32 of file serverContextImpl.h.

Constructor & Destructor Documentation

epics::pvAccess::ServerContextImpl::ServerContextImpl ( )

Definition at line 34 of file serverContext.cpp.

34  :
35  _beaconAddressList(),
36  _ignoreAddressList(),
37  _autoBeaconAddressList(true),
38  _beaconPeriod(15.0),
39  _broadcastPort(PVA_BROADCAST_PORT),
40  _serverPort(PVA_SERVER_PORT),
41  _receiveBufferSize(MAX_TCP_RECV),
42  _timer(new Timer("PVAS timers", lowerPriority)),
43  _beaconEmitter(),
44  _acceptor(),
45  _transportRegistry(),
46  _channelProviders(),
47  _beaconServerStatusProvider(),
48  _startTime()
49 {
50  REFTRACE_INCREMENT(num_instances);
51 
52  epicsTimeGetCurrent(&_startTime);
53 
54  // TODO maybe there is a better place for this (when there will be some factory)
57 
58  generateGUID();
59 }
LIBCOM_API void epicsStdCall epicsSignalInstallSigPipeIgnore(void)
Definition: osdSignal.cpp:17
const epics::pvData::int32 PVA_SERVER_PORT
Definition: pvaConstants.h:41
Support for delayed or periodic callback execution.
Definition: timer.h:71
int epicsStdCall epicsTimeGetCurrent(epicsTimeStamp *pDest)
Get current time into *pDest.
const epics::pvData::int32 PVA_BROADCAST_PORT
Definition: pvaConstants.h:44
LIBCOM_API void epicsStdCall epicsSignalInstallSigAlarmIgnore(void)
Definition: osdSignal.cpp:18
const epics::pvData::int32 MAX_TCP_RECV
Definition: pvaConstants.h:64
epics::pvAccess::ServerContextImpl::~ServerContextImpl ( )
virtual

Definition at line 61 of file serverContext.cpp.

62 {
63  try
64  {
65  shutdown();
66  }
67  catch(std::exception& e)
68  {
69  std::cerr<<"Error in: ServerContextImpl::~ServerContextImpl: "<<e.what()<<"\n";
70  }
71  REFTRACE_DECREMENT(num_instances);
72 }

Member Function Documentation

float epics::pvAccess::ServerContextImpl::getBeaconPeriod ( )

Get beacon period (in seconds).

Returns
beacon period (in seconds).

Definition at line 468 of file serverContext.cpp.

469 {
470  return _beaconPeriod;
471 }
BeaconServerStatusProvider::shared_pointer epics::pvAccess::ServerContextImpl::getBeaconServerStatusProvider ( )

Get registered beacon server status provider.

Returns
registered beacon server status provider.

Definition at line 488 of file serverContext.cpp.

489 {
490  return _beaconServerStatusProvider;
491 }
int32 epics::pvAccess::ServerContextImpl::getBroadcastPort ( )
virtual

Get broadcast port.

Returns
broadcast port.

Implements epics::pvAccess::ServerContext.

Definition at line 483 of file serverContext.cpp.

484 {
485  return _broadcastPort;
486 }
const BlockingUDPTransport::shared_pointer & epics::pvAccess::ServerContextImpl::getBroadcastTransport ( )

Broadcast (UDP send) transport.

Returns
broadcast transport.

Definition at line 502 of file serverContext.cpp.

503 {
504  return _broadcastTransport;
505 }
Channel::shared_pointer epics::pvAccess::ServerContextImpl::getChannel ( pvAccessID  id)
virtual

Implements epics::pvAccess::Context.

Definition at line 522 of file serverContext.cpp.

523 {
524  // not used
525  return Channel::shared_pointer();
526 }
const std::vector< ChannelProvider::shared_pointer > & epics::pvAccess::ServerContextImpl::getChannelProviders ( )
virtual

Get channel providers.

Returns
channel providers.

Implements epics::pvAccess::ServerContext.

Definition at line 507 of file serverContext.cpp.

508 {
509  return _channelProviders;
510 }
Configuration::const_shared_pointer epics::pvAccess::ServerContextImpl::getConfiguration ( )
virtual

Implements epics::pvAccess::Context.

Definition at line 95 of file serverContext.cpp.

96 {
97  Lock guard(_mutex);
98  if (configuration.get() == 0)
99  {
100  ConfigurationProvider::shared_pointer configurationProvider = ConfigurationFactory::getProvider();
101  configuration = configurationProvider->getConfiguration("pvAccess-server");
102  if (configuration.get() == 0)
103  {
104  configuration = configurationProvider->getConfiguration("system");
105  }
106  }
107  return configuration;
108 }
static ConfigurationProvider::shared_pointer getProvider()
A lock for multithreading.
Definition: lock.h:36
ConfigurationProvider::shared_pointer configurationProvider
Configuration::shared_pointer epics::pvAccess::ServerContextImpl::getCurrentConfig ( )
virtual

Return a Configuration with the actual values being used, including defaults used, and bounds limits applied.

Implements epics::pvAccess::ServerContext.

Definition at line 212 of file serverContext.cpp.

213 {
214  ConfigurationBuilder B;
215 
216  std::ostringstream providerName;
217  for(size_t i=0; i<_channelProviders.size(); i++) {
218  if(i>0)
219  providerName<<" ";
220  providerName<<_channelProviders[i]->getProviderName();
221  }
222 
223 #define SET(K, V) B.add(K, V);
224 
225  {
226  char buf[24];
227  ipAddrToDottedIP(&_ifaceAddr.ia, buf, sizeof(buf));
228  buf[sizeof(buf)-1] = '\0';
229  SET("EPICS_PVAS_INTF_ADDR_LIST", buf);
230  }
231 
232  SET("EPICS_PVAS_BEACON_ADDR_LIST", _beaconAddressList);
233  SET("EPICS_PVA_ADDR_LIST", _beaconAddressList);
234 
235  SET("EPICS_PVAS_AUTO_BEACON_ADDR_LIST",
236  _autoBeaconAddressList ? "YES" : "NO");
237  SET("EPICS_PVA_AUTO_ADDR_LIST",
238  _autoBeaconAddressList ? "YES" : "NO");
239 
240  SET("EPICS_PVAS_BEACON_PERIOD", getBeaconPeriod());
241  SET("EPICS_PVA_BEACON_PERIOD", getBeaconPeriod());
242 
243  SET("EPICS_PVAS_SERVER_PORT", getServerPort());
244  SET("EPICS_PVA_SERVER_PORT", getServerPort());
245 
246  SET("EPICS_PVAS_BROADCAST_PORT", getBroadcastPort());
247  SET("EPICS_PVA_BROADCAST_PORT", getBroadcastPort());
248 
249  SET("EPICS_PVAS_MAX_ARRAY_BYTES", getReceiveBufferSize());
250  SET("EPICS_PVA_MAX_ARRAY_BYTES", getReceiveBufferSize());
251 
252  SET("EPICS_PVAS_PROVIDER_NAMES", providerName.str());
253 
254 #undef SET
255 
256  return B.push_map().build();
257 }
int i
Definition: scan.c:967
struct sockaddr_in ia
Definition: osiSock.h:157
epics::pvData::int32 getBroadcastPort() OVERRIDE FINAL
epics::pvData::int32 getServerPort() OVERRIDE FINAL
epics::pvData::int32 getReceiveBufferSize()
#define SET(K, V)
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:144
const ServerGUID & epics::pvAccess::ServerContextImpl::getGUID ( )
virtual

Returns GUID (12-byte array).

Returns
GUID.

Implements epics::pvAccess::ServerContext.

Definition at line 74 of file serverContext.cpp.

75 {
76  return _guid;
77 }
int32 epics::pvAccess::ServerContextImpl::getReceiveBufferSize ( )

Get receiver buffer (payload) size.

Returns
max payload size.

Definition at line 473 of file serverContext.cpp.

474 {
475  return _receiveBufferSize;
476 }
Transport::shared_pointer epics::pvAccess::ServerContextImpl::getSearchTransport ( )
virtual

Implements epics::pvAccess::Context.

Definition at line 528 of file serverContext.cpp.

529 {
530  // not used
531  return Transport::shared_pointer();
532 }
const osiSockAddr * epics::pvAccess::ServerContextImpl::getServerInetAddress ( )

Get server newtwork (IP) address.

Returns
server network (IP) address, NULL if not bounded.

Definition at line 493 of file serverContext.cpp.

494 {
495  if(_acceptor.get())
496  {
497  return const_cast<osiSockAddr*>(_acceptor->getBindAddress());
498  }
499  return NULL;
500 }
#define NULL
Definition: catime.c:38
int32 epics::pvAccess::ServerContextImpl::getServerPort ( )
virtual

Get server port.

Returns
server port.

Implements epics::pvAccess::ServerContext.

Definition at line 478 of file serverContext.cpp.

479 {
480  return _serverPort;
481 }
epicsTimeStamp & epics::pvAccess::ServerContextImpl::getStartTime ( )
virtual

Implements epics::pvAccess::ServerContext.

Definition at line 539 of file serverContext.cpp.

540 {
541  return _startTime;
542 }
Timer::shared_pointer epics::pvAccess::ServerContextImpl::getTimer ( )
virtual

Implements epics::pvAccess::Context.

Definition at line 512 of file serverContext.cpp.

513 {
514  return _timer;
515 }
epics::pvAccess::TransportRegistry * epics::pvAccess::ServerContextImpl::getTransportRegistry ( )
virtual

Implements epics::pvAccess::Context.

Definition at line 517 of file serverContext.cpp.

518 {
519  return &_transportRegistry;
520 }
const Version & epics::pvAccess::ServerContextImpl::getVersion ( )
virtual

Get context implementation version.

Returns
version of the context implementation.

Implements epics::pvAccess::ServerContext.

Definition at line 79 of file serverContext.cpp.

80 {
82 }
void epics::pvAccess::ServerContextImpl::initialize ( )

Definition at line 265 of file serverContext.cpp.

266 {
267  Lock guard(_mutex);
268 
269  // already called in loadConfiguration
270  //osiSockAttach();
271 
272  ServerContextImpl::shared_pointer thisServerContext = shared_from_this();
273  // we create reference cycles here which are broken by our shutdown() method,
274  _responseHandler.reset(new ServerResponseHandler(thisServerContext));
275 
276  _acceptor.reset(new BlockingTCPAcceptor(thisServerContext, _responseHandler, _ifaceAddr, _receiveBufferSize));
277  _serverPort = ntohs(_acceptor->getBindAddress()->ia.sin_port);
278 
279  // setup broadcast UDP transport
280  initializeUDPTransports(true, _udpTransports, _ifaceList, _responseHandler, _broadcastTransport,
281  _broadcastPort, _autoBeaconAddressList, _beaconAddressList, _ignoreAddressList);
282 
283  _beaconEmitter.reset(new BeaconEmitter("tcp", _broadcastTransport, thisServerContext));
284 
285  _beaconEmitter->start();
286 }
A lock for multithreading.
Definition: lock.h:36
void initializeUDPTransports(bool serverFlag, BlockingUDPTransportVector &udpTransports, const IfaceNodeVector &ifaceList, const ResponseHandler::shared_pointer &responseHandler, BlockingUDPTransport::shared_pointer &sendTransport, int32 &listenPort, bool autoAddressList, const std::string &addressList, const std::string &ignoreAddressList)
std::tr1::shared_ptr< ServerContextImpl > shared_pointer
bool epics::pvAccess::ServerContextImpl::isChannelProviderNamePreconfigured ( )

Return true if channel provider name is provided by configuration (e.g. system env. var.).

Returns
true if channel provider name is provided by configuration (e.g. system env. var.)

Definition at line 259 of file serverContext.cpp.

260 {
261  Configuration::const_shared_pointer config = getConfiguration();
262  return config->hasProperty("EPICS_PVAS_PROVIDER_NAMES");
263 }
Configuration::const_shared_pointer getConfiguration() OVERRIDE FINAL
void epics::pvAccess::ServerContextImpl::newServerDetected ( )
virtual

due to ClientContextImpl

Implements epics::pvAccess::Context.

Definition at line 534 of file serverContext.cpp.

535 {
536  // not used
537 }
void epics::pvAccess::ServerContextImpl::printInfo ( std::ostream &  str,
int  lvl 
)
virtual

Prints detailed information about the context to the specified output stream.

Parameters
lvldetail level
strstream to which to print the info

Implements epics::pvAccess::ServerContext.

Definition at line 369 of file serverContext.cpp.

370 {
371  if(lvl==0) {
372  Lock guard(_mutex);
373  str << getVersion().getVersionString() << "\n"
374  << "Active configuration (w/ defaults)\n";
375 
376  Configuration::shared_pointer conf(getCurrentConfig());
377 #define SHOW(ENV) str << #ENV " = "<<conf->getPropertyAsString(#ENV, std::string())<<"\n";
378  SHOW(EPICS_PVAS_INTF_ADDR_LIST)
379  SHOW(EPICS_PVAS_BEACON_ADDR_LIST)
380  SHOW(EPICS_PVAS_AUTO_BEACON_ADDR_LIST)
381  SHOW(EPICS_PVAS_BEACON_PERIOD)
382  SHOW(EPICS_PVAS_BROADCAST_PORT)
383  SHOW(EPICS_PVAS_SERVER_PORT)
384  SHOW(EPICS_PVAS_PROVIDER_NAMES)
385 #undef SHOW
386 
387  } else {
388  // lvl >= 1
389 
391  _transportRegistry.toArray(transports);
392 
393  str<<"Clients:\n";
394  for(TransportRegistry::transportVector_t::const_iterator it(transports.begin()), end(transports.end());
395  it!=end; ++it)
396  {
397  const Transport::shared_pointer& transport(*it);
398 
399  str<<" "<<transport->getType()<<"://"<<transport->getRemoteName()
400  <<" "<<(transport->isClosed()?"closed!":"");
401 
402  const detail::BlockingServerTCPTransportCodec *casTransport = dynamic_cast<const detail::BlockingServerTCPTransportCodec*>(transport.get());
403 
404  if(casTransport) {
405  str<<" ver="<<unsigned(casTransport->getRevision())
406  <<" "<<(casTransport ? casTransport->getChannelCount() : size_t(-1))<<" channels";
407 
408  PeerInfo::const_shared_pointer peer;
409  {
410  epicsGuard<epicsMutex> G(casTransport->_mutex);
411  peer = casTransport->_peerInfo;
412  }
413  if(peer) {
414  str<<" user: "<<peer->authority<<"/"<<peer->account;
415  if(!peer->realm.empty())
416  str<<"@"<<peer->realm;
417  if(lvl>=2 && !peer->roles.empty()) {
418  str<<" groups:";
419  int n=0;
420  for(PeerInfo::roles_t::const_iterator it(peer->roles.begin()), end(peer->roles.end()); it!=end; ++it, ++n) {
421  if(n)
422  str<<',';
423  str<<(*it);
424  }
425  }
426  if(lvl>=3 && peer->aux) {
427  str<<" aux. auth.:\n";
429  str<<(*peer->aux);
430  }
431  }
432  }
433 
434  str<<"\n";
435 
436  if(!casTransport || lvl<2)
437  return;
438  // lvl >= 2
439 
440  typedef std::vector<ServerChannel::shared_pointer> channels_t;
441  channels_t channels;
442  casTransport->getChannels(channels);
443 
444  for(channels_t::const_iterator it(channels.begin()), end(channels.end()); it!=end; ++it)
445  {
446  const ServerChannel *channel(static_cast<const ServerChannel*>(it->get()));
447  const Channel::shared_pointer& providerChan(channel->getChannel());
448  if(!providerChan)
449  continue;
450 
451  str<<" "<<providerChan->getChannelName()
452  <<(providerChan->isConnected()?"":" closed");
453  if(lvl>=3) {
454  str<<"\t: ";
455  providerChan->printInfo(str);
456  }
457  str<<"\n";
458  }
459  }
460  }
461 }
virtual Configuration::shared_pointer getCurrentConfig() OVERRIDE FINAL
#define SHOW(ENV)
A lock for multithreading.
Definition: lock.h:36
#define str(v)
void toArray(transportVector_t &transportArray, const osiSockAddr *dest=0)
const Version & getVersion() OVERRIDE FINAL
std::vector< Transport::shared_pointer > transportVector_t
const std::string getVersionString() const
Definition: pvaVersion.cpp:60
void epics::pvAccess::ServerContextImpl::run ( epics::pvData::uint32  seconds)
virtual

Run server (process events).

Parameters
secondstime in seconds the server will process events (method will block), if 0 the method would block until destroy() is called.
Exceptions
BaseExceptionif server is already destroyed.

Implements epics::pvAccess::ServerContext.

Definition at line 288 of file serverContext.cpp.

289 {
290  //TODO review this
291  if(seconds == 0)
292  {
293  _runEvent.wait();
294  }
295  else
296  {
297  _runEvent.wait(seconds);
298  }
299 }
void epics::pvAccess::ServerContextImpl::setBeaconServerStatusProvider ( BeaconServerStatusProvider::shared_pointer const &  beaconServerStatusProvider)
virtual

Set beacon server status provider.

Parameters
beaconServerStatusProviderBeaconServerStatusProvider implementation to set.

Implements epics::pvAccess::ServerContext.

Definition at line 463 of file serverContext.cpp.

464 {
465  _beaconServerStatusProvider = beaconServerStatusProvider;
466 }
void epics::pvAccess::ServerContextImpl::shutdown ( )
virtual

Implements epics::pvAccess::ServerContext.

Definition at line 303 of file serverContext.cpp.

304 {
305  if(!_timer)
306  return; // already shutdown
307 
308  // abort pending timers and prevent new timers from starting
309  _timer->close();
310 
311  // stop responding to search requests
312  for (BlockingUDPTransportVector::const_iterator iter = _udpTransports.begin();
313  iter != _udpTransports.end(); iter++)
314  {
315  const BlockingUDPTransport::shared_pointer& transport = *iter;
316  // joins worker thread
317  transport->close();
318  // _udpTransports contains _broadcastTransport
319  // _broadcastTransport is referred to be _beaconEmitter
320  if(transport!=_broadcastTransport)
321  LEAK_CHECK(transport, "udp transport")
322  }
323  _udpTransports.clear();
324 
325  // stop emitting beacons
326  if (_beaconEmitter)
327  {
328  _beaconEmitter->destroy();
329  LEAK_CHECK(_beaconEmitter, "_beaconEmitter")
330  _beaconEmitter.reset();
331  }
332 
333  // close UDP sent transport
334  if (_broadcastTransport)
335  {
336  _broadcastTransport->close();
337  LEAK_CHECK(_broadcastTransport, "_broadcastTransport")
338  _broadcastTransport.reset();
339  }
340 
341  // stop accepting connections
342  if (_acceptor)
343  {
344  _acceptor->destroy();
345  LEAK_CHECK(_acceptor, "_acceptor")
346  _acceptor.reset();
347  }
348 
349  // this will also destroy all channels
350  _transportRegistry.clear();
351 
352  // drop timer queue
353  LEAK_CHECK(_timer, "_timer")
354  _timer.reset();
355 
356  // response handlers hold strong references to us,
357  // so must break the cycles
358  LEAK_CHECK(_responseHandler, "_responseHandler")
359  _responseHandler.reset();
360 
361  _runEvent.signal();
362 }
#define LEAK_CHECK(PTR, NAME)
if(yy_init)
Definition: scan.c:972

Friends And Related Function Documentation

friend class ServerContext
friend

Definition at line 30 of file serverContextImpl.h.

Member Data Documentation

epics::pvData::Mutex epics::pvAccess::ServerContextImpl::_mutex

Definition at line 206 of file serverContextImpl.h.

size_t epics::pvAccess::ServerContextImpl::num_instances
static

Definition at line 35 of file serverContextImpl.h.

s_channelNameToProvider_t epics::pvAccess::ServerContextImpl::s_channelNameToProvider

Definition at line 123 of file serverContextImpl.h.

const Version epics::pvAccess::ServerContextImpl::VERSION
static

Version.

Definition at line 65 of file serverContextImpl.h.


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