2 * Copyright (c) 2013, TOYOTA MOTOR CORPORATION.
4 * This program is licensed under the terms and conditions of the
5 * Apache License, version 2.0. The full text of the Apache License is at
6 * http://www.apache.org/licenses/LICENSE-2.0
17 #include "CicoSCSysResourceMonitor.h"
21 const char* rdTgtCPU = "/proc/stat";
22 const char sP1C = 'c';
23 const char sP2P = 'p';
24 const char sP3U = 'u';
25 const int nDmyCpuCnt = 17; // CPU(16) + Total(1)
27 const double dCarryUp = 10000;
29 const char* rdTgtMEM = "/proc/meminfo";
30 const string rdMEMTag1 = "MemFree:";
31 const string rdMEMTag2 = "MemTotal:";
36 CicoSCSysResourceMonitor::CicoSCSysResourceMonitor()
38 ICO_TRA("start constructor");
40 m_old = (stat_data_t*)0;
41 m_current = (stat_data_t*)0;
42 m_calc = (stat_data_t*)0;
47 ICO_TRA("end constructor");
53 CicoSCSysResourceMonitor::~CicoSCSysResourceMonitor()
55 ICO_TRA("start destructor");
56 if ((stat_data_t*)0 != m_old) {
58 m_old = (stat_data_t*)0;
60 if ((stat_data_t*)0 != m_current) {
62 m_current = (stat_data_t*)0;
64 if ((stat_data_t*)0 != m_calc) {
66 m_calc = (stat_data_t*)0;
68 ICO_TRA("end destructor");
73 * @param cpu core cpu position -1:all 0-n:cpu position
74 * @return cpu usage(return value/100 = 0.00 - 100.00%)
77 int CicoSCSysResourceMonitor::getCPUtime(E_USAGETYPE e, int cpu) const
79 if (g_RC_LOG) ICO_TRA("start %d, %d", e, cpu);
80 if (false == isAllReady()) {
81 ICO_TRA("is no ready!");
85 if ((0 > n) || (m_CPUcnt <= n)) {
86 if (g_RC_LOG) ICO_TRA("end cpu count error %d, %d", n, m_CPUcnt);
91 case E_user: // 1) Time spent in user mode.
94 case E_nice: // 2) Time spent in user mode with low priority (nice).
97 case E_system: // 3) Time spent in system mode.
100 case E_idle: // 4) Time spent in the idle task.
103 case E_iowait: // 5) Time waiting for I/O to complete.
104 r = m_calc[n].iowait;
106 case E_irq: // 6) Time servicing interrupts.
109 case E_softirq: // 7) Time servicing softirqs.
110 r = m_calc[n].softirq;
112 case E_steal: // 8) Time stolen
115 case E_guest: // 9) Time Guest OS
118 case E_guest_nice: // 10) Time guest OS(nice)
119 r = m_calc[n].guest_nice;
124 if (g_RC_LOG) ICO_TRA("end success ret(%d)", r);
131 void CicoSCSysResourceMonitor::monitoring()
133 if (g_RC_LOG) ICO_TRA("call getResource");
139 * CPU usage and free memory size get
141 void CicoSCSysResourceMonitor::getResource()
143 if (g_RC_LOG) ICO_TRA("call get resource CPU,MEM");
149 * @brief getResourceCPU
151 void CicoSCSysResourceMonitor::getResourceCPU()
154 m_CPUcnt = createCurrentCPU();
155 size_t sz = m_CPUcnt + 1;
157 m_old = new stat_data_t[sz];
160 m_calc = new stat_data_t[sz];
162 ICO_DBG("cpu count is %d", m_CPUcnt);
165 if (((stat_data_t*)0 == m_old) || ((stat_data_t*)0 == m_current) ||
166 ((stat_data_t*)0 == m_calc)) {
167 ICO_DBG("error none new area");
171 size_t sz = m_CPUcnt + 1;
172 memcpy(m_old, m_current, sizeof(stat_data_t)*sz);
173 // read current value
176 for (size_t i=0; i < sz; i++) {
177 usageCalcCPU(m_old[i], m_current[i], m_calc[i]);
180 if (g_RC_LOG) ICO_TRA("calc");
184 * @brief CPU usage first read
185 * area allocation and read
187 * @return CPU core count
189 int CicoSCSysResourceMonitor::createCurrentCPU()
191 if (0 != m_current) {
192 ICO_TRA("ret(0) current is zero!");
196 stat_data_t tmp[nDmyCpuCnt];
197 memset(tmp, 0, sizeof(tmp));
198 cnt = readProcStatCPU(tmp, nDmyCpuCnt-1);
200 ICO_TRA("ret(0) cnt is zero!");
204 m_current = new stat_data_t[sz];
205 memcpy(m_current, tmp, sizeof(stat_data_t)*sz);
206 ICO_TRA("ret cpu core count(%d)", cnt);
211 * @brief CPU usage read
213 void CicoSCSysResourceMonitor::readCurrentCPU()
215 readProcStatCPU(m_current, m_CPUcnt);
219 * @brief read /proc/stat CPU information
220 * @param sdtp destination read value
221 * @param cpucnt CPU core count
222 * @return read CPU count
224 int CicoSCSysResourceMonitor::readProcStatCPU(stat_data_t* sdtp, const int cpucnt)
229 ifstream ifs(rdTgtCPU);
232 const char* tags = tag.c_str();
233 if ((sP1C == tags[0]) && (sP2P == tags[1]) && (sP3U == tags[2])) {
234 if ('\0' == tags[3]) { // "cpu"
237 else { // "cpuX" X = 0 - 9
238 if (0 != isdigit(tags[3])) {
239 int tmp_tgt = atoi(&tags[3]);
240 if ((0 <= tmp_tgt) && (tmp_tgt < cpucnt)) {
248 ifs >> sdtp[tgt].user;
249 ifs >> sdtp[tgt].nice;
250 ifs >> sdtp[tgt].system;
251 ifs >> sdtp[tgt].idle;
252 ifs >> sdtp[tgt].iowait;
253 ifs >> sdtp[tgt].irq;
254 ifs >> sdtp[tgt].softirq;
255 ifs >> sdtp[tgt].steal;
256 ifs >> sdtp[tgt].guest;
257 ifs >> sdtp[tgt].guest_nice;
264 break; // break of while
268 if (g_RC_LOG) ICO_TRA("ret(%d)", r);
273 * @brief CPU usage calc
274 * @param old previous value
275 * @param current value of this time
276 * @param calc distnation calculated value
277 * @return true:calc success false:calc fail
279 bool CicoSCSysResourceMonitor::usageCalcCPU(const stat_data_t& old,
280 const stat_data_t& current,
283 if (g_RC_LOG) ICO_TRA("start");
285 double duser = current.user - old.user;
287 double dnice = current.nice - old.nice;
289 double dsystem = current.system - old.system;
291 double didle = current.idle - old.idle;
293 double diowait = current.iowait - old.iowait;
295 double dirq = current.irq - old.irq;
297 double dsoftirq = current.softirq - old.softirq;
299 double dsteal = current.steal - old.steal;
301 double dguest = current.guest - old.guest;
303 double dguest_nice = current.guest_nice - old.guest_nice;
305 if (0 == ttl) { // must not be divided by ZERO
306 if (g_RC_LOG) ICO_TRA("end divide zero!?");
309 calc.user = (int)(duser / ttl * dCarryUp);
310 calc.nice = (int)(dnice / ttl * dCarryUp);
311 calc.system = (int)(dsystem / ttl * dCarryUp);
312 calc.idle = (int)(didle / ttl * dCarryUp);
313 calc.iowait = (int)(diowait / ttl * dCarryUp);
314 calc.irq = (int)(dirq / ttl * dCarryUp);
315 calc.softirq = (int)(dsoftirq / ttl * dCarryUp);
316 calc.steal = (int)(dsteal / ttl * dCarryUp);
317 calc.guest = (int)(dguest / ttl * dCarryUp);
318 calc.guest_nice = (int)(dguest_nice / ttl * dCarryUp);
319 if (g_RC_LOG) ICO_TRA("end");
324 * @brief get resource free memory
326 void CicoSCSysResourceMonitor::getResourceMEM()
328 if (g_RC_LOG) ICO_TRA("start");
329 if (0 >= m_totalMem) {
330 readProcMeminfo(true);
335 if (g_RC_LOG) ICO_TRA("end");
339 * @brief read /proc/meminfo
340 * @param ttlMem total memory read flag
342 void CicoSCSysResourceMonitor::readProcMeminfo(bool ttlMem)
345 if (g_RC_LOG) ICO_TRA("start %s", ttlMem? "true": "false");
347 ifstream ifs(rdTgtMEM);
349 bool tgt2 = ttlMem; // total memory get flag set
351 if (true == tgt2) { // flag on
352 if (rdMEMTag2 == tag) { // is total memory tag?
353 ifs >> m_totalMem; // total memory size get
354 tgt2 = false; // flag off
357 if (rdMEMTag1 == tag) { // is free memory tag
358 ifs >> m_freeMem; // get free memory size
359 tgt1 = true; // get flag on
361 if ((true == tgt1) && (false == tgt2)) {
362 break; // break of while
366 if (0 != m_totalMem) {
368 m_usageFreeMem = (int)
369 (((double)m_freeMem / (double)m_totalMem) * 10000);
375 if (g_RC_LOG) ICO_TRA("end usage free mem st.(%d)", m_usageFreeMem);