2 #include <daq/roisend/RoiSenderCallback.h>
18 void* RunRoiSenderLogger(
void*)
20 s_roisender->server();
27 RoiSenderCallback::RoiSenderCallback()
30 m_conf =
new RFConf(getenv(
"ROISENDER_CONFFILE"));
41 char* nodename = m_conf->getconf(
"roisender",
"nodename");
43 string execdir = string(m_conf->getconf(
"roisender",
"execdir"));
44 printf(
"execdir = %s\n", execdir.c_str());
46 mkdir(execdir.c_str(), 0755);
47 chdir(execdir.c_str());
53 if (!m_log) m_log =
new RFLogManager(nodename, nodename);
60 char* merger = m_conf->getconf(
"roisender",
"merger");
61 char* mergerport = m_conf->getconf(
"roisender",
"mergerport");
63 char* onsenhost = m_conf->getconf(
"roisender",
"onsenhost");
64 char* onsenport = m_conf->getconf(
"roisender",
"onsenport");
66 string shmname = string(m_conf->getconf(
"system",
"unitname")) +
":" +
67 string(m_conf->getconf(
"roisender",
"nodename"));
70 sprintf(idbuf,
"%2.2d", 0);
71 m_pid_merger = m_proc->Execute(merger, (
char*)shmname.c_str(), idbuf, onsenhost, onsenport, mergerport);
76 pthread_attr_t thread_attr;
77 pthread_attr_init(&thread_attr);
81 pthread_create(&m_logthread, NULL, RunRoiSenderLogger, NULL);
85 void RoiSenderCallback::start(
int ,
int )
87 if (m_pid_merger != 0) {
88 int pid = m_pid_merger;
90 LogFile::info(
"Send SIGUSR1 to (pid=%d)", pid);
94 void RoiSenderCallback::stop(
void)
96 if (m_pid_merger != 0) {
97 int pid = m_pid_merger;
99 LogFile::info(
"Send SIGUSR2 to (pid=%d)", pid);
103 void RoiSenderCallback::abort(
void)
106 if (m_pid_merger != 0) {
107 int pid = m_pid_merger;
109 LogFile::info(
"kill merger (pid=%d) with SIGINT ", pid);
112 for (
int i = 0; m_pid_merger; i++) {
114 int pid = m_pid_merger;
117 LogFile::warning(
"kill merger (pid=%d) with SIGKILL", pid);
120 LogFile::error(
"killing merger (pid=%d) did not work", pid);
127 void RoiSenderCallback::recover(
const DBObject&,
const std::string&)
135 char* merger = m_conf->getconf(
"roisender",
"merger");
136 char* mergerport = m_conf->getconf(
"roisender",
"mergerport");
138 char* onsenhost = m_conf->getconf(
"roisender",
"onsenhost");
139 char* onsenport = m_conf->getconf(
"roisender",
"onsenport");
141 string shmname = string(m_conf->getconf(
"system",
"unitname")) +
":" +
142 string(m_conf->getconf(
"roisender",
"nodename"));
145 sprintf(idbuf,
"%2.2d", 0);
146 m_pid_merger = m_proc->Execute(merger, (
char*)shmname.c_str(), idbuf, onsenhost, onsenport, mergerport);
150 void RoiSenderCallback::server()
153 pid_t pid = m_proc->CheckProcess();
158 if (pid == m_pid_merger) {
159 if (getNode().getState() == RCState::LOADING_TS
160 || getNode().getState() == RCState::STARTING_TS || getNode().getState() == RCState::STOPPING_TS
161 || getNode().getState() == RCState::READY_S || getNode().getState() == RCState::RUNNING_S) {
163 m_log->Fatal(
"RoiSenderCallback : merger2merge dead. pid = %d\n", pid);
164 setState(RCState::ERROR_ES);
166 m_log->Info(
"RoiSenderCallback : merger2merge dead. pid = %d\n", pid);
171 }
else if (pid < 0) {
172 perror(
"RoiSenderCallback::server");
174 int st = m_proc->CheckOutput();
179 perror(
"RoiSenderCallback::server");
181 m_log->ProcessLog(m_proc->GetFd());