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