ATLAS Offline Software
ONCRPCServerThreads.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
10 
11 #include "JiveXML/IServer.h"
12 
13 //Decoding of caller IP address
14 #include <climits>
15 #include <netinet/in.h>
16 #include <arpa/inet.h>
17 #include <sys/socket.h>
18 #include <netdb.h>
19 
20 #include <sstream>
21 #include <errno.h>
22 #ifdef __APPLE__
23 #include <rpc/rpc.h>
24 extern "C" void get_myaddress (struct sockaddr_in *);
25 #endif
26 
27 namespace JiveXML {
28 
29  //Global data
30  //This variable is visible in all threads
32 
33  //Thread specific data keys
34  //These variables are global only within a single thread
35  pthread_key_t ServerSvcKey ATLAS_THREAD_SAFE; //<! A pointer to the the Athena Service associated with this thread
36 
42  void* ONCRPCDispatchThread ( void* args ){
43 
44  //Get the thread arguments
45  const struct svc_req* rqstp = ((DispatchThreadArguments*)args)->rqstp;
46  const EventRequest* eventRequest = ((DispatchThreadArguments*)args)->evtReq;
47  const Event* event = ((DispatchThreadArguments*)args)->evt;
48  IServer* const ServerSvc = ((DispatchThreadArguments*)args)->ServerSvcPtr;
49 
50  //we have stored the arguments, so delete the object
52 
53  try {
54 
55  //Now first of all register myself with the ServerSvc;
56  dispatchThreads->AddThread(pthread_self());
57  //Tell them the thread number if they want to know
58  std::ostringstream msg; msg << "Created new dispatch thread " << pthread_self();
59  ServerSvc->Message(MSG::VERBOSE,msg.str());
60 
61  //Process the request
62  switch (rqstp->rq_proc){
63  //NULLPROC - no data exchanged, just pinging for response
64  case NULLPROC:
65  ReturnNull(rqstp->rq_xprt, ServerSvc);
66  break ;
67  //GETSTATUS - return the current athena status
69  ReturnState(rqstp->rq_xprt, ServerSvc);
70  break ;
71  //GETSTREAMS - return the names of the available streams
73  ReturnStreams(rqstp->rq_xprt, ServerSvc);
74  break ;
75  //GETEVENT - return the current event in a given stream
77  ReturnEvent(rqstp->rq_xprt, eventRequest, ServerSvc);
78  break ;
79  //GETEVENT - return the current event in a given stream
81  SetNewEvent(rqstp->rq_xprt, event, ServerSvc);
82  break ;
83  default:
84  std::ostringstream msg;
85  msg << "Client request for server procedure #" << rqstp->rq_proc << " which is not defined";
86  ServerSvc->Message(MSG::WARNING, msg.str());
87  svcerr_noproc(rqstp->rq_xprt);
88  break ;
89  }
90 
91  //We have dealt with the request, delete it
92  delete rqstp;
93  delete event;
94  delete eventRequest;
95 
96  //Finally unregister myself with the ServerSvc
97  //Note that this will also detach the thread, so this has to be the last
98  //statement before the thread returns
99  dispatchThreads->RemoveThread(pthread_self());
100 
101  } catch (std::exception &e){
102  std::ostringstream msg; msg << "Caught exception in DispatchThread: " << e.what();
103  ServerSvc->Message(MSG::ERROR,msg.str());
104  }
105 
106  return NULL;
107  }
108 
109 
116  extern "C" void ONCRPCRequestHandler( struct svc_req* rqstp, SVCXPRT* /*transp*/){
117 
118  //Get the ServerSvc pointer for this thread
119  JiveXML::IServer* const ServerSvc = (JiveXML::IServer*)pthread_getspecific(ServerSvcKey);
120  std::ostringstream msg; msg << "Request handler in thread " << pthread_self();
121  ServerSvc->Message(MSG::VERBOSE,msg.str()); msg.str("");
122 
123  try {
124 
125  //Check wether it is worth retrievin caller information
126  if ( ServerSvc->LogLevel() <= MSG::DEBUG ){
127 
128  //Get information about the requester
129  auto caller = (struct sockaddr* )svc_getcaller(rqstp->rq_xprt);
130  char port[NI_MAXSERV];
131  char host[NI_MAXHOST];
132  char IPAddr[INET6_ADDRSTRLEN];
133 
134  //assemble a message
135  msg << "Request from host ";
136  //Add host name if we have one
137  if(getnameinfo(caller, rqstp->rq_xprt->xp_addrlen,
138  host, sizeof host,
139  nullptr, 0,
140  0) == 0)
141  msg << host << " ";
142  //Add ip-address and port
143  if(getnameinfo(caller, rqstp->rq_xprt->xp_addrlen,
144  IPAddr, sizeof IPAddr,
145  port, sizeof port,
146  NI_NUMERICSERV | NI_NUMERICHOST) == 0)
147  msg << "(" << IPAddr << ") on port " << port;
148  //Deliver the message
149  ServerSvc->Message(MSG::DEBUG,msg.str()); msg.str("");
150  }
151 
152  //Prepare the dispatch thread argument structure making a copy of the
153  //request, so it sticks around if this thread is gone
154  DispatchThreadArguments DpThreadArgs(ServerSvc, new svc_req(*rqstp), NULL, NULL);
155 
156  //Check for input data to the request
157  switch (rqstp->rq_proc){
158 
159  case ONCRPC_GETEVENT_PROC: {
160  //Create structure to hold request arguments on the head so we can
161  //forward it to the dispatch thread.
162  //NOTE: This is a C-struct that MUST be initalized.
163  //It will be cleaned up by the dispatch thread
164  EventRequest* evtReq = new EventRequest;
165  evtReq->EventNumber=-2;evtReq->RunNumber=-2;evtReq->StreamName=NULL;
166 
167  //Retrieve the request arguments
168  if (!svc_getargs(rqstp->rq_xprt,(xdrproc_t)xdr_event_req,(caddr_t)evtReq)){
169  checkResult(errno,"creating dispatch tread arguments from GETEVENT call",ServerSvc);
170  //tell the client his request failed
171  svcerr_decode(rqstp->rq_xprt);
172  //return immediately from this request
173  return ;
174  }
175 
176  //Set the event request argument
177  DpThreadArgs.evtReq = evtReq;
178  break;
179 
180  } case ONCRPC_SETEVENT_PROC: {
181  //Create structure to hold request arguments on the HEAP so we can
182  //forward it to the dispatch thread.
183  //NOTE: This is a C-struct that MUST be initalized
184  //It will be cleaned up by the dispatch thread
185  Event* evt = new Event;
186  evt->EventNumber=-2;evt->RunNumber=-2;evt->StreamName=NULL;evt->NBytes=0;evt->EventData=NULL;
187 
188  //Retrieve the request arguments
189  if (!svc_getargs(rqstp->rq_xprt,(xdrproc_t)xdr_event,(caddr_t)evt)){
190  checkResult(errno,"creating dispatch tread arguments from SETEVENT call",ServerSvc);
191  //tell the client his request failed
192  svcerr_decode(rqstp->rq_xprt);
193  //return immediately from this request
194  return ;
195  }
196 
197  //Set the event request argument
198  DpThreadArgs.evt = evt;
199  break;
200  }
201  }
202 
203  //Check for errors in all pthread functions
204  int retVal = 0;
205 
206  //Generate thread attributes
207  pthread_attr_t attr; retVal = pthread_attr_init (&attr);
208  if ( ! checkResult(retVal,"request handler initializing thread attributes",ServerSvc)) return ;
209 
210  //Removing the limit on the thread memory usage as a test. Suspect that some threads do not have enough memory to finish and therefore eat up all the memory.
211  //retVal = pthread_attr_setstacksize(&attr,10*PTHREAD_STACK_MIN);
212  if ( ! checkResult(retVal,"request handler setting thread stacksize",ServerSvc)) return ;
213 
214  //NOTE: All threads are first created joinable, so we can wait for the to
215  //finish using pthread_detach. Yet, when the thread removes itself from
216  //the ThreadCollection, it will detach itself, so no memory is lost.
217  retVal = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
218  if ( ! checkResult(retVal,"request handler setting thread detach state",ServerSvc)) return;
219 
220  //Create a new thread
221  pthread_t dispatchThread;
222  retVal = pthread_create(&dispatchThread,&attr,&ONCRPCDispatchThread,new DispatchThreadArguments(DpThreadArgs));
223  if ( ! checkResult(retVal,"request handler creating dispatch thread",ServerSvc)) return;
224 
225  //And wait till it has registered itself with the ThreadCollection
227 
228  //release thread attributs
229  retVal = pthread_attr_destroy(&attr);
230  if ( ! checkResult(retVal,"request handler destroying thread attributes",ServerSvc)) return;
231 
232  } catch (std::exception &e){
233  std::ostringstream msg; msg << "Caught exception in RequestHandler: " << e.what();
234  ServerSvc->Message(MSG::ERROR,msg.str());
235  }
236  }
237 
242  //Since this cleanup handler is associated with the IServer*
243  //we will get exactly this as an argument
244  ((JiveXML::IServer*)args)->Message(MSG::INFO,"Finished ONCRPC server thread");
245  //Also call the servers callback
246  ((JiveXML::IServer*)args)->ServerThreadStopped();
247  }
248 
252  void* ONCRPCServerThread( void* args ){
253 
254  //Get a pointer to the Service that started this thread
255  JiveXML::IServer* const ServerSvc = (*( ServerThreadArguments* )args).ServerPtr;
256  //Get the port number from the thread arguments
257  const int PortNumber = (*( ServerThreadArguments* )args).PortNumber;
258 
259  //We've got the arguments and can delete the struct
260  delete (ServerThreadArguments*)args;
261 
262  //Save the arguments in a thread-specific keys
263  //Once the thread exits, the specified cleanup handler is called,
264  //which in our case is used to notify the IServer of the thread termination
265  int retVal = 0;
266  retVal = pthread_key_create(&ServerSvcKey,ONCRPCCleanupHandler);
267  if (! checkResult(retVal,"server thread creating thread-specific key",ServerSvc)) pthread_exit(NULL);
268  retVal = pthread_setspecific(ServerSvcKey, ServerSvc);
269  if (! checkResult(retVal,"server thread setting thread-specific key",ServerSvc)) pthread_exit(NULL);
270 
271  try {
272 
273  //Also install cleanup handlers if they are given as arguments
274 
275  //Send a message to the messaging function of the service
276  ServerSvc->Message(MSG::INFO,"Started ONCRPC server thread");
277 
278  //Check wether the runServerThread flag is set
279  if (!ServerSvc->GetRunServerFlag()){
280  ServerSvc->Message(MSG::WARNING,"The run server flag is not set - stopping server thread immediately");
281  pthread_exit(NULL);
282  }
283 
288  //Get my address
289  struct sockaddr_in my_addr; get_myaddress(&my_addr);
290  //Try get the portnumber of that process
291  unsigned short port = pmap_getport(&my_addr, ONCRPCSERVERPROG,ONCRPCSERVERVERS,IPPROTO_TCP);
292  //Check if some program has already been registered
293  if ( port != 0 ){
294  //First report it
295  std::ostringstream msg; msg << "Program with program number " << ONCRPCSERVERPROG
296  << " already registered with portmapper on local host";
297  ServerSvc->Message(MSG::INFO,msg.str());
298  //Next check if it is alive by creating a client and calling its NULLPROC
299  CLIENT* client = clnt_create("localhost", ONCRPCSERVERPROG,ONCRPCSERVERVERS, "tcp");
300  if (client != NULL){
301 // xdr_void is defined inconsistently in xdr.h and gets a warning from gcc8.
302 #if __GNUC__ >= 8
303 # pragma GCC diagnostic push
304 # pragma GCC diagnostic ignored "-Wcast-function-type"
305 #endif
306  struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0;
307  clnt_stat ret = clnt_call(client, NULLPROC, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, NULL, timeout);
308 #if __GNUC__ >= 8
309 # pragma GCC diagnostic pop
310 #endif
311  if (ret == RPC_SUCCESS){
312  //So we already have a server, and it is alive -- then we don't start
313  ServerSvc->Message(MSG::ERROR,"Server exists and is alive on local host - stopping this thread");
314  pthread_exit(NULL);
315  } else ServerSvc->Message(MSG::WARNING,"Existing server does not respond");
316  } else ServerSvc->Message(MSG::WARNING,"Can not create client for existing server");
317 
318  //Now just force a clearing of the portmap entry
319  ServerSvc->Message(MSG::WARNING,"Clearing existing portmap entry!");
320  pmap_unset(ONCRPCSERVERPROG, ONCRPCSERVERVERS);
321 
322  //Finally clear the error entry by trying to get the port number again
323  port = pmap_getport(&my_addr, ONCRPCSERVERPROG,ONCRPCSERVERVERS,IPPROTO_TCP);
324  }
325 
326  //We should have left either the first or the second call to pmap_getport
327  // with "program not registered" , which is returned as RPC_PROGNOTREGISTERD
328  //or RPC_SYSTEMERROR. However, we could also have failed contacting the portmapper
329  if ((rpc_createerr.cf_stat != RPC_PROGNOTREGISTERED) &&
330  (rpc_createerr.cf_stat != RPC_SYSTEMERROR )){
331  ServerSvc->Message(MSG::ERROR,clnt_spcreateerror("Failed querying portmapper on local host for existing servers"));
332  pthread_exit(NULL);
333  }
334 
335  //The socket to connect to, not bound to a specifc port by default
336  int server_socket = RPC_ANYSOCK;
337 
338  //Check if a specific port was requested
339  if (PortNumber != 0){
340 
341  //Create a socket
342  if ((server_socket = socket(AF_INET, SOCK_STREAM, 0)) != 0) {
343  checkResult(errno,"server thread creating socket",ServerSvc);
344  pthread_exit(NULL);
345  }
346 
347  //Create an inet address with the given port number
348  struct sockaddr_in server_addr;
349  server_addr.sin_family = AF_INET; //IPv4 address
350  server_addr.sin_addr.s_addr = INADDR_ANY; //will bind all interfaces
351  server_addr.sin_port = htons(PortNumber); //port number in network byte order
352  memset(&server_addr.sin_zero, 0, sizeof(server_addr.sin_zero)); //zero padding
353 
354  //Now bind the socket to that inet address
355  if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0){
356  std::ostringstream msg; msg << "server thread binding socket to port " << PortNumber;
357  checkResult(errno,msg.str(),ServerSvc);
358  pthread_exit(NULL);
359  }
360  std::ostringstream msg; msg << "Successfully bound port " << PortNumber;
361  ServerSvc->Message(MSG::INFO,msg.str());
362  }
363 
364  //Get a transport handle using default buffer sizes
365  SVCXPRT * transp = svctcp_create(server_socket, 0, 0);
366 
367  //Check result
368  if (transp == NULL) {
369  ServerSvc->Message(MSG::ERROR,"Opening TCP socket failed");
370  pthread_exit(NULL);
371  }
372 
373  //Next register our server with the RPC daemon
374 #ifndef __APPLE__
375  if (! svc_register(transp,ONCRPCSERVERPROG,ONCRPCSERVERVERS,ONCRPCRequestHandler,IPPROTO_TCP)){
376 #else
377  if (! svc_register(transp,ONCRPCSERVERPROG,ONCRPCSERVERVERS,(void (*)())ONCRPCRequestHandler,IPPROTO_TCP)){
378 #endif
379  ServerSvc->Message(MSG::ERROR,"Could not register ONCRPC Server with RPC daemon");
380  checkResult(errno,"registering ONCRPC Server with RPC daemon",ServerSvc);
381  pthread_exit(NULL);
382  }
383 
384  //A set of socket file descriptors
385  fd_set SocketFileDescriptorSet;
386  //Size of the socket handle table
387  int NFileDescriptors = FD_SETSIZE;
388 
389  //Count the number of requests we have received while running
390  unsigned long NRequests = 0;
391 
392  do {
393 
394  ServerSvc->Message(MSG::VERBOSE,"Waiting for call...");
395 
396  //Get the file descriptor set
397  SocketFileDescriptorSet = svc_fdset;
398 
399  //Wait for input on any of these using select:
400  // - first NULL: not cecking for readiness to write to socket
401  // - second NULL: not checking for socket conditions
402  // - third NULL: timeout - wait forever
403  int ret = select(NFileDescriptors,&SocketFileDescriptorSet,NULL,NULL,NULL);
404  // Check result
405  switch (ret){
406  // an error occured
407  case -1:
408  // If just an interrupt continue
409  if ( errno == EINTR ) continue ;
410  // Else show error
411  checkResult(errno,"server thread returning from select",ServerSvc);
412  return NULL;
413  // a timeout occured - break the loop
414  case 0:
415  break ;
416  // activity on one of the sockets
417  default:
418  //Count number of requests
419  ++NRequests;
420  // Get the requests from the sockets
421  svc_getreqset(&SocketFileDescriptorSet);
422  }
423  } while ( ServerSvc->GetRunServerFlag() );
424 
425  ServerSvc->Message(MSG::DEBUG,"Serving loop finished");
426 
427  //Unregister the service, so no clients can connect anymore
428  svc_unregister(ONCRPCSERVERPROG,ONCRPCSERVERVERS);
429 
430  //Also stop all the dispatching threads, which need to finish before this
431  //one. Otherwise the server will become invalid, before all requests are
432  //served
433 
434  //Tell how many threads we are waiting for
435  std::ostringstream msg; msg << "Waiting for " << dispatchThreads->NumberOfThreads() << " open dispatch threads to terminate ... ";
436  ServerSvc->Message(MSG::INFO,msg.str());
437  //Then wait for them all to finish
439  //Tell when we are done
440  ServerSvc->Message(MSG::INFO, " ... finished all dispatch threads");
441 
442  //Now that the threads are stopped we can finish the transport protocol and
443  //close the port
444  svc_destroy(transp);
445 
446  //Return number of requests - as all local variables will disappear,
447  //the return value needs to be allocated on the heap;
448  unsigned long* NReqPtr = new unsigned long(NRequests);
449  //Terminate this thread
450  pthread_exit(NReqPtr);
451 
452  } catch (std::exception &e){
453  std::ostringstream msg; msg << "Caught exception in ServerThread: " << e.what();
454  ServerSvc->Message(MSG::ERROR,msg.str());
455  }
456 
457  return NULL;
458  }
459 } //namespace
460 
JiveXML::ONCRPCCleanupHandler
void ONCRPCCleanupHandler(void *args)
This cleanup handler is called whenever the server thread exits.
Definition: ONCRPCServerThreads.cxx:241
JiveXML::SetNewEvent
void SetNewEvent(SVCXPRT *transp, const Event *event, IServer *const ServerSvc)
Implementation of ONCRPC_SETEVENT_PROC Set a new event for a certain streams.
Definition: ONCRPCServerProcs.cxx:182
JiveXML::ThreadCollection
This class handles a collection of threads.
Definition: ONCRPCThreadCollection.h:17
JiveXML::ONCRPCDispatchThread
void * ONCRPCDispatchThread(void *args)
This is the thread handling the request - one thread per request.
Definition: ONCRPCServerThreads.cxx:42
JiveXML::DispatchThreadArguments_t::evtReq
const EventRequest * evtReq
Definition: ONCRPCServerThreads.h:47
JiveXML::ReturnStreams
void ReturnStreams(SVCXPRT *transp, IServer *const ServerSvc)
Implementation of ONCRPC_GETSTREAMS_PROC Return the currently available event streams.
Definition: ONCRPCServerProcs.cxx:73
ONCRPC_GETSTATUS_PROC
#define ONCRPC_GETSTATUS_PROC
Definition: ONCRPCServer.h:32
ONCRPCThreadCollection.h
JiveXML::EventRequest_t::RunNumber
int64_t RunNumber
Definition: ONCRPCServer.h:60
JiveXML::Event
struct Event_t Event
Definition: ONCRPCServer.h:65
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
JiveXML::EventRequest
struct EventRequest_t EventRequest
Data structures for GetEvent functions.
Definition: ONCRPCServer.h:57
JiveXML::DispatchThreadArguments_t::evt
const Event * evt
Definition: ONCRPCServerThreads.h:46
ONCRPC_GETSTREAMS_PROC
#define ONCRPC_GETSTREAMS_PROC
Definition: ONCRPCServer.h:33
JiveXML::ReturnState
void ReturnState(SVCXPRT *transp, IServer *const ServerSvc)
Implementation of ONCRPC_ATHENASTATUS_PROC Return the current athena status in XDR representation.
Definition: ONCRPCServerProcs.cxx:63
JiveXML::ThreadCollection::NumberOfThreads
int NumberOfThreads()
Definition: ONCRPCThreadCollection.cxx:119
JiveXML::ONCRPCRequestHandler
void ONCRPCRequestHandler(struct svc_req *rqstp, SVCXPRT *transp)
The Request handler is called from the RPC kernel routines - hence extern C It creates a new dispatch...
Definition: ONCRPCServerThreads.cxx:116
JiveXML::dispatchThreads
ThreadCollection *const dispatchThreads
Definition: ONCRPCServerThreads.cxx:31
ONCRPC_GETEVENT_PROC
#define ONCRPC_GETEVENT_PROC
Definition: ONCRPCServer.h:34
JiveXML::EventRequest_t::EventNumber
int64_t EventNumber
Definition: ONCRPCServer.h:59
rerun_display.client
client
Definition: rerun_display.py:31
JiveXML::ThreadCollection::AddThread
void AddThread(const pthread_t &thread)
Definition: ONCRPCThreadCollection.cxx:34
JiveXML::IMessage::LogLevel
virtual MSG::Level LogLevel() const =0
Get the logging level.
JiveXML::DispatchThreadArguments
struct DispatchThreadArguments_t DispatchThreadArguments
Arguments handed over fromt the main server thread to the thread dispatching the request (one for eac...
Definition: ONCRPCServerThreads.h:40
JiveXML::EventRequest_t
Definition: ONCRPCServer.h:58
JiveXML::ONCRPCServerThread
void * ONCRPCServerThread(void *args)
This is the actual server thread, which takes above arguments.
Definition: ONCRPCServerThreads.cxx:252
JiveXML::ServerThreadArguments_t
Definition: ONCRPCServerThreads.h:23
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
ONCRPCServerProcs.h
JiveXML::ReturnEvent
void ReturnEvent(SVCXPRT *transp, const EventRequest *eventReq, IServer *const ServerSvc)
Implementation of ONCRPC_GETEVENT_PROC Return an event from a certain streams.
Definition: ONCRPCServerProcs.cxx:105
JiveXML::xdr_event_req
bool_t xdr_event_req(XDR *xdrsp, EventRequest *eventReq)
De-/Encoding of EventRequest_t.
Definition: ONCRPCXDRProcs.cxx:32
ret
T ret(T t)
Definition: rootspy.cxx:260
JiveXML::ThreadCollection::JoinAll
void JoinAll()
Definition: ONCRPCThreadCollection.cxx:88
JiveXML::xdr_event
bool_t xdr_event(XDR *xdrsp, Event *event)
De-/Encoding of Event_t.
Definition: ONCRPCXDRProcs.cxx:51
calibdata.exception
exception
Definition: calibdata.py:496
JiveXML::EventRequest_t::StreamName
const char * StreamName
Definition: ONCRPCServer.h:61
ONCRPCXDRProcs.h
ONCRPCServerThreads.h
ONCRPCSERVERPROG
#define ONCRPCSERVERPROG
Definition: ONCRPCServer.h:30
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:21
ONCRPC_SETEVENT_PROC
#define ONCRPC_SETEVENT_PROC
Definition: ONCRPCServer.h:35
JiveXML::IEventServer::GetRunServerFlag
virtual bool GetRunServerFlag() const =0
The server thread will stop once this flag is set to false.
JiveXML::IMessage::Message
virtual void Message(const MSG::Level level, const std::string &msg) const =0
JiveXML::ReturnNull
void ReturnNull(SVCXPRT *transp, IServer *const ServerSvc)
Implementation of NULLPROC Return nothing - server has just been pinged.
Definition: ONCRPCServerProcs.cxx:45
JiveXML::DispatchThreadArguments_t
Definition: ONCRPCServerThreads.h:41
IServer.h
JiveXML::IServer
Pure abstract interface for all full server implementations.
Definition: IServer.h:22
ONCRPCSERVERVERS
#define ONCRPCSERVERVERS
Definition: ONCRPCServer.h:31
JiveXML::ATLAS_THREAD_SAFE
pthread_key_t ServerSvcKey ATLAS_THREAD_SAFE
Definition: ONCRPCServerThreads.cxx:35
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
JiveXML::ThreadCollection::WaitAdd
void WaitAdd()
Definition: ONCRPCThreadCollection.cxx:51
DEBUG
#define DEBUG
Definition: page_access.h:11
JiveXML::checkResult
bool checkResult(const int RetVal, const std::string &Module, IMessage *const ServerSvc)
Simple result checking routine, that will output an errorMsg throught the ServerSvc if there was an e...
Definition: ONCRPCServerProcs.cxx:24
JiveXML::Event_t
Definition: ONCRPCServer.h:66
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
checker_macros.h
Define macros for attributes used to control the static checker.
DerivationFramework::ClustersInCone::select
void select(const xAOD::IParticle *particle, const float coneSize, const xAOD::CaloClusterContainer *clusters, std::vector< bool > &mask)
Definition: ClustersInCone.cxx:14
python.TrigInDetArtSteps.timeout
timeout
Definition: TrigInDetArtSteps.py:35
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
JiveXML::ThreadCollection::RemoveThread
void RemoveThread(const pthread_t &thread)
Definition: ONCRPCThreadCollection.cxx:58
python.CaloScaleNoiseConfig.args
args
Definition: CaloScaleNoiseConfig.py:80