otsdaq  v2_03_00
SystemMessenger.cc
1 #include "otsdaq-core/SystemMessenger/SystemMessenger.h"
2 
3 #include <unistd.h>
4 #include <cstdio>
5 #include <cstdlib>
6 #include <iostream>
7 
8 using namespace ots;
9 
10 //========================================================================================================================
11 // addSystemMessage
12 void SystemMessenger::addSystemMessage(std::string targetUser, std::string msg)
13 {
14  sysMsgCleanup();
15 
16  // reject if same message is already in vector set
17  // for(uint64_t i=0;i<sysMsgTargetUser_.size();++i)
18  // if(sysMsgTargetUser_[i] == targetUser && sysMsgMessage_[i] == msg) return;
19  // reject only if last message
20  if(sysMsgTargetUser_.size() &&
21  sysMsgTargetUser_[sysMsgTargetUser_.size() - 1] == targetUser &&
22  sysMsgMessage_[sysMsgTargetUser_.size() - 1] == msg)
23  return;
24 
25  sysMsgSetLock(true); // set lock
26  sysMsgTargetUser_.push_back(targetUser);
27  sysMsgMessage_.push_back(msg);
28  sysMsgTime_.push_back(time(0));
29  sysMsgDelivered_.push_back(false);
30  sysMsgSetLock(false); // unset lock
31 
32  std::cout << __COUT_HDR_FL__
33  << "Current System Messages: " << sysMsgTargetUser_.size() << std::endl
34  << std::endl;
35 }
36 
37 //========================================================================================================================
38 // getSystemMessage
39 // Deliver | separated system messages (time | msg | time | msg...etc),
40 // if there is any in vector set for user or for wildcard *
41 // Empty std::string "" returned if no message for targetUser
42 // Note: | is an illegal character and will cause GUI craziness
43 std::string SystemMessenger::getSystemMessage(std::string targetUser)
44 {
45  // std::cout << __COUT_HDR_FL__ << "Current System Messages: " << targetUser <<
46  // std::endl << std::endl;
47  std::string retStr = "";
48  int cnt = 0;
49  char tmp[100];
50  for(uint64_t i = 0; i < sysMsgTargetUser_.size(); ++i)
51  if(sysMsgTargetUser_[i] == targetUser || sysMsgTargetUser_[i] == "*")
52  {
53  // deliver system message
54  if(cnt)
55  retStr += "|";
56  sprintf(tmp, "%lu", sysMsgTime_[i]);
57  retStr += std::string(tmp) + "|" + sysMsgMessage_[i];
58 
59  if(sysMsgTargetUser_[i] != "*") // mark delivered
60  sysMsgDelivered_[i] = true;
61  ++cnt;
62  }
63 
64  sysMsgCleanup();
65  return retStr;
66 }
67 
68 //========================================================================================================================
69 // sysMsgSetLock
70 // ALWAYS calling thread with true, must also call with false to release lock
71 void SystemMessenger::sysMsgSetLock(bool set)
72 {
73  while(set && sysMsgLock_)
74  usleep(1000); // wait for other thread to unlock
75  sysMsgLock_ = set;
76 }
77 
78 //========================================================================================================================
79 // sysMsgCleanup
80 // Cleanup messages if delivered, and targetUser != wildcard *
81 // For all remaining messages, wait some time before removing (e.g. 30 sec)
82 void SystemMessenger::sysMsgCleanup()
83 {
84  // std::cout << __COUT_HDR_FL__ << "Current System Messages: " <<
85  // sysMsgTargetUser_.size() << std::endl << std::endl;
86  for(uint64_t i = 0; i < sysMsgTargetUser_.size(); ++i)
87  if((sysMsgDelivered_[i] && sysMsgTargetUser_[i] != "*") || // delivered and != *
88  sysMsgTime_[i] + SYS_CLEANUP_WILDCARD_TIME < time(0)) // expired
89  {
90  // remove
91  sysMsgSetLock(true); // set lock
92  sysMsgTargetUser_.erase(sysMsgTargetUser_.begin() + i);
93  sysMsgMessage_.erase(sysMsgMessage_.begin() + i);
94  sysMsgTime_.erase(sysMsgTime_.begin() + i);
95  sysMsgDelivered_.erase(sysMsgDelivered_.begin() + i);
96  sysMsgSetLock(false); // unset lock
97  --i; // rewind
98  }
99  // std::cout << __COUT_HDR_FL__ << "Remaining System Messages: " <<
100  // sysMsgTargetUser_.size() << std::endl << std::endl;
101 }