1 #include "daq/slc/readout/ProcessController.h"
3 #include "daq/slc/readout/ProcessListener.h"
4 #include "daq/slc/readout/LogListener.h"
5 #include "daq/slc/runcontrol/RCHandlerException.h"
7 #include "daq/slc/system/Executor.h"
8 #include "daq/slc/system/PThread.h"
9 #include "daq/slc/system/LogFile.h"
11 #include "daq/slc/base/StringUtil.h"
12 #include <daq/slc/system/LockGuard.h>
20 bool ProcessController::init(
const std::string& parname,
int nodeid)
22 m_name = StringUtil::tolower(m_callback->getNode().getName());
24 LogFile::open(m_name +
"_" + m_parname);
25 if (!m_info.open(m_name +
"_" + m_parname, nodeid,
true)) {
28 m_callback->add(
new NSMVHandlerInt(m_parname +
".pid",
true,
false, 0),
false,
false);
32 void ProcessController::clear()
37 bool ProcessController::waitReady(
int timeout)
39 if (!m_info.waitReady(timeout)) {
45 bool ProcessController::load(
int timeout)
49 m_process.kill(SIGABRT);
50 if (pipe(m_iopipe) < 0) {
59 if (!m_info.waitReady(timeout)) {
64 m_callback->set(m_parname +
".pid", m_process.get_id());
68 bool ProcessController::start(
int expno,
int runno)
71 m_info.setExpNumber(expno);
72 m_info.setRunNumber(runno);
73 m_info.setSubNumber(0);
82 bool ProcessController::stop()
85 m_info.setExpNumber(0);
86 m_info.setRunNumber(0);
87 m_info.setSubNumber(0);
88 m_info.setInputCount(0);
89 m_info.setInputNBytes(0);
90 m_info.setOutputCount(0);
91 m_info.setOutputNBytes(0);
95 bool ProcessController::pause()
98 if (m_info.isRunning()) {
99 m_info.setState(RunInfoBuffer::PAUSED);
101 LogFile::warning(
"Process is not running. Pause request was ignored.");
106 bool ProcessController::resume()
109 if (m_info.isPaused()) {
110 m_info.setState(RunInfoBuffer::RUNNING);
112 LogFile::warning(
"Process is not paused. Resume request was ignored.");
117 bool ProcessController::abort(
unsigned int timeout)
120 m_process.kill(SIGINT);
122 bool sigintWasSuccessful =
false;
123 for (
unsigned int timer = 0; timer < timeout; ++timer) {
124 if (not m_process.isAlive()) {
125 sigintWasSuccessful =
true;
132 if (sigintWasSuccessful) {
133 LogFile::debug(
"Process successfully killed with SIGINT.");
135 LogFile::warning(
"Process could not be killed with SIGINT, sending SIGABRT.");
136 m_process.kill(SIGABRT);
139 if (m_callback != NULL)
140 m_callback->set(m_parname +
".pid", -1);
143 m_th_process.cancel();
149 void ProcessSubmitter::run()
152 dup2(m_iopipe[1], 1);
154 dup2(m_iopipe[1], 2);
157 if (m_con->getExecutable().size() == 0) {
158 m_con->setExecutable(
"basf2");
160 executor.setExecutable(m_con->getExecutable());
161 for (
size_t i = 0; i < m_con->m_arg_v.size(); i++) {
162 executor.addArg(m_con->m_arg_v[i]);
167 void ProcessController::addArgument(
const char* format, ...)
170 static char ss[1024];
171 va_start(ap, format);
172 vsprintf(ss, format, ap);
174 m_arg_v.push_back(ss);