$treeview $search $mathjax $extrastylesheet
otsdaq
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "otsdaq-core/SystemMessenger/SystemMessenger.h" 00002 00003 #include <unistd.h> 00004 #include <cstdio> 00005 #include <cstdlib> 00006 #include <iostream> 00007 00008 using namespace ots; 00009 00010 //======================================================================================================================== 00011 // addSystemMessage 00012 void SystemMessenger::addSystemMessage(std::string targetUser, std::string msg) 00013 { 00014 sysMsgCleanup(); 00015 00016 // reject if same message is already in vector set 00017 // for(uint64_t i=0;i<sysMsgTargetUser_.size();++i) 00018 // if(sysMsgTargetUser_[i] == targetUser && sysMsgMessage_[i] == msg) return; 00019 // reject only if last message 00020 if(sysMsgTargetUser_.size() && 00021 sysMsgTargetUser_[sysMsgTargetUser_.size() - 1] == targetUser && 00022 sysMsgMessage_[sysMsgTargetUser_.size() - 1] == msg) 00023 return; 00024 00025 sysMsgSetLock(true); // set lock 00026 sysMsgTargetUser_.push_back(targetUser); 00027 sysMsgMessage_.push_back(msg); 00028 sysMsgTime_.push_back(time(0)); 00029 sysMsgDelivered_.push_back(false); 00030 sysMsgSetLock(false); // unset lock 00031 00032 std::cout << __COUT_HDR_FL__ 00033 << "Current System Messages: " << sysMsgTargetUser_.size() << std::endl 00034 << std::endl; 00035 } 00036 00037 //======================================================================================================================== 00038 // getSystemMessage 00039 // Deliver | separated system messages (time | msg | time | msg...etc), 00040 // if there is any in vector set for user or for wildcard * 00041 // Empty std::string "" returned if no message for targetUser 00042 // Note: | is an illegal character and will cause GUI craziness 00043 std::string SystemMessenger::getSystemMessage(std::string targetUser) 00044 { 00045 // std::cout << __COUT_HDR_FL__ << "Current System Messages: " << targetUser << 00046 // std::endl << std::endl; 00047 std::string retStr = ""; 00048 int cnt = 0; 00049 char tmp[100]; 00050 for(uint64_t i = 0; i < sysMsgTargetUser_.size(); ++i) 00051 if(sysMsgTargetUser_[i] == targetUser || sysMsgTargetUser_[i] == "*") 00052 { 00053 // deliver system message 00054 if(cnt) 00055 retStr += "|"; 00056 sprintf(tmp, "%lu", sysMsgTime_[i]); 00057 retStr += std::string(tmp) + "|" + sysMsgMessage_[i]; 00058 00059 if(sysMsgTargetUser_[i] != "*") // mark delivered 00060 sysMsgDelivered_[i] = true; 00061 ++cnt; 00062 } 00063 00064 sysMsgCleanup(); 00065 return retStr; 00066 } 00067 00068 //======================================================================================================================== 00069 // sysMsgSetLock 00070 // ALWAYS calling thread with true, must also call with false to release lock 00071 void SystemMessenger::sysMsgSetLock(bool set) 00072 { 00073 while(set && sysMsgLock_) 00074 usleep(1000); // wait for other thread to unlock 00075 sysMsgLock_ = set; 00076 } 00077 00078 //======================================================================================================================== 00079 // sysMsgCleanup 00080 // Cleanup messages if delivered, and targetUser != wildcard * 00081 // For all remaining messages, wait some time before removing (e.g. 30 sec) 00082 void SystemMessenger::sysMsgCleanup() 00083 { 00084 // std::cout << __COUT_HDR_FL__ << "Current System Messages: " << 00085 // sysMsgTargetUser_.size() << std::endl << std::endl; 00086 for(uint64_t i = 0; i < sysMsgTargetUser_.size(); ++i) 00087 if((sysMsgDelivered_[i] && sysMsgTargetUser_[i] != "*") || // delivered and != * 00088 sysMsgTime_[i] + SYS_CLEANUP_WILDCARD_TIME < time(0)) // expired 00089 { 00090 // remove 00091 sysMsgSetLock(true); // set lock 00092 sysMsgTargetUser_.erase(sysMsgTargetUser_.begin() + i); 00093 sysMsgMessage_.erase(sysMsgMessage_.begin() + i); 00094 sysMsgTime_.erase(sysMsgTime_.begin() + i); 00095 sysMsgDelivered_.erase(sysMsgDelivered_.begin() + i); 00096 sysMsgSetLock(false); // unset lock 00097 --i; // rewind 00098 } 00099 // std::cout << __COUT_HDR_FL__ << "Remaining System Messages: " << 00100 // sysMsgTargetUser_.size() << std::endl << std::endl; 00101 }