Belle II Software  release-05-01-25
NSMNodeDaemon.cc
1 #include "daq/slc/nsm/NSMNodeDaemon.h"
2 
3 #include "daq/slc/nsm/NSMCommunicator.h"
4 #include "daq/slc/base/TimeoutException.h"
5 
6 #include <daq/slc/system/LogFile.h>
7 #include <daq/slc/system/Time.h>
8 
9 #include <daq/slc/base/StringUtil.h>
10 #include <daq/slc/base/ConfigFile.h>
11 
12 #include <cstdlib>
13 #include <cstdio>
14 #include <fstream>
15 
16 using namespace Belle2;
17 
18 void NSMNodeDaemon::add(NSMCallback* callback,
19  const std::string& host, int port)
20 {
21  try {
22  if (callback != NULL && host.size() > 0 && port > 0) {
23  NSMCommunicator* com = new NSMCommunicator();
24  NSMNode& node(callback->getNode());
25  com->init(node, host, port);
26  com->setCallback(callback);
27  callback->init(*com);
28  callback->alloc_open(*com);
29  m_timeout = callback->getTimeout();
30  if (callback->getLogNode().getName().size() == 0) {
31  ConfigFile file("slowcontrol");
32  callback->setLogNode(NSMNode(file.get("log.collector")));
33  }
34  m_callback.push_back(callback);
35  }
36  } catch (const std::exception& e) {
37  LogFile::fatal(e.what());
38  exit(1);
39  }
40 }
41 
42 void NSMNodeDaemon::run()
43 {
44  NSMCommunicatorList& com_v(NSMCommunicator::get());
45  try {
46  {
47  std::string nodename = com_v[0]->getCallback().getNode().getName();
48  std::string filename = ("/tmp/nsmvget." + StringUtil::tolower(nodename));
49  std::ifstream fin(filename.c_str());
50  std::vector<std::string> nodes, vnames;
51  std::string node, vname;
52  while (fin >> node >> vname) {
53  nodes.push_back(node);
54  vnames.push_back(vname);
55  }
56  ::remove(filename.c_str());
57  for (size_t i = 0; i < com_v.size(); i++) {
58  NSMCommunicator& com(*com_v[i]);
59  for (size_t j = 0; j < nodes.size(); j++) {
60  com.getCallback().vget(nodes[j], vnames[j]);
61  }
62  }
63  }
64  double t0 = Time().get();
65  while (true) {
66  try {
67  NSMCommunicator& com(NSMCommunicator::select(m_timeout));
68  com.getCallback().perform(com);
69  } catch (const TimeoutException& e) {}
70  for (size_t i = 0; i < com_v.size(); i++) {
71  NSMCommunicator& com(*com_v[i]);
72  while (com.hasQueue()) {
73  com.setMessage(com.popQueue());
74  com.getCallback().perform(com);
75  }
76  }
77  double t = Time().get();
78  if (t - t0 >= m_timeout) {
79  for (size_t i = 0; i < com_v.size(); i++) {
80  NSMCommunicator& com(*com_v[i]);
81  com.getCallback().timeout(com);
82  com.getCallback().alloc_open(com);
83  }
84  t0 = t;
85  }
86  }
87  } catch (const std::exception& e) {
88  LogFile::fatal("NSM node brdge : Caught exception %s\n"
89  "Terminate process...", e.what());
90  }
91  for (size_t i = 0; i < com_v.size(); i++) {
92  NSMCommunicator& com(*com_v[i]);
93  com.getCallback().term();
94  }
95 }
96 
prepareAsicCrosstalkSimDB.e
e
aux.
Definition: prepareAsicCrosstalkSimDB.py:53
Belle2::NSMNode
Definition: NSMNode.h:14
Belle2::NSMCommunicator
Definition: NSMCommunicator.h:25
Belle2::NSMCallback
Definition: NSMCallback.h:24
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
alignment.constraints_generator.filename
filename
File name.
Definition: constraints_generator.py:224
Belle2::Time
Definition: Time.h:14
Belle2::TimeoutException
Definition: TimeoutException.h:12
Belle2::ConfigFile
Definition: ConfigFile.h:15