Belle II Software  release-05-01-25
EventServerCallback.cc
1 #include "daq/expreco/EventServerCallback.h"
2 
3 #include <unistd.h>
4 
5 #include <sys/stat.h>
6 #include <sys/wait.h>
7 
8 using namespace Belle2;
9 using namespace std;
10 
11 static EventServerCallback* s_eventserver = NULL;
12 
13 //-----------------------------------------------------------------
14 // Rbuf-Read Thread Interface
15 //-----------------------------------------------------------------
16 void* RunEventServerLogger(void*)
17 {
18  s_eventserver->EventServerLogger();
19  return NULL;
20 }
21 
22 
23 
24 
25 EventServerCallback::EventServerCallback()
26 {
27  // Conf file
28 
29  // 0. Initialize configuration manager
30  m_conf = new RFConf(getenv("ERECO_CONFFILE"));
31 
32  s_eventserver = this;
33 }
34 
35 EventServerCallback::~EventServerCallback() noexcept
36 {
37 
38 }
39 
40 void EventServerCallback::load(const DBObject&)
41 {
42 
43  // 1. Set execution directory
44  char* nodename = m_conf->getconf("eventsampler", "server", "nodename");
45  string execdir = string(m_conf->getconf("system", "execdir_base")) + "/eventserver";
46  printf("execdir = %s\n", execdir.c_str());
47 
48  mkdir(execdir.c_str(), 0755);
49  chdir(execdir.c_str());
50 
51  // 2. Initialize process manager
52  m_proc = new RFProcessManager(nodename);
53 
54  // 3. Initialize log manager
55  m_log = new RFLogManager(nodename);
56 
57 
58  // 4. EventServer
59  char* server = m_conf->getconf("eventsampler", "server", "script");
60  char* rbuf = m_conf->getconf("eventsampler", "ringbufout");
61  char* port = m_conf->getconf("eventsampler", "server", "port");
62  m_pid_server = m_proc->Execute(server, rbuf, port);
63 
64  sleep(2);
65 
66  // 6. Start Logger
67  pthread_attr_t thread_attr;
68  pthread_attr_init(&thread_attr);
69  // pthread_attr_setschedpolicy(&thread_attr , SCHED_FIFO);
70  // pthread_attr_setdetachstate(&thread_attr , PTHREAD_CREATE_DETACHED);
71  // pthread_t thr_input;
72  pthread_create(&m_logthread, NULL, RunEventServerLogger, NULL);
73 
74 }
75 
76 void EventServerCallback::start()
77 {
78 }
79 
80 void EventServerCallback::stop()
81 {
82 }
83 
84 void EventServerCallback::abort()
85 {
86  // Kill processes
87  int status;
88  if (m_pid_server != 0) {
89  kill(m_pid_server, SIGINT);
90  waitpid(m_pid_server, &status, 0);
91  LogFile::info("killed event server (pid=%d)", m_pid_server);
92  }
93 
94  pthread_cancel(m_logthread);
95 
96 }
97 
98 void EventServerCallback::recover(const DBObject&)
99 {
100 
101 }
102 
103 void EventServerCallback::EventServerLogger()
104 {
105  while (true) {
106  int st = m_proc->CheckOutput();
107  if (st < 0) {
108  perror("EventServerLogger::server");
109  // exit ( -1 );
110  } else if (st > 0) {
111  m_log->ProcessLog(m_proc->GetFd());
112  }
113  }
114 }
115 
116 
117 
Belle2::DBObject
Definition: DBObject.h:14
Belle2::RFLogManager
Definition: RFLogManager.h:18
Belle2::EventServerCallback
Definition: EventServerCallback.h:19
Belle2::RFProcessManager
Definition: RFProcessManager.h:22
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::RFConf
Definition: RFConf.h:24