This is Unofficial EPICS BASE Doxygen Site
serverContext.cpp
Go to the documentation of this file.
1 
7 #include <epicsSignal.h>
8 
9 #include <pv/lock.h>
10 #include <pv/timer.h>
11 #include <pv/thread.h>
12 #include <pv/reftrack.h>
13 
14 #define epicsExportSharedSymbols
15 #include <pv/responseHandlers.h>
16 #include <pv/logger.h>
17 #include <pv/serverContextImpl.h>
18 #include <pv/codec.h>
19 #include <pv/security.h>
20 
21 using namespace std;
22 using namespace epics::pvData;
25 
26 namespace epics {
27 namespace pvAccess {
28 
29 const Version ServerContextImpl::VERSION("pvAccess Server", "cpp",
30  EPICS_PVA_MAJOR_VERSION, EPICS_PVA_MINOR_VERSION, EPICS_PVA_MAINTENANCE_VERSION, EPICS_PVA_DEVELOPMENT_FLAG);
31 
32 size_t ServerContextImpl::num_instances;
33 
34 ServerContextImpl::ServerContextImpl():
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 }
60 
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 }
73 
75 {
76  return _guid;
77 }
78 
80 {
82 }
83 
84 void ServerContextImpl::generateGUID()
85 {
86  // TODO use UUID
87  epics::pvData::TimeStamp startupTime;
88  startupTime.getCurrent();
89 
90  ByteBuffer buffer(_guid.value, sizeof(_guid.value));
91  buffer.putLong(startupTime.getSecondsPastEpoch());
92  buffer.putInt(startupTime.getNanoseconds());
93 }
94 
95 Configuration::const_shared_pointer ServerContextImpl::getConfiguration()
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 }
109 
113 void ServerContextImpl::loadConfiguration()
114 {
115  Configuration::const_shared_pointer config = configuration;
116 
117  // TODO for now just a simple switch
118  int32 debugLevel = config->getPropertyAsInteger(PVACCESS_DEBUG, 0); // actually $EPICS_PVA_DEBUG
119  if (debugLevel > 0)
121 
122  // TODO multiple addresses
123  memset(&_ifaceAddr, 0, sizeof(_ifaceAddr));
124  _ifaceAddr.ia.sin_family = AF_INET;
125  _ifaceAddr.ia.sin_addr.s_addr = htonl(INADDR_ANY);
126  _ifaceAddr.ia.sin_port = 0;
127  if(!config->getPropertyAsAddress("EPICS_PVAS_INTF_ADDR_LIST", &_ifaceAddr) && config->hasProperty("EPICS_PVAS_INTF_ADDR_LIST"))
128  THROW_EXCEPTION2(std::runtime_error, "EPICS_PVAS_INTF_ADDR_LIST contains invalid IP or non-existant hostname");
129 
130  _beaconAddressList = config->getPropertyAsString("EPICS_PVA_ADDR_LIST", _beaconAddressList);
131  _beaconAddressList = config->getPropertyAsString("EPICS_PVAS_BEACON_ADDR_LIST", _beaconAddressList);
132 
133  _autoBeaconAddressList = config->getPropertyAsBoolean("EPICS_PVA_AUTO_ADDR_LIST", _autoBeaconAddressList);
134  _autoBeaconAddressList = config->getPropertyAsBoolean("EPICS_PVAS_AUTO_BEACON_ADDR_LIST", _autoBeaconAddressList);
135 
136  _beaconPeriod = config->getPropertyAsFloat("EPICS_PVA_BEACON_PERIOD", _beaconPeriod);
137  _beaconPeriod = config->getPropertyAsFloat("EPICS_PVAS_BEACON_PERIOD", _beaconPeriod);
138 
139  _serverPort = config->getPropertyAsInteger("EPICS_PVA_SERVER_PORT", _serverPort);
140  _serverPort = config->getPropertyAsInteger("EPICS_PVAS_SERVER_PORT", _serverPort);
141  _ifaceAddr.ia.sin_port = htons(_serverPort);
142 
143  _broadcastPort = config->getPropertyAsInteger("EPICS_PVA_BROADCAST_PORT", _broadcastPort);
144  _broadcastPort = config->getPropertyAsInteger("EPICS_PVAS_BROADCAST_PORT", _broadcastPort);
145 
146  _receiveBufferSize = config->getPropertyAsInteger("EPICS_PVA_MAX_ARRAY_BYTES", _receiveBufferSize);
147  _receiveBufferSize = config->getPropertyAsInteger("EPICS_PVAS_MAX_ARRAY_BYTES", _receiveBufferSize);
148 
149  if(_channelProviders.empty()) {
150  std::string providers = config->getPropertyAsString("EPICS_PVAS_PROVIDER_NAMES", PVACCESS_DEFAULT_PROVIDER);
151 
152  ChannelProviderRegistry::shared_pointer reg(ChannelProviderRegistry::servers());
153 
154  if (providers == PVACCESS_ALL_PROVIDERS)
155  {
156  providers.resize(0); // VxWorks 5.5 omits clear()
157 
158  std::set<std::string> names;
159  reg->getProviderNames(names);
160  for (std::set<std::string>::const_iterator iter = names.begin(); iter != names.end(); iter++)
161  {
162  ChannelProvider::shared_pointer channelProvider = reg->getProvider(*iter);
163  if (channelProvider) {
164  _channelProviders.push_back(channelProvider);
165  } else {
166  LOG(logLevelDebug, "Provider '%s' all, but missing\n", iter->c_str());
167  }
168  }
169 
170  } else {
171  // split space separated names
172  std::stringstream ss(providers);
173  std::string providerName;
174  while (std::getline(ss, providerName, ' '))
175  {
176  ChannelProvider::shared_pointer channelProvider(reg->getProvider(providerName));
177  if (channelProvider) {
178  _channelProviders.push_back(channelProvider);
179  } else {
180  LOG(logLevelWarn, "Requested provider '%s' not found", providerName.c_str());
181  }
182  }
183  }
184  }
185 
186  if(_channelProviders.empty())
187  LOG(logLevelError, "ServerContext configured with no Providers will do nothing!\n");
188 
189  //
190  // introspect network interfaces
191  //
192 
193  osiSockAttach();
194 
195  SOCKET sock = epicsSocketCreate(AF_INET, SOCK_STREAM, 0);
196  if (!sock) {
197  THROW_BASE_EXCEPTION("Failed to create a socket needed to introspect network interfaces.");
198  }
199 
200  if (discoverInterfaces(_ifaceList, sock, &_ifaceAddr))
201  {
202  THROW_BASE_EXCEPTION("Failed to introspect network interfaces.");
203  }
204  else if (_ifaceList.size() == 0)
205  {
206  THROW_BASE_EXCEPTION("No (specified) network interface(s) available.");
207  }
208  epicsSocketDestroy(sock);
209 }
210 
211 Configuration::shared_pointer
213 {
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 }
258 
260 {
261  Configuration::const_shared_pointer config = getConfiguration();
262  return config->hasProperty("EPICS_PVAS_PROVIDER_NAMES");
263 }
264 
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 }
287 
289 {
290  //TODO review this
291  if(seconds == 0)
292  {
293  _runEvent.wait();
294  }
295  else
296  {
297  _runEvent.wait(seconds);
298  }
299 }
300 
301 #define LEAK_CHECK(PTR, NAME) if((PTR) && !(PTR).unique()) { std::cerr<<"Leaking ServerContext " NAME " use_count="<<(PTR).use_count()<<"\n"<<show_referrers(PTR, false);}
302 
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 }
363 
365 {
366  printInfo(cout, lvl);
367 }
368 
369 void ServerContextImpl::printInfo(ostream& str, int lvl)
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";
428  format::indent_scope I(str);
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 }
462 
464 {
465  _beaconServerStatusProvider = beaconServerStatusProvider;
466 }
467 
469 {
470  return _beaconPeriod;
471 }
472 
474 {
475  return _receiveBufferSize;
476 }
477 
479 {
480  return _serverPort;
481 }
482 
484 {
485  return _broadcastPort;
486 }
487 
489 {
490  return _beaconServerStatusProvider;
491 }
492 
494 {
495  if(_acceptor.get())
496  {
497  return const_cast<osiSockAddr*>(_acceptor->getBindAddress());
498  }
499  return NULL;
500 }
501 
502 const BlockingUDPTransport::shared_pointer& ServerContextImpl::getBroadcastTransport()
503 {
504  return _broadcastTransport;
505 }
506 
507 const std::vector<ChannelProvider::shared_pointer>& ServerContextImpl::getChannelProviders()
508 {
509  return _channelProviders;
510 }
511 
512 Timer::shared_pointer ServerContextImpl::getTimer()
513 {
514  return _timer;
515 }
516 
518 {
519  return &_transportRegistry;
520 }
521 
522 Channel::shared_pointer ServerContextImpl::getChannel(pvAccessID /*id*/)
523 {
524  // not used
525  return Channel::shared_pointer();
526 }
527 
528 Transport::shared_pointer ServerContextImpl::getSearchTransport()
529 {
530  // not used
531  return Transport::shared_pointer();
532 }
533 
535 {
536  // not used
537 }
538 
540 {
541  return _startTime;
542 }
543 
544 ServerContext::shared_pointer startPVAServer(std::string const & providerNames, int timeToRun, bool runInSeparateThread, bool printInfo)
545 {
546  ServerContext::shared_pointer ret(ServerContext::create(ServerContext::Config()
547  .config(ConfigurationBuilder()
548  .add("EPICS_PVAS_PROVIDER_NAMES", providerNames)
549  .push_map()
550  .push_env() // environment takes precidence (top of stack)
551  .build())));
552  if(printInfo)
553  ret->printInfo();
554 
555  if(!runInSeparateThread) {
556  ret->run(timeToRun);
557  ret->shutdown();
558  } else if(timeToRun!=0) {
559  LOG(logLevelWarn, "startPVAServer() timeToRun!=0 only supported when runInSeparateThread==false\n");
560  }
561 
562  return ret;
563 }
564 
565 namespace {
566 struct shutdown_dtor {
568  shutdown_dtor(const ServerContextImpl::shared_pointer& wrapped) :wrapped(wrapped) {}
569  void operator()(ServerContext* self) {
570  wrapped->shutdown();
571  if(!wrapped.unique())
572  LOG(logLevelWarn, "ServerContextImpl::shutdown() doesn't break all internal ref. loops. use_count=%u\n", (unsigned)wrapped.use_count());
573  wrapped.reset();
574  }
575 };
576 }
577 
578 ServerContext::shared_pointer ServerContext::create(const Config &conf)
579 {
581  ret->configuration = conf._conf;
582  ret->_channelProviders = conf._providers;
583 
584  if (!ret->configuration)
585  {
586  ConfigurationProvider::shared_pointer configurationProvider = ConfigurationFactory::getProvider();
587  ret->configuration = configurationProvider->getConfiguration("pvAccess-server");
588  if (!ret->configuration)
589  {
590  ret->configuration = configurationProvider->getConfiguration("system");
591  }
592  }
593  if(!ret->configuration) {
594  ret->configuration = ConfigurationBuilder().push_env().build();
595  }
596 
597  ret->loadConfiguration();
598  ret->initialize();
599 
600  // wrap the returned shared_ptr so that it's dtor calls ->shutdown() to break internal referance loops
601  {
602  ServerContextImpl::shared_pointer wrapper(ret.get(), shutdown_dtor(ret));
603  wrapper.swap(ret);
604  }
605 
606  return ret;
607 }
608 
609 }}
TransportRegistry * getTransportRegistry() OVERRIDE FINAL
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
Definition: osdSock.c:117
Configuration::shared_pointer build()
const Channel::shared_pointer & getChannel() const
epicsInt32 pvAccessID
Definition: pvaDefs.h:18
static ChannelProviderRegistry::shared_pointer servers()
static ConfigurationProvider::shared_pointer getProvider()
LIBCOM_API void epicsStdCall epicsSignalInstallSigPipeIgnore(void)
Definition: osdSignal.cpp:17
#define THROW_EXCEPTION2(TYPE, MSG)
#define true
Definition: flexdef.h:84
int i
Definition: scan.c:967
EPICS_ALWAYS_INLINE void putInt(int32 value)
Definition: byteBuffer.h:537
Channel::shared_pointer getChannel(pvAccessID id) OVERRIDE FINAL
const osiSockAddr * getServerInetAddress()
struct sockaddr_in ia
Definition: osiSock.h:157
#define SET_LOG_LEVEL(level)
Definition: logger.h:50
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
virtual Configuration::shared_pointer getCurrentConfig() OVERRIDE FINAL
epics::pvData::Timer::shared_pointer getTimer() OVERRIDE FINAL
epics::pvData::int32 getBroadcastPort() OVERRIDE FINAL
epicsShareExtern const std::string PVACCESS_DEBUG
Definition: pvaConstants.h:88
epicsShareExtern const std::string PVACCESS_DEFAULT_PROVIDER
Definition: pvaConstants.h:82
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
#define SHOW(ENV)
epics::pvData::int32 getServerPort() OVERRIDE FINAL
A lock for multithreading.
Definition: lock.h:36
Transport::shared_pointer getSearchTransport() OVERRIDE FINAL
#define NULL
Definition: catime.c:38
epicsTimeStamp & getStartTime() OVERRIDE FINAL
#define str(v)
BeaconServerStatusProvider::shared_pointer getBeaconServerStatusProvider()
epics::pvData::Mutex _mutex
Definition: codec.h:264
const BlockingUDPTransport::shared_pointer & getBroadcastTransport()
void toArray(transportVector_t &transportArray, const osiSockAddr *dest=0)
const epics::pvData::int32 PVA_SERVER_PORT
Definition: pvaConstants.h:41
Support for delayed or periodic callback execution.
Definition: timer.h:71
virtual const std::vector< ChannelProvider::shared_pointer > & getChannelProviders() OVERRIDE FINAL
int32 getNanoseconds() const
Definition: timeStamp.h:91
ConfigurationProvider::shared_pointer configurationProvider
LIBCOM_API SOCKET epicsStdCall epicsSocketCreate(int domain, int type, int protocol)
Definition: osdSock.c:71
const Version & getVersion() OVERRIDE FINAL
#define LOG(level, format,...)
Definition: logger.h:48
pvData
Definition: monitor.h:428
epics::pvData::int32 getReceiveBufferSize()
void getChannels(std::vector< std::tr1::shared_ptr< ServerChannel > > &channels) const
Definition: codec.cpp:1505
epics::pvData::int8 getRevision() const
Definition: codec.h:205
#define LEAK_CHECK(PTR, NAME)
int epicsStdCall epicsTimeGetCurrent(epicsTimeStamp *pDest)
Get current time into *pDest.
const epics::pvData::int32 PVA_BROADCAST_PORT
Definition: pvaConstants.h:44
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Definition: byteBuffer.h:233
#define SET(K, V)
std::vector< Transport::shared_pointer > transportVector_t
int SOCKET
Definition: osdSock.h:31
const std::string getVersionString() const
Definition: pvaVersion.cpp:60
LIBCOM_API void epicsStdCall epicsSignalInstallSigAlarmIgnore(void)
Definition: osdSignal.cpp:18
const ServerGUID & getGUID() OVERRIDE FINAL
void setBeaconServerStatusProvider(BeaconServerStatusProvider::shared_pointer const &beaconServerStatusProvider) OVERRIDE FINAL
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)
ServerContextImpl::shared_pointer wrapped
virtual void newServerDetected() OVERRIDE FINAL
epicsShareFunc ServerContext::shared_pointer startPVAServer(std::string const &providerNames=PVACCESS_ALL_PROVIDERS, int timeToRun=0, bool runInSeparateThread=false, bool printInfo=false)
#define THROW_BASE_EXCEPTION(msg)
EPICS time stamp, for use from C code.
Definition: epicsTime.h:33
PeerInfo::const_shared_pointer _peerInfo
Definition: codec.h:428
void run(epics::pvData::uint32 seconds) OVERRIDE FINAL
Options for a server insatnce.
int osiSockAttach()
Definition: osdSock.c:54
static ServerContext::shared_pointer create(const Config &conf=Config())
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:808
std::tr1::shared_ptr< BeaconServerStatusProvider > shared_pointer
OS-independent routines for ignoring Posix signals.
epicsShareExtern const std::string PVACCESS_ALL_PROVIDERS
Definition: pvaConstants.h:85
void printInfo(std::ostream &str, int lvl) OVERRIDE FINAL
int64 getSecondsPastEpoch() const
Definition: timeStamp.h:78
const epics::pvData::int32 MAX_TCP_RECV
Definition: pvaConstants.h:64
EPICS_ALWAYS_INLINE void putLong(int64 value)
Definition: byteBuffer.h:543
int discoverInterfaces(IfaceNodeVector &list, SOCKET socket, const osiSockAddr *pMatchAddr)
int32_t int32
Definition: pvType.h:83
std::tr1::shared_ptr< ServerContextImpl > shared_pointer
Configuration::const_shared_pointer getConfiguration() OVERRIDE FINAL
Methods for manipulating timeStamp.
Definition: timeStamp.h:43
uint32_t uint32
Definition: pvType.h:99
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:144