CMSDK  2.0.1
ProcessMemory.h
1 #if !defined(_PROCESSMEMORY_H_)
2 #define _PROCESSMEMORY_H_
3 
4 #include "MemoryManager.h"
5 #include "PsyTime.h"
6 #include "HTML.h"
7 
8 namespace cmlabs {
9 
10 #define SIGNALQ_ID 0
11 #define MSGQ_ID 1
12 #define REQQ_ID 2
13 #define CMDQ_ID 3
14 
15 #define MAXPROC 64
16 #define MAXPROC4 256
17 
18 #define PSYPROC_ERROR 0
19 #define PSYPROC_CREATED 1
20 #define PSYPROC_INIT 2
21 #define PSYPROC_IDLE 3
22 #define PSYPROC_READY 4
23 #define PSYPROC_ACTIVE 5
24 #define PSYPROC_SHUTTING_DOWN 6
25 #define PSYPROC_TERMINATED 7
26 
27 #define CMDQ_TYPE 1
28 #define MSGQ_TYPE 2
29 #define SIGQ_TYPE 3
30 #define REQQ_TYPE 4
31 
32 THREAD_RET THREAD_FUNCTION_CALL QueueTest(THREAD_ARG arg);
33 THREAD_RET THREAD_FUNCTION_CALL ProcessMemoryPerfTest(THREAD_ARG arg);
34 
35 struct ProcessStats {
36  uint64 time;
37  uint64 msgInCount;
38  uint64 msgInBytes;
39  char recentInMsg[10 * DRAFTMSGSIZE];
40  uint64 msgOutCount;
41  uint64 msgOutBytes;
42  char recentOutMsg[10 * DRAFTMSGSIZE];
43  uint64 procMemUsage;
44  uint64 currentCPUTicks;
45 
46  std::string toXML() {
47  std::string xmlIn, xmlOut;
48  int n;
49  const char* oldData = NULL;
50  DataMessage* msg = new DataMessage();
51  char* msgData = recentInMsg;
52  for (n = 0; n < 10; n++) {
53  if (((DataMessageHeader*)msgData)->time) {
54  if (!oldData) oldData = msg->swapMessageData(msgData);
55  else msg->swapMessageData(msgData);
56  xmlIn += msg->toXML();
57  }
58  msgData += DRAFTMSGSIZE;
59  }
60  msgData = recentOutMsg;
61  for (n = 0; n < 10; n++) {
62  if (((DataMessageHeader*)msgData)->time) {
63  if (!oldData) oldData = msg->swapMessageData(msgData);
64  else msg->swapMessageData(msgData);
65  xmlOut += msg->toXML();
66  }
67  msgData += DRAFTMSGSIZE;
68  }
69  if (oldData)
70  msg->swapMessageData(oldData);
71  delete(msg);
72  return utils::StringFormat("<processstats msgincount=\"%llu\" msginbytes=\"%llu\" msgoutcount=\"%llu\" msgoutbytes=\"%llu\" time=\"%llu\" memusage=\"%llu\">\n<inmsg>\n%s</inmsg>\n<outmsg>\n%s</outmsg>\n</processstats>\n",
73  msgInCount, msgInBytes, msgOutCount, msgOutBytes, time, procMemUsage, xmlIn.c_str(), xmlOut.c_str());
74  }
75 };
76 
78  uint32 id; // id, corresponds to the index in map
79  uint16 nodeID; // Node ID
80  uint64 createdTime; // time of creation
81  uint64 lastseen; // last status update
82  uint8 status; // status of the process
83  uint32 osID; // id of OS process
84  uint8 type; // type 0: normal, 1: inside Node
85 // stats(activity)
86  char name[MAXKEYNAMELEN+1]; // name in text
87  char commandline[MAXCOMMANDLINELEN+1]; // commandline in text
88  ProcessStats stats;
89  AveragePerfStats perfStats;
90  uint16 cmdQID;
91  uint16 msgQID;
92  uint16 sigQID;
93  uint16 reqQID;
94 
95  std::string toXML() {
96  return utils::StringFormat("<space id=\"%u\" name=\"%s\" node=\"%u\" status=\"%u\" osid=\"%u\" commandline=\"%s\" created=\"%llu\" lastseen=\"%llu\">\n%s%s</space>",
97  id, name, nodeID, status, osID, html::EncodeHTML(commandline).c_str(), createdTime, lastseen, stats.toXML().c_str(), perfStats.toXML().c_str());
98  }
99 };
100 
102  uint64 size;
103  uint32 cid;
104  uint64 createdTime; // time of creation
105  uint32 count;
106  uint64 usage;
107  ProcessInfoStruct processes[MAXPROC];
108  uint64 qIndex[MAXPROC*4];
109 };
110 
111 #define INITIALQSIZE sizeof(MessageQueueHeader) + 2048
112 struct MessageQueueHeader {
113  uint64 size;
114  uint32 id;
115  uint32 count;
116  uint64 startPos;
117  uint64 endPos;
118  uint64 padding;
119  char name[MAXKEYNAMELEN+1]; // name for mutex
120 };
121 
122 #define CHECKPROCESSMEMORYSERIAL if (serial != master->getProcessShmemSerial()) {if (!open()) {mutex->leave();return 0;}}
123 
124 class MasterMemory;
126 public:
127  static bool UnitTest();
128  static bool PerfTest();
129 
130  ProcessMemory(MasterMemory* master);
131  ~ProcessMemory();
132 
133  bool getMemoryUsage(uint64& alloc, uint64& usage);
134  std::vector<ProcessInfoStruct>* getAllProcesses();
135  bool checkProcessHeartbeats(uint32 timeoutMS, std::list<ProcessInfoStruct>& procIssues);
136 
137  bool open();
138  bool create(uint32 initialProcCount);
139 
140  // Processes
141  bool createNewProcess(const char* name, uint16 &id);
142  bool deleteProcess(uint16 id);
143 
144  // Process Info
145  bool getProcessName(uint16 id, char* name, uint32 maxSize);
146  bool getProcessID(const char* name, uint16 &id);
147  uint64 getProcessCreateTime(uint16 id);
148 
149  uint8 getProcessStatus(uint16 id, uint64& lastseen);
150  uint8 getProcessStatus(uint16 id, uint64& lastseen, uint64& createTime);
151  bool getProcessCommandLine(uint16 id, char* cmdline, uint32 maxSize);
152  uint16 getProcessIDFromOSID(uint32 osid);
153  uint32 getProcessOSID(uint16 id);
154 
155  bool setProcessStatus(uint16 id, uint8 status, uint64 currentCPUTicks = 0);
156  bool setProcessCommandLine(uint16 id, const char* cmdline);
157  bool setProcessOSID(uint16 id, uint32 osid);
158  bool setProcessType(uint16 id, uint8 type);
159 
160  AveragePerfStats getProcessPerfStats(uint16 procID);
161  bool setProcessPerfStats(uint16 procID, AveragePerfStats &perfStruct);
162 
163  bool addToProcessStats(uint16 id, DataMessage* inputMsg, DataMessage* outputMsg);
164 
165  // Process Queues
166  bool addToCmdQ(uint16 procID, DataMessage* msg);
167  bool addToMsgQ(uint16 procID, DataMessage* msg);
168  bool addToSigQ(uint16 procID, DataMessage* msg);
169  bool addToReqQ(uint16 procID, DataMessage* msg);
170  bool addToAllSignalQs(DataMessage* msg);
171  bool addToAllSignalQsExcept(DataMessage* msg, uint16 except);
172 
173  DataMessage* waitForCmdQ(uint16 procID, uint32 timeout);
174  DataMessage* waitForMsgQ(uint16 procID, uint32 timeout);
175  DataMessage* waitForSigQ(uint16 procID, uint32 timeout);
176  DataMessage* waitForReqQ(uint16 procID, uint32 timeout);
177 
178  uint32 getCmdQCount(uint16 procID);
179  uint32 getMsgQCount(uint16 procID);
180  uint32 getSigQCount(uint16 procID);
181  uint32 getReqQCount(uint16 procID);
182 
183  bool getQueueSizes(uint16 procID, uint64 &bytes, uint32 &count);
184  bool addLocalPerformanceStats(std::list<PerfStats> &perfStats);
185 
186 private:
187  bool resize(uint64 newMemorySize);
188  bool setupNextAvailableQ(uint16& qID);
189  bool deleteQ(uint16 id);
190  bool resizeQ(uint16 id, uint64 newSize);
191 
192  bool printQ(MessageQueueHeader* qHeader);
193 
194  MessageQueueHeader* getQHeader(uint16 procID, uint8 qType);
195  bool addToQ(uint16 procID, uint8 qType, DataMessage* msg);
196  DataMessage* waitForQ(uint16 procID, uint8 qType, uint32 timeout);
197 
198  utils::Mutex* mutex;
199  MasterMemory* master;
200  ProcessMemoryStruct* header;
201  uint64 memorySize;
202  uint16 port;
203  uint32 serial;
204 
205  utils::Semaphore* qSemaphores[MAXPROC4];
206 };
207 
208 } // namespace cmlabs
209 
210 #endif //_PROCESSMEMORY_H_
211 
Definition: ProcessMemory.h:35
Definition: MemoryManager.h:169
Definition: ProcessMemory.h:77
Definition: Bitmap.h:7
Definition: DataMessage.h:54
Definition: ProcessMemory.h:125
Definition: Utils.h:299
Definition: Utils.h:276
std::string toXML(std::map< uint16, std::string > *subtypes=NULL, std::map< uint16, std::string > *subcontexts=NULL, std::map< uint32, std::string > *compNames=NULL)
Definition: DataMessage.cpp:775
Definition: MemoryQueues.h:11
Definition: ProcessMemory.h:101
Definition: MemoryManager.h:76
const char * swapMessageData(const char *data)
Definition: DataMessage.cpp:1399
Definition: DataMessage.h:95