Belle II Software  release-06-02-00
RFFlowStat.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include "daq/rfarm/manager/RFFlowStat.h"
10 
11 using namespace Belle2;
12 using namespace std;
13 
14 RFFlowStat::RFFlowStat(const char* shmname, int id, RingBuffer* rbuf)
15 {
16  m_rfshm = new RFSharedMem(shmname);
17  m_cell = &(m_rfshm->GetCell(id));
18  m_rbuf = rbuf;
19  m_flowsize = 0.0;
20  m_nevtint = 0;
21  m_interval = 100;
22  gettimeofday(&m_t0, 0);
23 }
24 
25 RFFlowStat::RFFlowStat(const char* shmname)
26 {
27  m_rfshm = new RFSharedMem(shmname);
28 }
29 
30 RFFlowStat::~RFFlowStat()
31 {
32 }
33 
34 // Filler function
35 void RFFlowStat::log(int size)
36 {
37  struct timeval tnow;
38 
39  m_cell->nevent++;
40  if (m_rbuf != NULL)
41  m_cell->nqueue = m_rbuf->numq();
42  else
43  m_cell->nqueue = 0;
44  m_flowsize += (float)size;
45  m_nevtint++;
46  if (m_cell->nevent % m_interval == 0) {
47  gettimeofday(&tnow, 0);
48  float delta = (float)((tnow.tv_sec - m_t0.tv_sec) * 1000000 +
49  (tnow.tv_usec - m_t0.tv_usec));
50  m_cell->flowrate = m_flowsize / delta;
51  // m_cell->flowrate = delta;
52  m_cell->avesize = m_flowsize / (float)m_nevtint / 1000.0;
53  m_cell->evtrate = (float)m_nevtint / delta * 1000000.0;
54  m_cell->elapsed = time(NULL);
55  m_flowsize = 0.0;
56  m_nevtint = 0;
57  m_t0 = tnow;
58  }
59 }
60 void RFFlowStat::clear(int cellid)
61 {
62  RfShm_Cell& cell = getinfo(cellid);
63  cell.nevent = 0;
64  cell.nqueue = 0;
65  cell.flowrate = 0;
66  cell.avesize = 0;
67  cell.evtrate = 0;
68  cell.elapsed = 0;
69 }
70 
71 // Retriever function
72 RfShm_Cell& RFFlowStat::getinfo(int id)
73 {
74  return m_rfshm->GetCell(id);
75 }
76 
77 void RFFlowStat::fillNodeInfo(int id, RfNodeInfo* info, bool outflag)
78 {
79  RfShm_Cell& cell = getinfo(id);
80  //DEBUG printf ( "fillNodeInfo: celleid = %d, nevent = %d\n", id, cell.nevent );
81  if (!outflag) {
82  info->nevent_in = cell.nevent;
83  info->nqueue_in = cell.nqueue;
84  info->flowrate_in = cell.flowrate;
85  info->avesize_in = cell.avesize;
86  info->evtrate_in = cell.evtrate;
87  } else {
88  info->nevent_out = cell.nevent;
89  info->nqueue_out = cell.nqueue;
90  info->flowrate_out = cell.flowrate;
91  info->avesize_out = cell.avesize;
92  info->evtrate_out = cell.evtrate;
93  }
94  double loads[3];
95  if (getloadavg(loads, 3) > 0)
96  info->loadave = (float)loads[0];
97 
98  /* Test
99  info->nevent_in = 99999;
100  info->nqueue_in = 123;
101  info->flowrate_in = 10.0;
102  info->avesize_in = 100.0;
103  info->evtrate_in = 1000.0;
104  */
105 
106 }
107 
108 void RFFlowStat::fillProcessStatus(RfNodeInfo* info, int input, int output, int basf2, int hserver, int hrelay)
109 {
110  info->pid_input = input;
111  info->pid_output = output;
112  info->pid_basf2 = basf2;
113  info->pid_hserver = hserver;
114  info->pid_hrelay = hrelay;
115 }
116 
117 
118 
119 
120 
121 
Class to manage a Ring Buffer placed in an IPC shared memory.
Definition: RingBuffer.h:39
Abstract base class for different kinds of events.