9 #include <daq/roisend/RoiSenderCallback.h>
12 #include <sys/types.h>
25 void* RunRoiSenderLogger(
void*)
27 s_roisender->server();
34 RoiSenderCallback::RoiSenderCallback()
37 m_conf =
new RFConf(getenv(
"ROISENDER_CONFFILE"));
48 char* nodename = m_conf->getconf(
"roisender",
"nodename");
50 string execdir = string(m_conf->getconf(
"roisender",
"execdir"));
51 printf(
"execdir = %s\n", execdir.c_str());
53 mkdir(execdir.c_str(), 0755);
54 chdir(execdir.c_str());
60 if (!m_log) m_log =
new RFLogManager(nodename, nodename);
67 char* merger = m_conf->getconf(
"roisender",
"merger");
68 char* mergerport = m_conf->getconf(
"roisender",
"mergerport");
70 char* onsenhost = m_conf->getconf(
"roisender",
"onsenhost");
71 char* onsenport = m_conf->getconf(
"roisender",
"onsenport");
73 string shmname = string(m_conf->getconf(
"system",
"unitname")) +
":" +
74 string(m_conf->getconf(
"roisender",
"nodename"));
77 sprintf(idbuf,
"%2.2d", 0);
78 m_pid_merger = m_proc->Execute(merger, (
char*)shmname.c_str(), idbuf, onsenhost, onsenport, mergerport);
83 pthread_attr_t thread_attr;
84 pthread_attr_init(&thread_attr);
88 pthread_create(&m_logthread, NULL, RunRoiSenderLogger, NULL);
92 void RoiSenderCallback::start(
int ,
int )
94 if (m_pid_merger != 0) {
95 int pid = m_pid_merger;
97 LogFile::info(
"Send SIGUSR1 to (pid=%d)", pid);
101 void RoiSenderCallback::stop(
void)
103 if (m_pid_merger != 0) {
104 int pid = m_pid_merger;
106 LogFile::info(
"Send SIGUSR2 to (pid=%d)", pid);
110 void RoiSenderCallback::abort(
void)
113 if (m_pid_merger != 0) {
114 int pid = m_pid_merger;
116 LogFile::info(
"kill merger (pid=%d) with SIGINT ", pid);
119 for (
int i = 0; m_pid_merger; i++) {
121 int pid = m_pid_merger;
124 LogFile::warning(
"kill merger (pid=%d) with SIGKILL", pid);
127 LogFile::error(
"killing merger (pid=%d) did not work", pid);
134 void RoiSenderCallback::recover(
const DBObject&,
const std::string&)
142 char* merger = m_conf->getconf(
"roisender",
"merger");
143 char* mergerport = m_conf->getconf(
"roisender",
"mergerport");
145 char* onsenhost = m_conf->getconf(
"roisender",
"onsenhost");
146 char* onsenport = m_conf->getconf(
"roisender",
"onsenport");
148 string shmname = string(m_conf->getconf(
"system",
"unitname")) +
":" +
149 string(m_conf->getconf(
"roisender",
"nodename"));
152 sprintf(idbuf,
"%2.2d", 0);
153 m_pid_merger = m_proc->Execute(merger, (
char*)shmname.c_str(), idbuf, onsenhost, onsenport, mergerport);
157 void RoiSenderCallback::server()
160 pid_t pid = m_proc->CheckProcess();
165 if (pid == m_pid_merger) {
166 if (getNode().getState() == RCState::LOADING_TS
167 || getNode().getState() == RCState::STARTING_TS || getNode().getState() == RCState::STOPPING_TS
168 || getNode().getState() == RCState::READY_S || getNode().getState() == RCState::RUNNING_S) {
170 m_log->Fatal(
"RoiSenderCallback : merger2merge dead. pid = %d\n", pid);
171 setState(RCState::ERROR_ES);
173 m_log->Info(
"RoiSenderCallback : merger2merge dead. pid = %d\n", pid);
178 }
else if (pid < 0) {
179 perror(
"RoiSenderCallback::server");
181 int st = m_proc->CheckOutput();
186 perror(
"RoiSenderCallback::server");
188 m_log->ProcessLog(m_proc->GetFd());
void load(const DBObject &, const std::string &) override
overloaded functions from base class
Abstract base class for different kinds of events.